import os
import os
import sys
import time
import traceback

import django
import openpyxl
import pytz
from decouple import config
from django.db import close_old_connections
from django.db.models import Q
from django.utils import timezone

sys.path.append('..')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'futplus.settings')
django.setup()

from sbc.public_methods import new_print, set_sbc_status
from accounts.models import Console, NewConsoleAccount, FifaAccount
from sbc.models import SBCWorker
from sbc.sbc_solver import SBCSolver

local_tz = pytz.timezone('Asia/Tehran')


class AddNewAccountConsole():
    exists_accounts = []

    def add_accounts_from_file(self):
        # example :
        # console	gamertag	email	email_pass	backupmail	pass	imap
        # 2026	f series	JuliusNaomi1046@outlook.com	p;y4U1U:	ukposhtiban@futpluss.com	QW12qw12@65	mail.futpluss.com
        print('add accounts for console from file to database')
        wb_obj = openpyxl.load_workbook('add_new_account_to_console.xlsx')
        sheet_obj = wb_obj.active
        max_row = sheet_obj.max_row
        console_names = set(sheet_obj.cell(row=i, column=1).value for i in range(2, max_row + 1))

        consoles = {c.name: c for c in Console.objects.filter(name__in=console_names)}
        new_accounts = []

        for row_item in range(2, max_row + 1):
            console_name = sheet_obj.cell(row=row_item, column=1).value
            user_name = sheet_obj.cell(row=row_item, column=3).value

            console = consoles.get(console_name)
            if not console:
                print(f"Console '{console_name}' not found! Skipping row {row_item}.")
                continue

            if NewConsoleAccount.objects.filter(user_name=user_name, console=console).exists():
                print(f"Account already exists: {user_name}")
                continue

            new_accounts.append(
                NewConsoleAccount(
                    user_name=user_name,
                    password=sheet_obj.cell(row=row_item, column=4).value,
                    support_email=sheet_obj.cell(row=row_item, column=5).value,
                    support_password=sheet_obj.cell(row=row_item, column=6).value,
                    support_imap_host=sheet_obj.cell(row=row_item, column=7).value,
                    gamer_tag=sheet_obj.cell(row=row_item, column=2).value,
                    console=console,
                )
            )

        if new_accounts:
            NewConsoleAccount.objects.bulk_create(new_accounts)

        print(f"{len(new_accounts)} accounts added successfully.")

    def remove_accounts_from_file(self):
        # example :
        # email
        # JuliusNaomi1046@outlook.com
        print('remove accounts from database with file')
        wb_obj = openpyxl.load_workbook('add_new_account_to_console.xlsx')
        sheet_obj = wb_obj.active
        max_row = sheet_obj.max_row
        delete_queries = []

        for row_item in range(2, max_row + 1):
            user_name = sheet_obj.cell(row=row_item, column=1).value
            console_name = sheet_obj.cell(row=row_item, column=2).value

            query = NewConsoleAccount.objects.filter(user_name=user_name)
            if console_name:
                query = query.filter(console__name=console_name)

            delete_queries.append(query)
            
        if delete_queries:
            combined_query = Q()
            for query in delete_queries:
                combined_query |= Q(id__in=query.values_list('id', flat=True))

            NewConsoleAccount.objects.filter(combined_query).delete()


    def core(self, keep_alive=True):
        console_name = config('CONSOLE_NAME', default=None)
        console_object = Console.objects.filter(name=console_name).first()
        if not console_object:
            print('no console name found in .env')
            input('please enter')
            exit(1)
        fifa_account = FifaAccount.objects.filter(console=console_object).first()
        if not fifa_account:
            print('add one account for this console in system , log in : ', fifa_account)
            input('please enter')
            exit(1)
        sbc_worker, created = SBCWorker.objects.get_or_create(
            is_done=False, has_error=False, running_platform='console_manage_accounts',
            fifa_account=fifa_account, manual_loyal=False)
        sbc_worker.must_done = False
        sbc_worker.save()
        new_print(fifa_account, 'Add Account Bot Started')
        sbc_solver = SBCSolver(sbc_worker.id, fifa_account.id, fifa_account.user_name, fifa_account.password,
                               fifa_account.platform, False)
        set_sbc_status(sbc_worker, 'Adding Accounts')
        public_moves = sbc_solver.public_moves
        public_moves.set_account_suspend = False
        for iie in range(2):
            accounts_need_to_add = list(NewConsoleAccount.objects.filter(
                Q(add_status=None) | Q(add_status='failed') | Q(add_status='unknown') |
                Q(add_status='after_password_failed'),
                console=console_object, create_time__gte=timezone.localtime() - timezone.timedelta(days=10)))
            print('this accounts need to add : ', accounts_need_to_add)
            new_print(fifa_account, 'this accounts need to add : ', accounts_need_to_add)
            for item in accounts_need_to_add:
                for iiie in range(5):
                    current_stat = public_moves.just_find_state()
                    if current_stat == 'ps4_main':
                        break
                    else:
                        print('go to home first 3')
                        public_moves.ps4_buttons.ps()
                        time.sleep(5)
                        public_moves.ps4_buttons.cross()
                        time.sleep(2)
                item.add_start_time = timezone.localtime()
                try:
                    public_moves.xboxs_go_to_app()
                    time.sleep(5)
                    sbc_solver.public_moves.go_to_state('ps4_main', 'ps4_main')
                    time.sleep(5)
                    new_print(fifa_account, 'start add account , email ', item.user_name,
                              ' add status ', item.add_status)
                    add_status = public_moves.console_accounts_utils.xboxs_add_new_user(
                        email=item.user_name, password=item.password, gamer_tag=item.gamer_tag,
                        support_email=item.support_email, support_password=item.support_password,
                        support_imap_host=item.support_imap_host
                    )
                    close_old_connections()
                    if add_status == 'exists' and item in self.exists_accounts:
                        new_print(fifa_account, 'already exists but two try , so make it success , ', item,
                                  ' -- ', item.user_name)
                        item.add_status = 'success'
                    if add_status in ['success', 'exists', 'locked', 'after_password_failed',
                                      'gamertag_problem', 'need_more_space', 'suspend']:
                        item.add_status = add_status
                    else:
                        item.add_status = 'unknown'
                    print(f'Congrat . account {item.user_name} create success')
                    wait_seconds = 10
                except Exception as e:
                    # if str(e) == 'account locked':
                    #     item.add_status = 'locked'
                    #     wait_seconds = 10
                    # else:
                    print(f'account {item.user_name} creation failed , sleep 100 sec')
                    wait_seconds = 100
                    close_old_connections()
                    item.refresh_from_db()
                    item.add_status = 'failed'
                    item.add_error = str(e) + ' \n trace : \n ' + str(traceback.format_exc())
                item.save(update_fields=['add_status', 'add_error', 'add_start_time'])
                time.sleep(wait_seconds)
        sbc_worker.refresh_from_db()
        sbc_worker.is_done = True
        sbc_worker.save()
        set_sbc_status(sbc_worker, 'Add Accounts Done.')
        if keep_alive:
            # bellow added as mehdi want
            while True:
                print('pressing left and right to keep console alive after add accounts.')
                public_moves.ps4_buttons.right()
                time.sleep(1)
                public_moves.ps4_buttons.left()
                time.sleep(100)

if __name__ == '__main__':
    input_number = input('want to add : 1 , want to remove : 2 ? : ')
    if input_number == '1':
        AddNewAccountConsole().add_accounts_from_file()
    elif input_number == '2':
        AddNewAccountConsole().remove_accounts_from_file()
    else:
        print('invalid input')
