import os
import subprocess
import sys
import threading
import time
import traceback

import git
import requests
from decouple import Config, RepositoryEnv

DOTENV_FILE = 'futplus/.env'
env_config = Config(RepositoryEnv(DOTENV_FILE))


def process_exists(process_name):
    call = 'TASKLIST', '/FI', 'imagename eq %s' % process_name, '/FI', "USERNAME eq %username%"
    output = subprocess.check_output(call, shell=True).decode()
    last_line = output.strip().split('\r\n')[-1]
    return last_line.lower().startswith(process_name.lower())


if getattr(sys, 'frozen', False):
    BASE_DIR = os.path.dirname(sys.executable)
else:
    BASE_DIR = os.path.dirname(os.path.realpath(__file__))

# run_console_squad_manager is copy of run_console_sbc_manager
def run_console_squad_manager():
    base_dir_file = open(os.path.join(BASE_DIR, 'path.txt'), 'r')
    base_dir = base_dir_file.read()
    order = '"C:\Windows\explorer.exe" ' + os.path.join(base_dir, 'run_program.cmd')
    print(order)
    os.system(order)


try:
    open(os.path.join(BASE_DIR, 'path.txt'), 'r')
    raise Exception('make it every time')
except:
    print('need to create path.txt')
    temp_base_dir = open(os.path.join(BASE_DIR, 'path.txt'), 'w')
    temp_base_dir.write(str(BASE_DIR))
    temp_base_dir.close()


has_error = False


def kill_gamepad_program():
    try:
        os.system('TASKKILL /F /IM uniq_xbox_gamepad.exe /FI "USERNAME eq %username%"')
        time.sleep(1)
    except:
        print('no active gamepad program found ...')


def kill_python_program():
    try:
        os.system('TASKKILL /F /IM python.exe /FI "USERNAME eq %username%"')
        time.sleep(1)
        # os.system('TASKKILL /F /IM run_gamepad_manager.exe')
        os.system('TASKKILL /F /IM run_console_manager.exe /FI "USERNAME eq %username%"')
        os.system('TASKKILL /F /IM run_console_manager.exe /FI "USERNAME eq %username%"')
        os.system('TASKKILL /F /IM run_console_manager.exe /FI "USERNAME eq %username%"')
        os.system('TASKKILL /F /IM console_squad_manager.exe /FI "USERNAME eq %username%"')
        os.system('TASKKILL /F /IM console_squad_manager.exe /FI "USERNAME eq %username%"')
        os.system('TASKKILL /F /IM console_squad_manager.exe /FI "USERNAME eq %username%"')
    except:
        print('no active python program found ...')


def uniq_xbox_gamepad_starter():
    starter_text = '''
    start %s\\uniq_xbox_gamepad.exe''' % BASE_DIR
    os.system(starter_text)


if __name__ == '__main__':
    while True:
        try:
            try:
                main_site_address = env_config('MAIN_SITE_ADDRESS', default='http://142.132.177.244:8000')
                program_version = requests.get(f'{main_site_address}/accounts/get-last-version/').json()
            except:
                print('can`t get version : ', traceback.format_exc())
                time.sleep(120)
                continue

            if has_error:
                has_error = False
                kill_python_program()
                time.sleep(2)

            try:
                current_version = open('version.txt', 'r')
            except:
                default_version = open('version.txt', 'w')
                default_version.write('0')
                default_version.close()
                current_version = open('version.txt', 'r')
            current_version = current_version.read()
            if str(program_version.get('number')) != str(current_version):
                # if False:
                print('need to update program')
                if (program_version.get('need_to_close_python_program') or
                        program_version.get('need_to_put_on_rest_mode')):
                    print('need to kill python program')
                    kill_python_program()
                    time.sleep(2)

                    # put_on_rest_mode_by_mother()
                if program_version.get('need_to_reset_gamepad'):
                    print('need to kill xbox gamepad')
                    threading.Thread(target=kill_gamepad_program).start()

                print('pulling from git ...')
                base_dir_file = open(os.path.join(BASE_DIR, 'path.txt'), 'r')
                base_dir = base_dir_file.read()
                g = git.cmd.Git(base_dir)
                res = g.pull()
                time.sleep(2)
                print('installing requirements ...')
                os.system('python -m pip install -r %s/requirements.txt' % base_dir)
                os.system('python -m pip install -r %s/windows_requirements.txt' % base_dir)

                print('updating the version ...')
                new_version = open('version.txt', 'w')
                new_version.write(str(program_version.get('number')))
                new_version.close()
                print('version is updated now')
            base_dir_file = open('path.txt', 'r')
            base_dir = base_dir_file.read()
            order = 'python ' + os.path.join(base_dir, 'startup_methods_4.py')
            print(order)
            os.system(order)

        except:
            print(traceback.format_exc())
            has_error = True

        time.sleep(120)

    # add path.txt , run_program.cmd
    # add python -m pip install requirements.txt

# todo : for convert this file to .exe enter bellow in terminal
# ViGEmClient.dll is for windows 64 bit
# python -m PyInstaller --onefile --icon=utils\\greate_manager.ico .\console_greate_manager.py
