#!/usr/bin/python3

import animation
import git
import os
import random
import signal
import sys
import time
import sisyphus.checkenv
import sisyphus.getclr
import sisyphus.getfs
import sisyphus.purgeenv
import sisyphus.setjobs
import sisyphus.setmirror
import sisyphus.setprofile


brch_rmt_map = {
    "master": {
        "github": sisyphus.getfs.rmt_gh_addr,
        "gitlab": sisyphus.getfs.rmt_gl_addr,
        "pagure": sisyphus.getfs.rmt_pg_addr
    },
    "next": {
        "github": sisyphus.getfs.rmt_gh_addr,
        "gitlab": sisyphus.getfs.rmt_gl_addr,
        "pagure": sisyphus.getfs.rmt_pg_addr
    }
}


def sigint_handler(signal, frame):
    sys.exit(0)


signal.signal(signal.SIGINT, sigint_handler)


def get_brch_rmt(branch, remote):
    g_rmt = []
    r_rmt = []
    p_cfg_rmt = []

    if branch in brch_rmt_map and remote in brch_rmt_map[branch]:
        remote = brch_rmt_map[branch][remote]
    else:
        # set a default remote here if needed
        pass

    g_rmt = [remote, sisyphus.getfs.g_repo]
    r_rmt = [remote, sisyphus.getfs.r_repo]
    p_cfg_rmt = [remote, sisyphus.getfs.p_cfg_repo]

    return g_rmt, r_rmt, p_cfg_rmt


@animation.wait('injecting Gentoo Linux portage tree')
def ins_g_repo(branch, remote, gfx_ui=False):
    g_rmt, r_rmt, p_cfg_rmt = get_brch_rmt(branch, remote)

    if gfx_ui:
        print("\ninjecting Gentoo Linux portage tree", flush=True)
    else:
        pass

    if not os.path.isdir(os.path.join(sisyphus.getfs.g_src_dir, '.git')):
        git.Repo.clone_from(
            "/".join(g_rmt), sisyphus.getfs.g_src_dir, depth=1, branch=branch)

    if gfx_ui:
        print("\r" + " " * len("injecting Gentoo Linux portage tree") +
              "\r", end='', flush=True)
    else:
        pass


@animation.wait('injecting Redcore Linux ebuild overlay')
def ins_r_repo(branch, remote, gfx_ui=False):
    g_rmt, r_rmt, p_cfg_rmt = get_brch_rmt(branch, remote)

    if gfx_ui:
        print("\ninjecting Rentoo Linux ebuild overlay", flush=True)
    else:
        pass

    if not os.path.isdir(os.path.join(sisyphus.getfs.r_src_dir, '.git')):
        git.Repo.clone_from(
            "/".join(r_rmt), sisyphus.getfs.r_src_dir, depth=1, branch=branch)

    if gfx_ui:
        print("\r" + " " * len("injecting Redcore Linux ebuild overlay") +
              "\r", end='', flush=True)
    else:
        pass


@animation.wait('injecting Redcore Linux portage config')
def ins_p_cfg_repo(branch, remote, gfx_ui=False):
    g_rmt, r_rmt, p_cfg_rmt = get_brch_rmt(branch, remote)

    if gfx_ui:
        print("\ninjecting Redcore Linux portage config", flush=True)
    else:
        pass

    if not os.path.isdir(os.path.join(sisyphus.getfs.p_cfg_dir, '.git')):
        git.Repo.clone_from("/".join(p_cfg_rmt),
                            sisyphus.getfs.p_cfg_dir, depth=1, branch=branch)

    if gfx_ui:
        print("\r" + " " * len("injecting Redcore Linux portage config") +
              "\r", end='', flush=True)
    else:
        pass


def set_brch_master_index():
    mirrorList = sisyphus.setmirror.getList()
    odd_indices = [i + 1 for i in range(len(mirrorList)) if (i + 1) % 2 == 1]
    chosen_index = random.choice(odd_indices)
    sisyphus.setmirror.setActive(chosen_index)


def set_brch_next_index():
    mirrorList = sisyphus.setmirror.getList()
    even_indices = [i + 1 for i in range(len(mirrorList)) if (i + 1) % 2 == 0]
    chosen_index = random.choice(even_indices)
    sisyphus.setmirror.setActive(chosen_index)


def set_bhst_index(branch, remote, gfx_ui=False):
    if gfx_ui:
        print(f"\nThe active branch has been switched to '{branch}'")
        print(f"\nThe active remote has been switched to '{remote}'")
    else:
        print(f"{sisyphus.getclr.green}\nThe active branch has been switched to '{branch}'{sisyphus.getclr.reset}")
        print(f"{sisyphus.getclr.green}\nThe active remote has been switched to '{remote}'{sisyphus.getclr.reset}")

    if "master" in branch:
        set_brch_master_index()
    elif "next" in branch:
        set_brch_next_index()


def start(branch, remote, gfx_ui=False):
    is_online = sisyphus.checkenv.connectivity()

    if is_online != 1:
        if gfx_ui:
            print("\nNo internet connection detected. Aborting!\n")
            for i in range(9, 0, -1):
                print(f"Killing application in : {i} seconds!")
                time.sleep(1)

            os.kill(os.getpid(), signal.SIGTERM)  # kill GUI window
        else:
            print(
                f"{sisyphus.getclr.bright_red}\nNo internet connection detected; Aborting!\n{sisyphus.getclr.reset}")
            sys.exit()
    else:
        if gfx_ui:
            sisyphus.purgeenv.branch.__wrapped__()
            sisyphus.purgeenv.metadata.__wrapped__()
            ins_g_repo.__wrapped__(branch, remote, gfx_ui=True)
            ins_r_repo.__wrapped__(branch, remote, gfx_ui=True)
            ins_p_cfg_repo.__wrapped__(branch, remote, gfx_ui=True)
            set_bhst_index(branch, remote, gfx_ui=True)
            sisyphus.setprofile.start.__wrapped__()
            sisyphus.setjobs.start()
        else:
            sisyphus.purgeenv.branch()
            sisyphus.purgeenv.metadata()
            ins_g_repo(branch, remote, gfx_ui=False)
            ins_r_repo(branch, remote, gfx_ui=False)
            ins_p_cfg_repo(branch, remote, gfx_ui=False)
            set_bhst_index(branch, remote, gfx_ui=False)
            sisyphus.setprofile.start()
            sisyphus.setjobs.start()