import datetime
import os
import random
import re
import sys
import time
import traceback

import django
import keyboard
import openpyxl
import pyotp
import pytz
import requests
from decouple import config
from django.db import close_old_connections
from django.db.models import Subquery, OuterRef, Count, IntegerField, Value
from django.db.models.functions import Coalesce
from django.utils import timezone
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from urllib3.exceptions import MaxRetryError


if os.name == 'nt':
    import winsound

sys.path.append('..')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'futplus.settings')
django.setup()

from accounts.consts import CREATE_OUTLOOK_STATUS
from accounts.models import FifaAccount, FifaProxy, NewOutlookAccount, Console, OutlookCreateWorker, \
    OutlookCreateProcess
from sbc.login_to_ea_with_selenium import wait_for_element, get_webdriver_without_proxy, get_webdriver_with_proxy
from sbc.public_methods import get_last_email, process_exists, focus_on_ps
from utils.realy_public_methods import sys_log_save

local_tz = pytz.timezone('Asia/Tehran')


def play_confirmation_sound():
    frequencies = [2000, 2500, 3000]
    durations = [200, 200, 200]
    for frequency, duration in zip(frequencies, durations):
        winsound.Beep(frequency, duration)


def play_denied_sound():
    frequencies = [900, 700, 500]
    durations = [200, 200, 200]
    for frequency, duration in zip(frequencies, durations):
        winsound.Beep(frequency, duration)


def play_need_help_sound():
    frequencies = [2000, 1000]
    durations = [100, 500]
    for frequency, duration in zip(frequencies, durations):
        winsound.Beep(frequency, duration)


def reset_modem(user_name, password, modem_type: int, ask_question=False):
    print('restarting modem')
    # modem 4g lte d-link
    # if ask_question:
    #     if input('reset modem? y or n ') == 'y':
    #         print('modem will reset')
    #     else:
    #         return
    if modem_type == 1:
        modem_session = requests.session()
        modem_session.get('http://192.168.0.1/jsonp_locale?callback=jQuery111300782361495824837_1705411942762&_=1705411942763')
        res = modem_session.get(
            'http://192.168.0.1/adminLogin',
            params={
                'callback': 'jQuery111300782361495824837_1705411942762',
                'loginparam': '{"username":"'+str(user_name)+'","password":"'+str(password)+'"}',
                '_': '1705411942763',
            })
        try:
            search_result = re.search('"token":"(.+)"}', res.text)
            modem_token = search_result.group(1)
        except:
            try:
                modem_token = re.search('mach:(.+)', str(res.headers.get('Cookie'))).group(1)
            except:
                print('cant get modem token')
                modem_token = None
        if modem_token:
            modem_session.cookies.update({'token': modem_token})
        time.sleep(1)
        try:
            res = modem_session.get('http://192.168.0.1/jsonp_reset?callback=jQuery111300782361495824837_1705411942762&_=1705411942763')
        except:
            print('request failed')
        print('modem successfully restarted')


class CreateOutlookMail:
    last_create_status = None
    max_create_per_day = 6

    def add_accounts_from_file(self):
        # example :
        # console	gamer tag	username	pass	first	last	birth	backup	pass	imap    browser     need_proxy  create_origin   create_outlook  outlook_created     dont_check_ip
        # 105	a series	JaxxOaklee570	HGX7NbUS#	Jaxx	Oaklee	31.10.1990	trposhtiban@futpluss.com	QW12qw12@65	mail.futpluss.com   c   1   1   1   0               0

        wb_obj = openpyxl.load_workbook('add_new_outlook.xlsx')
        sheet_obj = wb_obj.active
        max_row = sheet_obj.max_row
        for row_item in range(2, max_row + 1):
            console = Console.objects.get(name=sheet_obj.cell(row=row_item, column=1).value)

            new_item, created = NewOutlookAccount.objects.get_or_create(
                user_name=sheet_obj.cell(row=row_item, column=3).value)
            if created:
                proxy_item = FifaProxy.objects.all().annotate(
                    usage_count=Coalesce(Subquery(NewOutlookAccount.objects.filter(
                        # Q(delete_console_reason=None) | Q(delete_console_reason=''),
                        proxy__id=OuterRef('pk'),
                    ).values('proxy').annotate(
                        use_count=Count('id')
                    ).values('use_count'), output_field=IntegerField()), Value(0))
                ).order_by('usage_count').first()
                new_item.password = sheet_obj.cell(row=row_item, column=4).value
                new_item.first_name = sheet_obj.cell(row=row_item, column=5).value
                new_item.last_name = sheet_obj.cell(row=row_item, column=6).value
                new_item.support_email = sheet_obj.cell(row=row_item, column=8).value or ''
                new_item.support_password = sheet_obj.cell(row=row_item, column=9).value or ''
                new_item.support_imap_host = sheet_obj.cell(row=row_item, column=10).value or ''
                if sheet_obj.cell(row=row_item, column=11).value == 'c':
                    new_item.browser = 'chrome'
                elif sheet_obj.cell(row=row_item, column=11).value == 'f':
                    new_item.browser = 'firefox'
                elif sheet_obj.cell(row=row_item, column=11).value == 'o':
                    new_item.browser = 'opera'
                elif sheet_obj.cell(row=row_item, column=11).value == 'e':
                    new_item.browser = 'edge'
                elif sheet_obj.cell(row=row_item, column=11).value == 'tf':
                    new_item.browser = 'tor_windows'
                new_item.gamer_tag = sheet_obj.cell(row=row_item, column=2).value
                if sheet_obj.cell(row=row_item, column=12).value:
                    new_item.proxy = proxy_item
                if sheet_obj.cell(row=row_item, column=13).value:
                    new_item.create_origin = True
                if sheet_obj.cell(row=row_item, column=14).value in [0, '0']:
                    new_item.create_outlook = False
                if sheet_obj.cell(row=row_item, column=15).value in [1, '1']:
                    new_item.outlook_created = True
                if sheet_obj.cell(row=row_item, column=16).value in [1, '1']:
                    new_item.dont_check_ip = True
                new_item.birth_date = datetime.datetime(
                    year=random.randint(1990, 2000),
                    month=random.randint(1, 12),
                    day=random.randint(1, 25)).date()
                new_item.console = console
            else:
                print('this item already exists : ', new_item.user_name)
            new_item.save()

    def core(self):
        while True:
            try:
                return self.sub_core()
            except (django.db.utils.OperationalError, ) as error:
                if 'server closed the connection unexpectedly' in str(error):
                    print('connect server error : ', error, ' try again in 10 sec')
                    time.sleep(10)
                    close_old_connections()
                else:
                    print('server unnormal error ', error, ' try again in 30 sec')
                    time.sleep(10)
                    close_old_connections()

    def sub_core(self):
        console_name = config('CONSOLE_NAME', default=None)
        if not console_name:
            print('no console name found in .env')
            return 'no console name found'
        console_object = Console.objects.get(name=console_name)
        accounts_need_create = list(NewOutlookAccount.objects.filter(signup_status=None, console=console_object).order_by('id'))
        if len(accounts_need_create) <= 0:
            print('no account need to create on this console')
            input('press any key to close ...')
            return 'no account need to create on this console'
        started_in_24_hour = NewOutlookAccount.objects.exclude(
            signup_status=None
        ).filter(
            start_signup_time__gt=timezone.localtime() - timezone.timedelta(hours=24),
            console=console_object
        ).order_by('id')
        started_count = started_in_24_hour.count()
        print(f'{started_count} account created in this console on 24 hour')
        if started_count >= self.max_create_per_day:
            print('this console goes on maximum limit per day , change it')
            input('press any key to close ...')
            return 'max limit per day'
        # accounts_need_create = list(NewOutlookAccount.objects.filter(signup_status=None))
        # last_used_ips = NewOutlookAccount.objects.filter(
        #     start_signup_time__gt=timezone.localtime() - timezone.timedelta(days=30)
        # ).values_list('create_ip', flat=True)
        print('this accounts need to create : ', accounts_need_create[:self.max_create_per_day - started_count])
        accounts_need_create = accounts_need_create[:self.max_create_per_day - started_count]
        # get_ip_request = requests.get('https://icanhazip.com/')
        get_ip_request = requests.get('https://arzbazi.com/accounts/get-local-timezone/')
        if get_ip_request.status_code == 200:
            print('current ip : ', get_ip_request.text)
        else:
            print('can not connect to icanhazip.com')
            return
        # current_ip = str(get_ip_request.text).strip()
        current_ip = get_ip_request.json().get('request_ip')
        last_used_ips_2 = []
        while True:
            if len(accounts_need_create) < 1:
                print('no account left')
                input('press any key to close ...')
                return 'no account need to create on this console'
            item_1 = accounts_need_create[0]
            item_1.refresh_from_db()
            if item_1.signup_status:
                sys_log_save(f'create_outlook_{item_1.id}', 'item has signup status , change it.')
                print(f'{item_1.user_name} has signup status : {item_1.signup_status} , change it.')
                del accounts_need_create[0]
                continue
            sys_log_save(f'create_outlook_{item_1.id}', 'Creation started ', '##'*50)
            OutlookCreateWorker.objects.exclude(
                outlook_account=item_1
            ).filter(
                outlook_account__console=console_object, is_done=False, has_error=False
            ).update(has_error=True, error_description='imperfect creation')
            if item_1.dont_check_ip:
                last_used_ips = []
            else:
                last_used_ips = NewOutlookAccount.objects.exclude(
                    id=item_1.id
                ).filter(
                    start_signup_time__gt=timezone.localtime() - timezone.timedelta(days=30)
                ).values_list('create_ip', flat=True)
            for iit in range(10):
                try:
                    sys_log_save(f'create_outlook_{item_1.id}', 'get link : ', 'https://arzbazi.com/accounts/get-local-timezone/')
                    get_ip_request = requests.get('https://arzbazi.com/accounts/get-local-timezone/', timeout=10)
                    if get_ip_request.status_code == 200:
                        sys_log_save(f'create_outlook_{item_1.id}', 'current ip : ', get_ip_request.text)
                    else:
                        sys_log_save(f'create_outlook_{item_1.id}', 'can not connect to icanhazip.com')
                        return
                    # current_ip = str(get_ip_request.text).strip()
                    current_ip = get_ip_request.json().get('request_ip')
                    break
                except:
                    sys_log_save(f'create_outlook_{item_1.id}', 'cant get new ip , save old ip , try again : ',
                                 iit, ', error : ', traceback.format_exc())
                    time.sleep(10)
            item_1.refresh_from_db()
            last_worker = OutlookCreateWorker.objects.filter(
                outlook_account=item_1, is_done=False, has_error=False
            ).last()
            if last_worker:
                self.worker = last_worker
            else:
                self.worker = OutlookCreateWorker.objects.create(outlook_account=item_1)
            if item_1.proxy is None and current_ip in list(last_used_ips) + last_used_ips_2 and (not item_1.browser == 'tor_windows'):
                sys_log_save(f'create_outlook_{item_1.id}', f'current ip {current_ip} is used in some creation , change it.!')
                sys_log_save(f'create_outlook_{item_1.id}', NewOutlookAccount.objects.filter(create_ip=current_ip, proxy=None))
                self.update_worker_status(f'current ip {current_ip} is used in some creation , change it.!', update_time=False)
                time.sleep(30)
                self.worker.refresh_from_db()
                self.worker.has_error = True
                self.worker.error_description = f'current ip {current_ip} is used in some creation , change it.!'
                self.worker.save()
                play_denied_sound()
                close_old_connections()
                reset_modem('admin', 'admin', modem_type=1)
                time.sleep(10)
                continue
            elif item_1.browser == 'tor_windows':
                sys_log_save(f'create_outlook_{item_1.id}', 'hmm. using firefox-tor on windows')
            wait_seconds = 0
            self.update_worker_status('starting ...', update_time=False)
            item_1.start_signup_time = timezone.localtime()
            item_1.save()
            process_0, created = OutlookCreateProcess.objects.get_or_create(
                outlook_account=item_1, status='start create')
            try:
                print(f'creation start. log in {item_1.user_name}')
                self.last_create_status = item_1.last_create_status
                create_status = self.create_account_func(
                    item_object=item_1, browser=item_1.browser
                )
                sys_log_save(f'create_outlook_{item_1.id}', f'create acount')
                close_old_connections()
                item_1.refresh_from_db()
                if create_status.get('status') == 'success':
                    item_1.signup_status = 'success'
                    item_1.create_ip = str(current_ip)
                    item_1.last_create_status = self.last_create_status
                    item_1.save()
                    sys_log_save(f'create_outlook_{item_1.id}', f'Congrat . account {item_1.user_name} create success',
                                 'need reset modem')
                    # print(f'Congrat . account {item_1.user_name} create success')
                    play_confirmation_sound()
                    wait_seconds = 30
                    self.update_worker_status('Congrat . account create success')
                    process_0.refresh_from_db()
                    process_0.is_done = True
                    process_0.save()
                else:
                    if create_status.get('error') in ['outlook name already exists', 'outlook account locked']:
                        item_1.signup_status = 'failed'
                        item_1.error = create_status.get('error')
                        item_1.save()
                    else:
                        item_1.signup_status = 'failed'
                        item_1.error = create_status.get('error')
                        item_1.save()
                        sys_log_save(f'create_outlook_{item_1.id}', 'create account has error : ', create_status)
                # self.update_worker_status('need reset modem', update_time=False)
                time.sleep(wait_seconds)
                self.worker.refresh_from_db()
                self.worker.end_time = timezone.localtime()
                self.worker.is_done = True
                self.worker.save()
                close_old_connections()
                item_1.refresh_from_db()
                if item_1.dont_check_ip:
                    print('no need reset modem 1')
                else:
                    reset_modem('admin', 'admin', modem_type=1)
                del accounts_need_create[0]
            except Exception as error_2:
                close_old_connections()
                sys_log_save(f'create_outlook_{item_1.id}',
                             f'account {item_1.user_name} creation failed , sleep 20 sec , try again, error : ',
                             error_2, ' full trace : ', traceback.format_exc())
                print('creation faild , try again in 20 sec , error : ', error_2)
                time.sleep(20)
                # item_1.refresh_from_db()
                # item_1.signup_status = 'failed'
                # item_1.last_create_status = self.last_create_status
                # item_1.signup_error = str(traceback.format_exc())
                # item_1.create_ip = str(current_ip)
                # item_1.save()
                # sys_log_save(f'create_outlook_{item_1.id}', f'account {item_1.user_name} creation failed , sleep 100 sec')
                # # print(f'account {item_1.user_name} creation failed , sleep 100 sec')
                # play_denied_sound()
                # wait_seconds = 30
                # self.update_worker_status('creation failed')
                # self.update_worker_status('need reset modem')
                # reset_modem('admin', 'admin', modem_type=1, ask_question=True)
                # time.sleep(wait_seconds)
                # close_old_connections()
                # self.worker.refresh_from_db()
                # self.worker.has_error = True
                # self.worker.error_description = str(traceback.format_exc())
                # self.worker.save()
            os.system(f'TASKKILL /F /IM {item_1.browser}.exe /FI "USERNAME eq %username%"')
            # if item_1.proxy is None:
            #     break

    def get_driver(self, proxy, fifa_account, browser, open_outlook):
        sys_log_save(f'create_outlook_{self.item_object.id}', 'get driver')
        if proxy:
            chrome_driver = get_webdriver_with_proxy(
                email=fifa_account.user_name,
                proxy_ip=proxy.ip_address, proxy_port=proxy.port,
                proxy_user=proxy.user_name, proxy_pass=proxy.password, browser=browser)
            if open_outlook:
                time.sleep(5)
                local_driver = get_webdriver_without_proxy(email=fifa_account.user_name, browser='chrome')
            else:
                local_driver = None
        else:
            chrome_driver = get_webdriver_without_proxy(email=fifa_account.user_name, browser=browser)
            if open_outlook:
                time.sleep(5)
                local_driver = get_webdriver_without_proxy(email=fifa_account.user_name, browser='chrome')
            else:
                local_driver = None
            if process_exists('XboxPcApp.exe'):
                focus_on_ps(fifa_account)
                sys_log_save(f'create_outlook_{self.item_object.id}', 'after focus on ps')
        return {'chrome_driver': chrome_driver, 'local_driver': local_driver}

    def create_account_func(self, item_object: NewOutlookAccount, browser='chrome'):
        sys_log_save(f'create_outlook_{item_object.id}', 'create account func')
        self.item_object = item_object
        fifa_account = FifaAccount.objects.filter(platform='xboxs').first()
        # chrome_driver = get_webdriver_without_proxy(email=fifa_account.user_name, browser='firefox')
        if browser == 'tor_windows':
            get_driver_result = self.get_driver(proxy=item_object.proxy, fifa_account=fifa_account,
                                                browser=browser, open_outlook=True)
            chrome_driver = get_driver_result.get('chrome_driver')
            local_driver = get_driver_result.get('local_driver')
        else:
            self.update_worker_status('opening browser', update_time=False)
            get_driver_result = self.get_driver(proxy=item_object.proxy, fifa_account=fifa_account,
                                                browser=browser, open_outlook=False)
            chrome_driver = get_driver_result.get('chrome_driver')
            local_driver = None
        if browser == 'tor_windows':
            chrome_driver.maximize_window()
            # todo : delete abow and uncomment bellow if want create multiple account in day. uncomment bellow to make console active and dont go to sleep mode
            # chrome_driver.set_window_size(1900, 1000)
            # time.sleep(3)
            # chrome_driver.minimize_window()
            # time.sleep(3)
            # if process_exists('XboxPcApp.exe'):
            #     focus_on_ps(fifa_account)
            #     time.sleep(1)
        else:
            chrome_driver.maximize_window()
            time.sleep(2)
        # if proxy:
        #     chrome_driver = get_webdriver_with_proxy(
        #         email=fifa_account.user_name,
        #         proxy_ip=proxy.ip_address, proxy_port=proxy.port,
        #         proxy_user=proxy.user_name, proxy_pass=proxy.password, browser=browser)
        #     if open_outlook:
        #         local_driver = get_webdriver_without_proxy(email=fifa_account.user_name, browser='chrome')
        #     else:
        #         local_driver = None
        # else:
        #     chrome_driver = get_webdriver_without_proxy(email=fifa_account.user_name, browser=browser)
        #     if open_outlook:
        #         local_driver = get_webdriver_without_proxy(email=fifa_account.user_name, browser='chrome')
        #     else:
        #         local_driver = None
        #     if process_exists('XboxPcApp.exe'):
        #         focus_on_ps(fifa_account)
        #         print('after focus on ps')
        time.sleep(5)
        item_object.refresh_from_db()
        user_name_email = item_object.user_name + '@outlook.com'
        process_1, proc_created_1 = OutlookCreateProcess.objects.get_or_create(outlook_account=item_object, status='create_outlook')
        # if item_object.create_outlook and not item_object.outlook_created:
        if item_object.create_outlook and process_1.is_done is False:
            sys_log_save(f'create_outlook_{item_object.id}',
                         'need to create outlook ')
            self.update_worker_status('need to create outlook', update_time=False)
            # chrome_driver.get('https://signup.live.com/')
            # chrome_driver.get('https://signup.live.com/signup?client_id=1f907974-e22b-4810-a9de-d9647380c97e&contextid=8589E1EB6DB66ACB&opid=1DB45BCDB83B13DF&bk=1718888486&sru=https://login.live.com/oauth20_authorize.srf%3fclient_id%3d1f907974-e22b-4810-a9de-d9647380c97e%26client_id%3d1f907974-e22b-4810-a9de-d9647380c97e%26contextid%3d8589E1EB6DB66ACB%26opid%3d1DB45BCDB83B13DF%26mkt%3dEN-US%26lc%3d1033%26bk%3d1718888486%26uaid%3d2c75d80ccce1426a9fed8493d21e86ed&uiflavor=web&lic=1&mkt=EN-US&lc=1033&uaid=2c75d80ccce1426a9fed8493d21e86ed')
            sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                         'https://signup.live.com/signup')
            chrome_driver.get('https://signup.live.com/signup')
            time.sleep(2)
            # add user name
            # member_name_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="MemberName"]')
            member_name_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="usernameInput"]')
            for char in user_name_email:
                member_name_input.send_keys(char)
                time.sleep(.2)
            # chrome_driver.find_element(by=By.XPATH, value='//*[@id="iSignupAction"]').click()
            chrome_driver.find_element(by=By.XPATH, value='//*[@id="nextButton"]').click()
            time.sleep(5)
            try:
                chrome_driver.find_element(by=By.XPATH, value='//*[@id="MemberNameError"]')
                sys_log_save(f'create_outlook_{item_object.id}', 'try another name')
                # print('try another name')
                return {'status_bool': False, 'status': 'failed', 'error': 'outlook name already exists'}
            except:
                pass
            # add password
            # wait_for_element('xpath', 'one', '//*[@id="PasswordInput"]', driver=chrome_driver)
            wait_for_element('xpath', 'one', '//*[@id="Password"]', driver=chrome_driver)
            time.sleep(2)
            # password_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="PasswordInput"]')
            password_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="Password"]')
            time.sleep(5)
            for char in item_object.password:
                password_input.send_keys(char)
                time.sleep(.2)
            # chrome_driver.find_element(by=By.XPATH, value='//*[@id="iSignupAction"]').click()
            chrome_driver.find_element(by=By.XPATH, value='//*[@id="nextButton"]').click()
            time.sleep(10)
            # add first name and last name
            # first_name_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="FirstName"]')
            first_name_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="firstNameInput"]')
            for char in item_object.first_name:
                first_name_input.send_keys(char)
                time.sleep(.2)
            # last_name_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="LastName"]')
            last_name_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="lastNameInput"]')
            for char in item_object.last_name:
                last_name_input.send_keys(char)
                time.sleep(.2)
            # chrome_driver.find_element(by=By.XPATH, value='//*[@id="iSignupAction"]').click()
            chrome_driver.find_element(by=By.XPATH, value='//*[@id="nextButton"]').click()
            sys_log_save(f'create_outlook_{item_object.id}',
                         'email sign up , first name and last name selected', timezone.localtime())
            # print('email sign up , first name and last name selected', timezone.localtime())
            self.update_worker_status('email first name and last name selected', update_time=False)
            time.sleep(10)
            # select country and birth
            # select_country = Select(chrome_driver.find_element(by=By.XPATH, value='//*[@id="Country"]'))
            select_country = Select(chrome_driver.find_element(by=By.XPATH, value='//*[@id="countryRegionDropdown"]'))
            select_country.select_by_value('UK')
            time.sleep(1)
            select_birth_day = Select(
                chrome_driver.find_element(by=By.XPATH, value='//*[@id="BirthDay"]'))
            select_birth_day.select_by_value(str(item_object.birth_date.day))
            sys_log_save(f'create_outlook_{item_object.id}', 'birth date selected : ')
            time.sleep(1)
            select_birth_month = Select(
                chrome_driver.find_element(by=By.XPATH, value='//*[@id="BirthMonth"]'))
            select_birth_month.select_by_value(str(item_object.birth_date.month))
            time.sleep(1)
            birth_year_input = chrome_driver.find_element(by=By.XPATH, value='//*[@id="BirthYear"]')
            for char in str(item_object.birth_date.year):
                birth_year_input.send_keys(char)
                time.sleep(.2)
            # select_birth_year = Select(
            #     chrome_driver.find_element(by=By.XPATH, value='//*[@class="datepart2 form-control win-dropdown"]'))
            # select_birth_year.select_by_value(str(birth_date.year))
            sys_log_save(f'create_outlook_{item_object.id}', 'password intered')
            time.sleep(1)
            # chrome_driver.find_element(by=By.XPATH, value='//*[@id="iSignupAction"]').click()
            chrome_driver.find_element(by=By.XPATH, value='//*[@id="nextButton"]').click()
            self.update_worker_status('email user name and password set', update_time=False)
            self.last_create_status = 'email_user_password_set'
            time.sleep(5)
            wait_counter = 0
            sys_log_save(f'create_outlook_{item_object.id}', 'its must go to ')
            while True:
                play_need_help_sound()
                try:
                    if chrome_driver.find_element(by=By.XPATH, value="//*[contains(text(),'When you need to prove you')]"):
                        sys_log_save(f'create_outlook_{item_object.id}', 'when you need to prove found')
                        if browser == 'tor_windows':
                            time.sleep(60)
                            print('this ip is dead , auto change.')
                            chrome_driver.quit()
                            if local_driver:
                                local_driver.quit()
                            time.sleep(10)
                            close_old_connections()
                            return self.create_account_func(item_object=item_object, browser=item_object.browser)
                        else:
                            sys_log_save(f'create_outlook_{item_object.id}', 'this ip is dead , change it.')
                            # print('this ip is dead , change it.')
                            self.update_worker_status('ip is dead')
                except MaxRetryError as err:
                    raise err
                except:
                    # print('traceback 1 : ', traceback.format_exc())
                    pass
                if chrome_driver.current_url.startswith('https://signup.live.com/error.aspx?'):
                    sys_log_save(f'create_outlook_{item_object.id}', 'after solve captcha get error . try to sign in')
                    # print('after solve captcha get error . try to sign in')
                    self.update_worker_status('captcha solved')
                    item_object.refresh_from_db()
                    item_object.outlook_created = True
                    item_object.save()
                    chrome_driver.quit()
                    time.sleep(5)
                    return self.create_account_func(item_object=item_object, browser=browser)
                if chrome_driver.current_url.startswith('https://privacynotice.account.microsoft.com/'):
                    sys_log_save(f'create_outlook_{item_object.id}', 'after complete captcha. privacynotice found')
                    # print('after complete captcha')
                    self.update_worker_status('captcha solved')
                    break
                elif chrome_driver.current_url.startswith('https://login.live.com/'):
                    sys_log_save(f'create_outlook_{item_object.id}', 'after complete captcha . login live found')
                    # print('after complete captcha')
                    self.update_worker_status('captcha solved')
                    break
                else:
                    wait_counter += 1
                    # if wait_counter > 1 and wait_counter % 20 == 0:
                    if wait_counter > 1:
                        sys_log_save(f'create_outlook_{item_object.id}', 'wait to solve captcha')
                        # print('wait to solve captcha')
                        self.update_worker_status('wait to solve captcha', update_time=False)
                    time.sleep(20)
            self.update_worker_status('after captcha')
            item_object.refresh_from_db()
            item_object.outlook_created = True
            item_object.save()
            process_1.is_done = True
            process_1.save()
            for ii in range(3):
                get_elem = wait_for_element('xpath', 'one', '//button', driver=chrome_driver)
                if get_elem:
                    break
                else:
                    sys_log_save(f'create_outlook_{item_object.id}', 'can not find next. refresh page')
                    # print('can not find next. refresh page')
                    chrome_driver.refresh()
            try:
                chrome_driver.find_element(by=By.XPATH, value='//button').click()
                time.sleep(10)
            except:
                sys_log_save(f'create_outlook_{item_object.id}', 'can not find privacy page')
                # print('can not find privacy page')
            try:
                chrome_driver.find_element(by=By.XPATH, value='//button').click()
            except:
                sys_log_save(f'create_outlook_{item_object.id}', 'not find privacy page again')
                # print('not find privacy page again')
            back_btn = wait_for_element(
                'xpath', 'one', '//input[@id="idBtn_Back"]', driver=chrome_driver)
            if back_btn:
                chrome_driver.find_element(by=By.XPATH, value='//input[@id="idBtn_Back"]').click()
                time.sleep(15)

            item_object.refresh_from_db()
            process_2, proc_created_2 = OutlookCreateProcess.objects.get_or_create(
                outlook_account=item_object, status='outlook_support_created')
            # if item_object.support_email and not item_object.support_created:
            if item_object.support_email and proc_created_2:
                sys_log_save(f'create_outlook_{item_object.id}', 'outlook support needed , go to security page')
                sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                             'https://account.microsoft.com/security')
                chrome_driver.get('https://account.microsoft.com/security')
                time.sleep(5)
                security_card = wait_for_element(
                    'xpath', 'one', '//*[@id="security.cards.advanced-options"]', driver=chrome_driver)
                if security_card:
                    elem_1 = chrome_driver.find_element(
                            by=By.XPATH, value='//*[@id="security.cards.advanced-options"]')
                    try:
                        elem_1.click()
                    except:
                        chrome_driver.execute_script("window.scrollBy(0,0)", "")
                        time.sleep(2)
                        elem_1.click()
                    self.fix_account_support(chrome_driver, item_object.support_email,
                                             item_object.support_imap_host, item_object.support_password)
                    time.sleep(15)
                else:
                    sys_log_save(f'create_outlook_{item_object.id}', 'can not find security card. move other works')
                    # print('can not find security card. move other works')
                process_2.refresh_from_db()
                process_2.is_done = True
                process_2.save()
                item_object.refresh_from_db()
                item_object.support_created = True
                item_object.save()
                self.last_create_status = 'email_support_set'
        elif item_object.outlook_created or process_1.is_done is True:
            self.update_worker_status('outlook already created', update_time=False)
            if item_object.browser == 'tor_windows':
                login_status = self.login_to_outlook(
                    local_driver, item_object.password, item_object.support_email,
                    item_object.support_imap_host, item_object.support_password, user_name_email)
                local_driver.quit()
            else:
                login_status = self.login_to_outlook(
                    chrome_driver, item_object.password, item_object.support_email,
                    item_object.support_imap_host, item_object.support_password, user_name_email)
            if login_status.get('error') == 'outlook account locked':
                return {'status_bool': False, 'status': 'failed', 'error': 'outlook account locked'}
            sys_log_save(f'create_outlook_{item_object.id}', 'login status : ', login_status)
            # print('login status : ', login_status)
            item_object.refresh_from_db()
            # if not item_object.support_created:
            process_3, proc_created_3 = OutlookCreateProcess.objects.get_or_create(
                outlook_account=item_object, status='outlook_support_creation')
            if process_3.is_done is False and item_object.support_email:
                sys_log_save(f'create_outlook_{item_object.id}', 'outlook support not created , try to add')
                sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                             'https://account.live.com/proofs')
                chrome_driver.get('https://account.live.com/proofs')
                time.sleep(5)
                security_card = wait_for_element(
                    'xpath', 'one', '//*[@id="security.cards.advanced-options"]', driver=chrome_driver)
                driver_current_url = chrome_driver.current_url
                if security_card or driver_current_url.startswith('https://account.live.com/proofs/Add'):
                    sys_log_save(f'create_outlook_{item_object.id}', 'security card : ', security_card,
                                 ' current_url : ', driver_current_url[:100])
                    if not driver_current_url.startswith('https://account.live.com/proofs/'):
                        elem_2 = chrome_driver.find_element(
                            by=By.XPATH, value='//*[@id="security.cards.advanced-options"]')
                        try:
                            elem_2.click()
                        except:
                            chrome_driver.execute_script("window.scrollBy(0,0)", "")
                            time.sleep(2)
                            elem_2.click()
                    self.fix_account_support(chrome_driver, item_object.support_email,
                                             item_object.support_imap_host, item_object.support_password)
                    time.sleep(15)
                else:
                    sys_log_save(f'create_outlook_{item_object.id}', 'can not find security card. move other works')
                    # print('can not find security card. move other works')
                process_3.refresh_from_db()
                process_3.is_done = True
                process_3.save()
                item_object.refresh_from_db()
                item_object.support_created = True
                item_object.save()
                self.last_create_status = 'email_support_set'

        item_object.refresh_from_db()
        process_4, proc_created_4 = OutlookCreateProcess.objects.get_or_create(
            outlook_account=item_object, status='gamer_tag_creation')
        # if item_object.gamer_tag and not item_object.gamer_tag_created:
        if item_object.gamer_tag and process_4.is_done is False:
            sys_log_save(f'create_outlook_{item_object.id}', 'start change gamer tag, new : ', item_object.gamer_tag)
            # print('start change gamer tag, new : ', item_object.gamer_tag)
            self.update_worker_status('need to change gamer tag', update_time=False)
            # chrome_driver.quit()
            # get_driver_result = self.get_driver(proxy=item_object.proxy, fifa_account=fifa_account,
            #                                     browser=browser, open_outlook=False)
            # chrome_driver = get_driver_result.get('chrome_driver')
            # chrome_driver.maximize_window()
            # login_status = self.login_to_outlook(
            #     chrome_driver, item_object.password, item_object.support_email, item_object.support_imap_host,
            #     item_object.support_password, user_name_email)
            # print('login status : ', login_status)
            time.sleep(10)
            for iiii in range(3):
                if not chrome_driver.current_url.startswith('https://www.xbox.com/en-GB/') and not chrome_driver.current_url.startswith('https://sisu.xboxlive.com'):
                    sys_log_save(f'create_outlook_{item_object.id}', 'url not start with xbox.com , started with : ', chrome_driver.current_url)
                    # print('url not start with xbox.com , started with : ', chrome_driver.current_url)
                    sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                                 'https://www.xbox.com/en-GB/')
                    chrome_driver.get('https://www.xbox.com/en-GB/')
                    time.sleep(15)
                    try:
                        chrome_driver.find_element(
                            by=By.XPATH,
                            value="//*[@id='mectrl_headerPicture']"
                        ).click()

                    except:
                        try:
                            sys_log_save(f'create_outlook_{item_object.id}', 'can not find header picture')
                            # print('can not find header picture')
                            chrome_driver.find_element(
                                by=By.XPATH,
                                value='//a[contains(@href, "msa?action=logIn")]'
                            ).click()
                        except:
                            sys_log_save(f'create_outlook_{item_object.id}', 'can not find login button in header')
                            # print('can not find login button in header')
                time.sleep(10)
                if not chrome_driver.current_url.startswith('https://sisu.xboxlive.com/'):
                    if chrome_driver.current_url.startswith('https://www.xbox.com/en-GB/'):
                        sys_log_save(f'create_outlook_{item_object.id}', 'go to xbox page , try again')
                        # print('go to xbox page , try again')
                        try:
                            chrome_driver.find_element(
                                by=By.XPATH,
                                value="//*[text()='Oops! We hit a snag.']"
                            )
                            sys_log_save(f'create_outlook_{item_object.id}', 'ops , we hit a snag')
                            # print('ops , we hit a snag')
                            chrome_driver.close()
                            time.sleep(10)
                            get_driver_result = self.get_driver(proxy=item_object.proxy, fifa_account=fifa_account,
                                                                browser=browser, open_outlook=False)
                            chrome_driver = get_driver_result.get('chrome_driver')
                            time.sleep(2)
                            chrome_driver.maximize_window()
                            time.sleep(5)
                            sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                                         'https://www.xbox.com/en-GB/')
                            chrome_driver.get('https://www.xbox.com/en-GB/')
                            time.sleep(15)
                            continue
                        except:
                            sys_log_save(f'create_outlook_{item_object.id}', 'open xbox was success')
                        time.sleep(5)
                        try:
                            chrome_driver.find_element(
                                by=By.XPATH,
                                value="//*[@id='mectrl_headerPicture']"
                            ).click()
                        except:
                            try:
                                sys_log_save(f'create_outlook_{item_object.id}', 'can not find header picture 2')
                                chrome_driver.find_element(
                                    by=By.XPATH,
                                    value='//a[contains(@href, "msa?action=logIn")]'
                                ).click()
                            except:
                                sys_log_save(f'create_outlook_{item_object.id}', 'can not find login button in header 2')
                        time.sleep(20)
                        break
                    # elif chrome_driver.current_url.startswith('https://www.xbox.com/en-GB/'):
                    if chrome_driver.current_url.startswith('https://login.live.com/'):
                        sys_log_save(f'create_outlook_{item_object.id}', 'need to login to xbox')
                        try:
                            chrome_driver.find_element(
                                by=By.XPATH, value="//*[contains(@aria-label, 'Sign in with')]").click()
                            sys_log_save(f'create_outlook_{item_object.id}', 'login with select found')
                            time.sleep(30)
                            continue
                        except:
                            sys_log_save(f'create_outlook_{item_object.id}', 'can not find login with select')
                        try:
                            username_input = chrome_driver.find_element(by=By.XPATH, value="//*[@name='loginfmt']")
                            for char in user_name_email:
                                username_input.send_keys(char)
                                time.sleep(.1)
                            chrome_driver.find_element(by=By.XPATH, value="//*[@id='idSIButton9']").click()
                            time.sleep(5)
                        except:
                            sys_log_save(f'create_outlook_{item_object.id}', 'can not find login user name')

                        password_input = chrome_driver.find_element(by=By.XPATH, value="//*[@name='passwd']")
                        for char2 in item_object.password:
                            password_input.send_keys(char2)
                            time.sleep(.1)
                        chrome_driver.find_element(by=By.XPATH, value="//*[@id='idSIButton9']").click()
                        time.sleep(10)
                        try:
                            chrome_driver.find_element(by=By.XPATH, value="//*[@id='iNext']").click()
                            sys_log_save(f'create_outlook_{item_object.id}', 'need accept new rules')
                            time.sleep(5)
                        except:
                            pass
                        try:
                            chrome_driver.find_element(by=By.XPATH, value="//*[@id='idBtn_Back']").click()
                            sys_log_save(f'create_outlook_{item_object.id}', 'stay signed out')
                            time.sleep(15)
                        except:
                            pass
                        if chrome_driver.current_url.startswith('https://login.microsoftonline.com/consumers/oauth2/v2.0/logoutsession'):
                            sys_log_save(f'create_outlook_{item_object.id}', 'logoutsession required')
                            try:
                                # chrome_driver.find_element(by=By.XPATH,
                                #                            value="//*[@id='SignOutStatusMessage' and contains(text(), 'good idea to close all browser windows')]")
                                sys_log_save(f'create_outlook_{item_object.id}', 'need to close browser and try again')
                                chrome_driver.close()
                                time.sleep(10)
                                get_driver_result = self.get_driver(proxy=item_object.proxy, fifa_account=fifa_account,
                                                                    browser=browser, open_outlook=False)
                                chrome_driver = get_driver_result.get('chrome_driver')
                                time.sleep(2)
                                chrome_driver.maximize_window()
                                time.sleep(5)
                                sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                                             'https://www.xbox.com/en-GB/')
                                chrome_driver.get('https://www.xbox.com/en-GB/')
                                time.sleep(15)
                                continue
                            except:
                                sys_log_save(f'create_outlook_{item_object.id}', 'exception : ', traceback.format_exc())
                    if chrome_driver.current_url.startswith(
                            'https://login.microsoftonline.com/consumers/oauth2/v2.0/logoutsession'):
                        sys_log_save(f'create_outlook_{item_object.id}', 'logoutsession required')
                        try:
                            # chrome_driver.find_element(by=By.XPATH,
                            #                            value="//*[@id='SignOutStatusMessage' and contains(text(), 'good idea to close all browser windows')]")
                            sys_log_save(f'create_outlook_{item_object.id}', 'need to close browser and try again')
                            chrome_driver.close()
                            time.sleep(10)
                            get_driver_result = self.get_driver(proxy=item_object.proxy, fifa_account=fifa_account,
                                                                browser=browser, open_outlook=False)
                            chrome_driver = get_driver_result.get('chrome_driver')
                            time.sleep(2)
                            chrome_driver.maximize_window()
                            time.sleep(5)
                            sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                                         'https://www.xbox.com/en-GB/')
                            chrome_driver.get('https://www.xbox.com/en-GB/')
                            time.sleep(15)
                            continue
                        except:
                            sys_log_save(f'create_outlook_{item_object.id}', 'exception 2 : ', traceback.format_exc())
                    if chrome_driver.current_url.startswith('https://sisu.xboxlive.com/'):
                        sys_log_save(f'create_outlook_{item_object.id}', 'in change gamer tage page')
                        break
                    if chrome_driver.current_url.startswith('https://account.live.com/proofs/Add'):
                        sys_log_save(f'create_outlook_{item_object.id}',
                                     'need to support before change gamer tag')
                        self.fix_account_support(chrome_driver, item_object.support_email,
                                                 item_object.support_imap_host, item_object.support_password)
                else:
                    sys_log_save(f'create_outlook_{item_object.id}', 'url started with : ', chrome_driver.current_url)
                    break
            gamer_tage_already_changed = False
            gamer_tage_header = wait_for_element('xpath', 'one', '//*[contains(@class,"mectrl_screen_reader_text")]', driver=chrome_driver, wait_time=1)
            if gamer_tage_header:
                if str(item_object.gamer_tag) in gamer_tage_header.text:
                    gamer_tage_already_changed = True
                else:
                    sys_log_save(f'create_outlook_{item_object.id}',
                                 'gamer tag exists but not is mine : ', gamer_tage_header.text)
            if (not chrome_driver.current_url.startswith('https://sisu.xboxlive.com/') and
                    not chrome_driver.current_url.startswith('https://account.live.com/Abuse')):
                if gamer_tage_already_changed is False:
                    raise Exception('cant change gamer tag')
            elif gamer_tage_already_changed is False:
                # try:
                #     chrome_driver.find_element_by_id('create-account-gamertag-suggestion-1').click()
                #     time.sleep(2)
                #     chrome_driver.find_element_by_id('inline-continue-control').click()
                #     time.sleep(5)
                #     wait_for_element('xpath', 'one', '//*[@id="ChooseScreenGamertagInput"]', driver=chrome_driver)
                #     time.sleep(5)
                # except:
                #     print('first page gamer tag was ok')
                try:
                    # check_gamer_tag_input = chrome_driver.find_element_by_id('ChooseScreenGamertagInput')
                    check_gamer_tag_input = chrome_driver.find_element(by=By.ID, value='create-account-gamertag-input')
                except:
                    try:
                        chrome_driver.find_element(
                            by=By.XPATH,
                            value="//div[text()='For your security and to ensure only you have access to your account, we will ask you to verify your identity and change your password.']")
                        raise Exception('need phone number')
                    except:
                        sys_log_save(f'create_outlook_{item_object.id}', 'can not find need phone')
                    try:
                        chrome_driver.find_element(by=By.XPATH, value="//div[text()='Your account has been locked']")
                        return {'status_bool': False, 'status': 'failed', 'error': 'outlook account locked'}
                        # raise Exception('account has been locked')
                    except:
                        sys_log_save(f'create_outlook_{item_object.id}', 'can not find account locked')
                    raise Exception('can not find gamer tag input')
                item_object.refresh_from_db()
                time.sleep(2)
                need_enter_gamer_tage = True
                for ssss in range(10):
                    if need_enter_gamer_tage:
                        for nm in str(item_object.gamer_tag) + ' ' + str(random.randint(300000, 1000000)):
                            check_gamer_tag_input.send_keys(nm)
                            time.sleep(.2)
                        need_enter_gamer_tage = False
                    time.sleep(5)
                    try:
                        chrome_driver.find_element(
                            by=By.XPATH,
                            value="//input[@id='create-account-gamertag-input' and @class='success']")
                        sys_log_save(f'create_outlook_{item_object.id}', 'gamer tag success')
                        break
                    except:
                        sys_log_save(f'create_outlook_{item_object.id}', 'gamer tag not success')
                    try:
                        chrome_driver.find_element(
                            by=By.XPATH,
                            value="//input[@id='create-account-gamertag-input' and @class='failure']")
                        for sss in range(20):
                            chrome_driver.send_keys(Keys.BACKSPACE)
                        need_enter_gamer_tage = True
                        sys_log_save(f'create_outlook_{item_object.id}', 'gamer tag failure , try again')
                    except:
                        pass
                chrome_driver.find_element(by=By.ID, value='inline-continue-control').click()
                time.sleep(5)
            self.last_create_status = 'gamer_tag_changed'
            sys_log_save(f'create_outlook_{item_object.id}', 'confirm gamer tag')
            process_4.refresh_from_db()
            process_4.is_done = True
            process_4.save()
            item_object.refresh_from_db()
            item_object.gamer_tag_created = True
            item_object.save()

        item_object.refresh_from_db()
        process_5, proc_created_5 = OutlookCreateProcess.objects.get_or_create(
            outlook_account=item_object, status='origin_creation')
        # if item_object.create_origin and not item_object.origin_created:
        if item_object.create_origin and process_5.is_done is False:
            process_6, proc_created_6 = OutlookCreateProcess.objects.get_or_create(
                outlook_account=item_object, status='origin_creation_step_one')
            origin_account_already_exists = False
            if process_6.is_done is False:
                sys_log_save(f'create_outlook_{item_object.id}', 'need to create origin')
                self.update_worker_status('need to create origin', update_time=False)
                # origin_id = item_object.origin_user_name
                for nnnn in range(20):
                    item_object.refresh_from_db()
                    if nnnn > 18:
                        sys_log_save(f'create_outlook_{item_object.id}', 'more than 18 try to create origin')
                        raise Exception('To Many Try Origin Create')
                    step_one_result = self.create_origin_step_one(
                        user_name=item_object.user_name, password=item_object.password, user_name_email=user_name_email,
                        birth_date=item_object.birth_date,
                        browser=browser, chrome_driver=chrome_driver
                    )
                    if step_one_result and step_one_result.get('status_bool') is True:
                        origin_id = step_one_result.get('origin_id')
                        item_object.refresh_from_db()
                        item_object.origin_user_name = origin_id
                        item_object.save()
                        break
                    else:
                        if step_one_result.get('error', None) == 'account already exists':
                            sys_log_save(f'create_outlook_{item_object.id}', 'account already exists')
                            chrome_driver.find_element(by=By.XPATH, value="//a[text()='sign in']").click()
                            time.sleep(10)
                            origin_account_already_exists = True
                            break
                        sys_log_save(f'create_outlook_{item_object.id}', 'error on create origin , result : ', step_one_result, ' try again : ', nnnn)
                        chrome_driver.quit()
                        time.sleep(10)
                        open_outlook = False
                        get_driver_result = self.get_driver(proxy=item_object.proxy, fifa_account=fifa_account,
                                                            browser=browser, open_outlook=open_outlook)
                        chrome_driver = get_driver_result.get('chrome_driver')
                        if browser == 'tor_windows':
                            chrome_driver.maximize_window()
                            # todo : delete abow and uncomment bellow if want create multiple account in day. uncomment bellow to make console active and dont go to sleep mode
                            # chrome_driver.set_window_size(1900, 1000)
                            # time.sleep(3)
                            # chrome_driver.minimize_window()
                            # time.sleep(3)
                            # if process_exists('XboxPcApp.exe'):
                            #     focus_on_ps(fifa_account)
                            #     time.sleep(1)
                        else:
                            chrome_driver.maximize_window()
                            time.sleep(2)
                if origin_account_already_exists is True:
                    self.login_to_origin(item_object, chrome_driver=chrome_driver, user_name_email=user_name_email,
                                         open_link=False)
                else:
                    sys_log_save(f'create_outlook_{item_object.id}', 'create origin step one success', timezone.localtime())
                    # read and agree
                    start_time_4 = datetime.datetime.now(local_tz)
                    # wait_for_element('xpath', 'one', '//*[contains(text(), "I accept the")]', driver=chrome_driver)
                    # time.sleep(5)
                    window_name = chrome_driver.current_window_handle
                    for nnn in range(30):
                        try:
                            chrome_driver.find_element(by=By.XPATH, value="//div[@id='reg-sqa-privacy-panel' and contains(@style,'display: block')]")
                            if nnn and nnn % 2 == 0:
                                chrome_driver.find_element(by=By.XPATH, value="//*[*[contains(text(), 'I accept the')]]").click()
                            else:
                                chrome_driver.find_element(by=By.XPATH, value="//*[@Id='read-accept-container' and *[*[*[contains(text(), 'I have read and accept the')]]]]").click()
                            time.sleep(3)
                            chrome_driver.switch_to.window(window_name=window_name)
                            time.sleep(1)
                            chrome_driver.find_element(by=By.XPATH, value="//*[@id='submitBtn']").click()
                            time.sleep(5)
                            break
                        except:
                            time.sleep(5)

                    self.last_create_status = 'origin_user_password_set'
                    wait_for_element('xpath', 'one', '//*[@id="emailVerifyCode"]', driver=chrome_driver)
                    security_code_3 = None
                    for wait_time_3 in range(50):
                        emails_list = get_last_email(
                            imap_user=user_name_email, imap_pass=item_object.password,
                            imap_host='outlook.office365.com', email_count=5
                        )
                        if emails_list.get('emails_list', []):
                            for last_email in emails_list.get('emails_list', []):
                                if last_email.get('body', None) and last_email.get('time') > start_time_4:
                                    # get security code
                                    search_security_code = re.search(r'Your EA Security Code is: (\d+)', last_email.get('subject'))
                                    if search_security_code:
                                        sys_log_save(f'create_outlook_{item_object.id}', last_email.get('subject'))
                                        security_code_3 = search_security_code.group(1)
                                        break
                                    sys_log_save(f'create_outlook_{item_object.id}', 'last email not mach , time : ', last_email.get('time'))
                                    time.sleep(10)
                                    if wait_time_3 == 10:
                                        chrome_driver.find_element(by=By.XPATH, value="//*[@id='resend']").click()
                                        sys_log_save(f'create_outlook_{item_object.id}', 'click resend code 3')
                            if security_code_3:
                                break
                            else:
                                sys_log_save(f'create_outlook_{item_object.id}', 'last email 2: ', emails_list.get('time'), ' start time : ', start_time_4)
                                time.sleep(10)
                        elif emails_list.get('error'):
                            sys_log_save(f'create_outlook_{item_object.id}', 'error on get email : ', emails_list.get('error'))
                            time.sleep(10)
                            continue
                        elif wait_time_3 and wait_time_3 % 10 == 0:
                            chrome_driver.find_element(by=By.XPATH, value="//*[@id='resend']").click()
                            sys_log_save(f'create_outlook_{item_object.id}', 'click resend code')
                        else:
                            sys_log_save(f'create_outlook_{item_object.id}', 'last email : ', emails_list.get('time'), ' start time : ', start_time_4)
                            time.sleep(10)
                            continue
                    if security_code_3 is None:
                        raise Exception('can not get origin security code')
                    item_object.refresh_from_db()
                    ea_security_input = chrome_driver.find_element(by=By.XPATH, value="//*[@id='emailVerifyCode']")
                    for char_3 in str(security_code_3):
                        ea_security_input.send_keys(char_3)
                        time.sleep(.1)
                    time.sleep(1)
                    chrome_driver.find_element(by=By.XPATH, value="//*[@id='btnSendCode']").click()
                    time.sleep(1)
                    wait_for_element('xpath', 'one', '//*[@id="continueDoneBtn"]', driver=chrome_driver)
                    time.sleep(2)
                    chrome_driver.find_element(by=By.XPATH, value="//*[@id='continueDoneBtn']").click()
                    time.sleep(10)
                    sys_log_save(f'create_outlook_{item_object.id}', 'origin_security_data_set complete')
                    self.last_create_status = 'origin_security_data_set'
                    process_6.refresh_from_db()
                    process_6.is_done = True
                    process_6.save()
            else:
                sys_log_save(f'create_outlook_{item_object.id}', 'origin already exists')
                self.login_to_origin(item_object, chrome_driver=chrome_driver, user_name_email=user_name_email,
                                     open_link=True)
            process_7, proc_created_7 = OutlookCreateProcess.objects.get_or_create(
                outlook_account=item_object, status='origin_creation_step_two')
            if process_7.is_done is False:
                for iiin in range(3):
                    # chrome_driver.get('https://www.ea.com/')
                    # time.sleep(25)
                    # keyboard.press_and_release('tab')
                    # time.sleep(2)
                    # keyboard.press_and_release('enter')
                    # time.sleep(5)
                    # keyboard.press_and_release('tab')
                    # time.sleep(1)
                    # keyboard.press_and_release('tab')
                    # time.sleep(1)
                    # keyboard.press_and_release('enter')
                    sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                                 'https://myaccount.ea.com/cp-ui/security/index')
                    chrome_driver.get('https://myaccount.ea.com/cp-ui/security/index')
                    time.sleep(15)
                    if chrome_driver.current_url.startswith('https://myaccount.ea.com'):
                        chrome_driver.find_element(by=By.XPATH, value='//*[@id="nav_security"]').click()
                        time.sleep(5)
                    else:
                        sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                                     'https://myaccount.ea.com/cp-ui/security/index')
                        chrome_driver.get('https://myaccount.ea.com/cp-ui/security/index')
                        time.sleep(3)
                    get_elem_2 = wait_for_element(
                        'xpath', 'one', '//*[@id="authenticator_switch_link"]', driver=chrome_driver,
                        multiple_tag=['//*[@id="authenticator_switch_link"]', '//*[@id="twofactoronbtn"]']
                    )
                    if get_elem_2:
                        break
                time.sleep(10)
                try:
                    chrome_driver.find_element(by=By.XPATH, value="//*[@id='truste-consent-required']").click()
                    time.sleep(3)
                    sys_log_save(f'create_outlook_{item_object.id}', 'truste reququired')
                except:
                    pass
                # chrome_driver.find_element(by=By.XPATH, value="//*[@id='authenticator_switch_link']").click()
                get_elem_2.click()
                time.sleep(3)
                # send verify code
                start_time_6 = datetime.datetime.now(local_tz)
                wait_for_element('xpath', 'one', '//*[@id="mfa_send_mfa_code_span"]', driver=chrome_driver)
                time.sleep(10)
                chrome_driver.find_element(by=By.XPATH, value="//*[@id='mfa_send_mfa_code_span']").click()
                time.sleep(10)
                wait_for_element('xpath', 'one', '//*[@id="mfa_code_input"]', driver=chrome_driver)
                self.update_worker_status('get security step 3', update_time=False)
                item_object.refresh_from_db()
                security_code_3 = None
                for wait_time_3 in range(50):
                    emails_list = get_last_email(
                        imap_user=user_name_email, imap_pass=item_object.password,
                        imap_host='outlook.office365.com', email_count=5
                    )
                    if emails_list.get('emails_list', []):
                        for last_email in emails_list.get('emails_list', []):
                            if last_email.get('body', None) and last_email.get('time') > start_time_6:
                                # get security code
                                search_security_code = re.search(r'Your EA Security Code is: (\d+)', last_email.get('subject'))
                                if search_security_code:
                                    sys_log_save(f'create_outlook_{item_object.id}',
                                                 'email subject 3 : ', last_email.get('subject'))
                                    security_code_3 = search_security_code.group(1)
                                    break
                                sys_log_save(f'create_outlook_{item_object.id}',
                                             'last email not mach 2 , time : ', last_email.get('time'))
                                time.sleep(10)
                                if wait_time_3 == 10:
                                    chrome_driver.find_element(by=By.XPATH, value="//*[@id='resend']").click()
                                    print('click resend code 3')
                        if security_code_3:
                            break
                        else:
                            sys_log_save(f'create_outlook_{item_object.id}',
                                         'last email 6: ', emails_list.get('time'), ' start time : ', start_time_6)
                            time.sleep(10)
                    elif emails_list.get('error'):
                        sys_log_save(f'create_outlook_{item_object.id}',
                                     'error on get email : ', emails_list.get('error'))
                        time.sleep(10)
                        continue
                    elif wait_time_3 and wait_time_3 % 10 == 0:
                        chrome_driver.find_element(by=By.XPATH, value="//*[@id='resend']").click()
                        sys_log_save(f'create_outlook_{item_object.id}', 'click resend code 3')
                    else:
                        sys_log_save(f'create_outlook_{item_object.id}',
                                     'last email : ', emails_list.get('time'), ' start time : ', start_time_6)
                        time.sleep(10)
                        continue
                if security_code_3 is None:
                    raise Exception('can not get origin security code 3')
                ea_security_input = chrome_driver.find_element(by=By.XPATH, value="//*[@id='mfa_code_input']")
                for char_3 in str(security_code_3):
                    ea_security_input.send_keys(char_3)
                    time.sleep(.1)
                time.sleep(10)
                chrome_driver.find_element(by=By.XPATH, value="//*[@id='submit_mfa_code_span']").click()
                time.sleep(10)
                try:
                    chrome_driver.find_element(by=By.XPATH, value="//*[input[@name='codeType' and @id='appradio']]").click()
                    time.sleep(10)
                    chrome_driver.find_element(by=By.XPATH, value="//*[@id='submitbtnlbl']").click()
                    time.sleep(10)
                except:
                    pass
                # turn on two factor auth
                wait_for_element('xpath', 'one', '//*[@id="setup_authenticator_turnon"]', driver=chrome_driver)
                time.sleep(10)
                chrome_driver.find_element(by=By.XPATH, value="//*[@id='setup_authenticator_turnon']").click()
                time.sleep(10)
                # get totp code
                wait_for_element('xpath', 'one', '//*[@id="tfa_qrcode_secretKey"]', driver=chrome_driver)
                time.sleep(10)

                app_code = str(chrome_driver.find_element(by=By.XPATH, value='//*[@id="tfa_qrcode_secretKey"]').text
                               ).replace('\t', '').replace(' ', '').replace('\n', '')
                time.sleep(10)
                sys_log_save(f'create_outlook_{item_object.id}', 'app code : ', app_code)
                item_object.refresh_from_db()
                item_object.origin_app_code = app_code
                # item_object.origin_user_name = origin_id
                item_object.save()
                totp_code = pyotp.TOTP(app_code).now()
                two_factor_input = chrome_driver.find_element(by=By.XPATH, value="//*[@id='twofactorQRCode']")
                for char_3 in str(totp_code):
                    two_factor_input.send_keys(char_3)
                    time.sleep(.1)
                time.sleep(10)
                chrome_driver.find_element(by=By.XPATH, value="//*[@id='savebtn_twofactor_verifyQRcode']").click()
                time.sleep(2)
                self.last_create_status = 'origin_full_created'
                sys_log_save(f'create_outlook_{item_object.id}', 'origin successfull created')
                process_7.refresh_from_db()
                process_7.is_done = True
                process_7.save()
                process_5.refresh_from_db()
                process_5.is_done = True
                process_5.save()
        return {'status_bool': True, 'status': 'success'}

    def login_to_outlook(self, chrome_driver, password, support_email, support_imap_host, support_password,
                         user_name_email):
        sys_log_save(f'create_outlook_{self.item_object.id}', 'login to outlook')
        sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                     'https://login.live.com/')
        chrome_driver.get('https://login.live.com/')
        time.sleep(2)
        # add user name
        member_name_input = chrome_driver.find_element(by=By.XPATH, value='//*[@name="loginfmt"]')
        for char in user_name_email:
            member_name_input.send_keys(char)
            time.sleep(.2)
        chrome_driver.find_element(by=By.XPATH, value='//*[@id="idSIButton9"]').click()
        try:
            chrome_driver.find_element(by=By.XPATH, value='//*[@id="MemberNameError"]')
            sys_log_save(f'create_outlook_{self.item_object.id}', 'can not login to outlook')
            raise Exception('can not login to outlook')
        except:
            pass
        # add password
        wait_for_element('xpath', 'one', '//*[@name="passwd"]', driver=chrome_driver)
        time.sleep(15)
        password_input = chrome_driver.find_element(by=By.XPATH, value='//*[@name="passwd"]')
        for char in password:
            password_input.send_keys(char)
            time.sleep(.2)
        chrome_driver.find_element(by=By.XPATH, value='//*[@id="idSIButton9"]').click()
        time.sleep(10)
        sys_log_save(f'create_outlook_{self.item_object.id}', 'user name and password entered')
        if chrome_driver.current_url.startswith('https://account.live.com/Abuse'):
            sys_log_save(f'create_outlook_{self.item_object.id}', 'account locked url seens')
            try:
                chrome_driver.find_element(by=By.XPATH, value="//div[text()='Your account has been locked']")
                return {'status_bool': True, 'status': 'failed', 'error': 'outlook account locked'}
            except:
                pass

        sync_together_1 = wait_for_element(
            'xpath', 'one', '//span[contains(text(),"Your Microsoft account brings everything together")]', driver=chrome_driver, wait_time=1)
        sync_together_2 = wait_for_element(
            'xpath', 'one', '//span[contains(text(),"Your important things are right here")]',
            driver=chrome_driver, wait_time=1)
        if sync_together_1 or sync_together_2:
            chrome_driver.find_element(by=By.XPATH, value='//button').click()
            sys_log_save(f'create_outlook_{self.item_object.id}', 'Your Microsoft account brings everything together ', sync_together_1, ' -- ', sync_together_2)
            time.sleep(10)
            sync_together_3 = wait_for_element(
                'xpath', 'one', '//span[contains(text(),"Your Microsoft account brings everything together")]',
                driver=chrome_driver, wait_time=1)
            sync_together_4 = wait_for_element(
                'xpath', 'one', '//span[contains(text(),"Your important things are right here")]',
                driver=chrome_driver, wait_time=1)
            if sync_together_3 or sync_together_4:
                sys_log_save(f'create_outlook_{self.item_object.id}',
                             'Your Microsoft account brings everything together ', sync_together_3, ' -- ',
                             sync_together_4)
                chrome_driver.find_element(by=By.XPATH, value='//button').click()
                time.sleep(10)
        try:
            chrome_driver.find_element(
                by=By.XPATH, value='//*[@id="idSIButton9"]').click()
            sys_log_save(f'create_outlook_{self.item_object.id}', 'back btn 1')
            time.sleep(10)
        except:
            pass
        try:
            chrome_driver.find_element(by=By.XPATH, value='//*[@id="declineButton"]').click()
            sys_log_save(f'create_outlook_{self.item_object.id}', 'back btn 3')
            time.sleep(10)
        except:
            pass
        try:
            chrome_driver.find_element(by=By.XPATH, value='//input[@id="idBtn_Back"]').click()
            sys_log_save(f'create_outlook_{self.item_object.id}', 'back btn 2')
            time.sleep(10)
        except:
            sys_log_save(f'create_outlook_{self.item_object.id}', 'can not find back button')
        if support_email and not self.item_object.support_created:
            self.fix_account_support(chrome_driver, support_email, support_imap_host, support_password)
            self.item_object.refresh_from_db()
            self.item_object.support_created = True
            self.item_object.save()
        back_btn = wait_for_element(
            'xpath', 'one', '//input[@id="idBtn_Back"]', driver=chrome_driver)
        if back_btn:
            chrome_driver.find_element(by=By.XPATH, value='//input[@id="idBtn_Back"]').click()
            sys_log_save(f'create_outlook_{self.item_object.id}', 'back btn 4')
            time.sleep(10)
        # chrome_driver.quit()
        sys_log_save(f'create_outlook_{self.item_object.id}', 'login to outlook success')
        # if not local_driver.current_url.startswith('https://outlook.live.com/mail/0/'):
        #     local_driver.get('https://outlook.live.com/mail/0/')
        #     time.sleep(10)
        return {'status_bool': True, 'status': 'success'}


    def fix_account_support(self, chrome_driver, support_email, support_imap_host, support_password):
        sys_log_save(f'create_outlook_{self.item_object.id}', 'check for account need support', timezone.localtime())
        for tt in range(2):
            need_support = wait_for_element(
                'xpath', 'one', "//div[contains(text(), 'Call us overprotective')]", driver=chrome_driver)
            need_support2 = wait_for_element(
                'xpath', 'one', "//div[contains(text(), 'protect your account')]", driver=chrome_driver, wait_time=1)
            need_support_3 = False
            if not need_support and not need_support2 and support_email:
                sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                             'https://account.microsoft.com/security?fref=home.drawers.security.security-dashboard')
                chrome_driver.get('https://account.microsoft.com/security?fref=home.drawers.security.security-dashboard')
                time.sleep(15)
                if chrome_driver.current_url.startswith('https://account.live.com/proofs/Add'):
                    need_support_3 = True
            if need_support or need_support2 or need_support_3:
                sys_log_save(f'create_outlook_{self.item_object.id}', 'need support')
                self.update_worker_status('need support email', update_time=False)
                if support_email:
                    start_time = datetime.datetime.now(local_tz)
                    time.sleep(5)
                    try:
                        chrome_driver.find_element_by_xpath('//input[@name="proof"]').click()
                        sys_log_save(f'create_outlook_{self.item_object.id}', 'support email need proof')
                        time.sleep(2)
                        try:
                            chrome_driver.find_element_by_id('iNext').click()
                            sys_log_save(f'create_outlook_{self.item_object.id}', 'press next')
                        except:
                            support_email_input = chrome_driver.find_element(by=By.NAME, value='iProofEmail')
                            for char in str(support_email):
                                support_email_input.send_keys(char)
                                time.sleep(.2)
                            chrome_driver.find_element_by_id('iSelectProofAction').click()
                            time.sleep(5)
                        sys_log_save(f'create_outlook_{self.item_object.id}', 'this email already proofed')
                    except Exception as error:
                        sys_log_save(f'create_outlook_{self.item_object.id}', 'find proof error : ', error)
                        support_email_input = chrome_driver.find_element(by=By.NAME, value='EmailAddress')
                        for char in str(support_email):
                            support_email_input.send_keys(char)
                            time.sleep(.2)
                        chrome_driver.find_element_by_id('iNext').click()
                    self.update_worker_status('get security code step 1', update_time=False)
                    security_code = None
                    for wait_time in range(20):
                        emails_list = get_last_email(
                            imap_user=support_email, imap_pass=support_password, imap_host=support_imap_host,
                            email_count=5
                        )
                        if emails_list.get('emails_list', []):
                            for last_email in emails_list.get('emails_list', []):
                                if last_email.get('body', None) and last_email.get('time') > start_time:
                                    # get security code
                                    search_security_code = re.search(r'Security code: (\d+)', last_email.get('body'))
                                    if search_security_code:
                                        security_code = search_security_code.group(1)
                                        break
                                elif last_email.get('error'):
                                    sys_log_save(f'create_outlook_{self.item_object.id}',
                                                 'error on get email : ', last_email.get('error'))
                            if security_code:
                                break
                            else:
                                sys_log_save(f'create_outlook_{self.item_object.id}',
                                             'last email 3: ', emails_list.get('time'), ' start time : ', start_time)
                                time.sleep(10)
                            if wait_time == 10:
                                chrome_driver.find_element(by=By.XPATH, value="//*[@id='resend']").click()
                                sys_log_save(f'create_outlook_{self.item_object.id}', 'click resend code 4')
                        elif emails_list.get('error'):
                            sys_log_save(f'create_outlook_{self.item_object.id}',
                                         'error on get email : ', emails_list.get('error'))
                            time.sleep(10)
                            continue
                        else:
                            sys_log_save(f'create_outlook_{self.item_object.id}',
                                         'last email : ', emails_list.get('time'), ' start time : ', start_time)
                            time.sleep(10)
                            continue
                    if security_code is None:
                        sys_log_save(f'create_outlook_{self.item_object.id}', 'can not get security code')
                        raise Exception('can not get security code')
                    time.sleep(5)
                    for iiid in range(3):
                        try:
                            wait_for_element('xpath', 'one', '//div[@id="iEnterSubhead"]', driver=chrome_driver)
                            support_password_input = chrome_driver.find_element(by=By.ID, value='iOttText')
                            sys_log_save(f'create_outlook_{self.item_object.id}', 'security code  = ', security_code)
                            for char in str(security_code):
                                support_password_input.send_keys(char)
                                time.sleep(.2)
                            break
                        except:
                            sys_log_save(f'create_outlook_{self.item_object.id}',
                                         'cant send security code , refresh page')
                            if chrome_driver.current_url.startswith('https://account.live.com/proofs/Verify'):
                                sys_log_save(f'create_outlook_{self.item_object.id}', 'need to refresh')
                            else:
                                sys_log_save(f'create_outlook_{self.item_object.id}',
                                             'cant find correct url , but refresh page')
                            chrome_driver.refresh()
                            time.sleep(10)
                    try:
                        chrome_driver.find_element(by=By.ID, value='iVerifyCodeAction').click()
                    except:
                        chrome_driver.find_element(by=By.ID, value='iNext').click()
                    sys_log_save(f'create_outlook_{self.item_object.id}', 'security code entered')
                    time.sleep(5)
                    verify_identity = wait_for_element(
                        'xpath', 'one', "//div[text()='Verify your identity']", driver=chrome_driver)
                    if verify_identity:
                        self.update_worker_status('get security code step 2', update_time=False)
                        start_time_2 = datetime.datetime.now(local_tz)
                        chrome_driver.find_element(
                            by=By.XPATH,
                            value="//div[@id='idDiv_SAOTCS_Proofs']/div/div").click()
                        wait_for_element('xpath', 'one', '//*[@id="idTxtBx_SAOTCS_ProofConfirmation"]',
                                         driver=chrome_driver)
                        time.sleep(5)
                        support_again_input = chrome_driver.find_element(
                            by=By.XPATH, value="//*[@id='idTxtBx_SAOTCS_ProofConfirmation']")
                        for char in support_email:
                            support_again_input.send_keys(char)
                            time.sleep(.2)
                        chrome_driver.find_element(
                            by=By.XPATH, value="//*[@id='idSubmit_SAOTCS_SendCode']").click()
                        time.sleep(5)
                        security_code_2 = None
                        for wait_time_2 in range(20):
                            last_email_2 = get_last_email(
                                imap_user=support_email, imap_pass=support_password, imap_host=support_imap_host
                            )
                            if last_email_2.get('body', None) and last_email_2.get('time') > start_time_2:
                                # get security code
                                search_security_code = re.search(r'Security code: (\d+)', last_email_2.get('body'))
                                if search_security_code:
                                    security_code_2 = search_security_code.group(1)
                                    break
                            else:
                                sys_log_save(f'create_outlook_{self.item_object.id}',
                                             'last email 2 : ', last_email_2.get('time'), ' start time : 2', start_time_2)
                                time.sleep(10)
                                continue
                        if security_code_2 is None:
                            sys_log_save(f'create_outlook_{self.item_object.id}', 'can not get security code 2')
                            break
                        support_again_code_input = chrome_driver.find_element(
                            by=By.XPATH, value="//*[@id='idTxtBx_SAOTCC_OTC']")
                        for char in security_code_2:
                            support_again_code_input.send_keys(char)
                            time.sleep(.2)
                        chrome_driver.find_element(by=By.XPATH, value="//*[@id='idSubmit_SAOTCC_Continue']").click()
                        time.sleep(5)
                else:
                    sys_log_save(f'create_outlook_{self.item_object.id}', 'need support email but have not.')
                    raise Exception('need support email')

            else:
                break

    def create_origin_step_one(self, user_name, password, user_name_email, birth_date, browser, chrome_driver):
        sys_log_save(f'create_outlook_{self.item_object.id}', 'create origin step one : ',
                     user_name, ' - ', password, ' - ', user_name_email, ' - ', birth_date, ' - ', browser)
        try:
            time.sleep(5)
            # chrome_driver.get('https://www.ea.com/')
            # time.sleep(25)
            # keyboard.press_and_release('tab')
            # time.sleep(2)
            # keyboard.press_and_release('enter')
            # time.sleep(5)
            # keyboard.press_and_release('tab')
            # time.sleep(1)
            # keyboard.press_and_release('tab')
            # time.sleep(1)
            # keyboard.press_and_release('enter')
            sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                         'https://signin.ea.com/p/juno/create?execution=e...')
            chrome_driver.get('https://signin.ea.com/p/juno/create?execution=e244821713s1&initref=https%3A%2F%2Faccounts.ea.com%3A443%2Fconnect%2Fauth%3Finitref_replay%3Dfalse%26response_type%3Dcode%26redirect_uri%3Dhttps%253A%252F%252Fmyaccount.ea.com%252Fcp-ui%252Faboutme%252Flogin%26locale%3Den_US%26client_id%3Dcustomer_portal')
            time.sleep(15)
            try:
                chrome_driver.find_element(by=By.XPATH, value='//*[@id="createLink"]').click()
                time.sleep(10)
            except:
                pass
            # profile_icon = chrome_driver.find_element(by=By.XPATH, value='//*[@title="Profile"]')
            # profile_icon.click()
            # time.sleep(2)
            # register_icon = chrome_driver.find_element(by=By.XPATH, value='//a[contains(@href, "/register"')
            # register_icon.click()
            # time.sleep(15)

            # chrome_driver.get('https://www.ea.com/en-gb/register')
            # time.sleep(2)
            # select country
            selected_country = 'GB'
            if not browser == 'tor_windows':
                selected_country = random.choice([
                    'GB', 'AF', 'AX', 'AU', 'BE', 'BR', 'CA', 'CO', 'CN', 'GL', 'DE', 'IE', 'IT', 'KW', 'NZ', 'NO', 'PL'
                ])
                select_country = Select(chrome_driver.find_element(
                    by=By.XPATH, value='//*[@id="clientreg_country-selctrl"]')
                )
                select_country.select_by_value(selected_country)
                time.sleep(1)
                self.item_object.refresh_from_db()
                self.item_object.region = selected_country
                self.item_object.save()
            sys_log_save(f'create_outlook_{self.item_object.id}', 'selected country is : ', selected_country)
            # select birthday
            select_country = Select(chrome_driver.find_element(
                by=By.XPATH, value='//*[@id="clientreg_dobday-selctrl"]')
            )
            select_country.select_by_value(str(birth_date.day))
            time.sleep(1)
            # select birth month
            select_country = Select(chrome_driver.find_element(
                by=By.XPATH, value='//*[@id="clientreg_dobmonth-selctrl"]')
            )
            select_country.select_by_value(str(birth_date.month))
            time.sleep(1)
            # select birth year
            select_country = Select(chrome_driver.find_element(
                by=By.XPATH, value='//*[@id="clientreg_dobyear-selctrl"]')
            )
            select_country.select_by_value(str(birth_date.year))
            time.sleep(1)
            chrome_driver.find_element(
                by=By.XPATH, value="//*[@id='countryDobNextBtn']").click()

            sys_log_save(f'create_outlook_{self.item_object.id}', 'country and birth day selected')
            # print('exception : ', traceback.format_exc())
            find_email_elem = wait_for_element('xpath', 'one', '//*[@id="email"]', driver=chrome_driver)
            time.sleep(1)
            email_input = chrome_driver.find_element(by=By.XPATH, value="//*[@id='email']")
            for char_2 in user_name_email:
                email_input.send_keys(char_2)
                time.sleep(.2)
            email_input.send_keys(Keys.TAB)
            time.sleep(5)
            try:
                chrome_driver.find_element(by=By.XPATH, value="//*[contains(@class,'otkform-group-haserror') and contains(text(), 'The email address you have entered is already registered')]")
                return {'status_bool': False, 'status': 'failed', 'error': 'account already exists'}
            except:
                pass

            for iii in range(10):
                # origin id
                origin_id_input = chrome_driver.find_element(by=By.XPATH, value="//*[@id='originId']")
                origin_id = user_name[:10 - iii] + str(random.randint(1000, 10000))
                for char_2 in origin_id:
                    origin_id_input.send_keys(char_2)
                    time.sleep(.2)
                origin_id_input.send_keys(Keys.TAB)
                time.sleep(5)
                try:
                    chrome_driver.find_element(by=By.XPATH, value="//*[contains(@class,'otkform-group-haserror')]")
                    sys_log_save(f'create_outlook_{self.item_object.id}', 'origin id has error ', origin_id)
                    chrome_driver.find_element(by=By.XPATH, value="//*[@id='originId']").clear()
                    time.sleep(1)
                except:
                    break

            password_input_2 = chrome_driver.find_element(by=By.XPATH, value="//*[@id='password']")
            for char_2 in password:
                password_input_2.send_keys(char_2)
                time.sleep(.2)
            time.sleep(1)
            chrome_driver.find_element(by=By.XPATH, value="//*[@id='basicInfoNextBtn']").click()

            a = wait_for_element('xpath', 'one',
                                 '//div[@aria-hidden="false"]/*[@title="Verification challenge"]',
                                 driver=chrome_driver)

            sys_log_save(f'create_outlook_{self.item_object.id}', 'Verification challenge : ', a)
            try:
                chrome_driver.find_element(by=By.XPATH,
                                           value='//div[@aria-hidden="false"]/*[@title="Verification challenge"]')
                sys_log_save(f'create_outlook_{self.item_object.id}',
                             'this ip need captcha , solve it.', datetime.datetime.now())
                for i in range(100):

                    try:
                        # chrome_driver.find_element(by=By.XPATH, value="//*[*[contains(text(), 'I accept the')]]")
                        chrome_driver.find_element(by=By.XPATH, value="//div[@id='reg-sqa-privacy-panel' and contains(@style,'display: block')]")
                        self.update_worker_status('after solve captcha', update_time=False)
                        return {'status_bool': True, 'status': 'success', 'origin_id': origin_id}
                    except:
                        pass
                    try:
                        chrome_driver.find_element(by=By.XPATH,
                                                   value='//p[@class="otkc otkinput-errormsg otkform-group-help otkform-group-haserror" and contains(text(),"try that again.")]')
                        sys_log_save(f'create_outlook_{self.item_object.id}',
                                     'can not solve captcha , try again . ', datetime.datetime.now())
                        self.update_worker_status('cant solve captcha', update_time=False)
                        time.sleep(10)
                        return {'status_bool': False, 'status': 'failed'}
                    except MaxRetryError as err:
                        raise err
                    except:
                        pass
                    time.sleep(10)
                    if i >= 1:
                        play_need_help_sound()
                        self.update_worker_status('wait to solve captcha', update_time=False)
                chrome_driver.find_element(by=By.XPATH,
                                           value='//div[@aria-hidden="false"]/*[@title="Verification challenge"]')
                self.update_worker_status('cant solve captcha', update_time=False)
                return {'status_bool': False, 'status': 'failed'}
            except MaxRetryError as err:
                raise err
            except:
                sys_log_save(f'create_outlook_{self.item_object.id}', 'traceback 4 : ', traceback.format_exc())
                pass
            # chrome_driver.find_element(by=By.XPATH, value="//*[*[contains(text(), 'I accept the')]]")
            chrome_driver.find_element(by=By.XPATH, value="//div[@id='reg-sqa-privacy-panel' and contains(@style,'display: block')]")
            self.update_worker_status('after solve captcha 2', update_time=False)
            return {'status_bool': True, 'status': 'success', 'origin_id': origin_id}
        except:
            sys_log_save(f'create_outlook_{self.item_object.id}',
                         'error on create , check for technical difficalty , error : ', traceback.format_exc())
            try:
                chrome_driver.find_element(
                    by=By.XPATH,
                    value="//div[@id='panel-connection-error' and contains(@style,'display: block')]//*[contains(text(),'experiencing technical difficulties')]")
                sys_log_save(f'create_outlook_{self.item_object.id}', 'this ip has technical difficulties 2')
                time.sleep(10)
                return {'status_bool': False, 'status': 'failed', 'error': 'technical difficulties'}
            # except MaxRetryError as err:
            #     raise err
            except:
                sys_log_save(f'create_outlook_{self.item_object.id}', 'traceback 5 : ', traceback.format_exc())
                pass
            return {'status_bool': False, 'status': 'failed'}

    def login_to_origin(self, item_object, chrome_driver, user_name_email, open_link=False):
        sys_log_save(f'create_outlook_{self.item_object.id}', 'login to origin , open_link : ', open_link)
        if open_link:
            # login to ea
            sys_log_save(f'create_outlook_{self.item_object.id}', 'get link : ',
                         'https://www.ea.com/ea-sports-fc/ultimate-team/web-app/')
            chrome_driver.get('https://www.ea.com/ea-sports-fc/ultimate-team/web-app/')
            # press login
            elem = wait_for_element('xpath', 'one', '//*[@class="btn-standard call-to-action"]', driver=chrome_driver)
            time.sleep(2)
            chrome_driver.find_element(by=By.XPATH, value="//*[@class='btn-standard call-to-action']").click()
            time.sleep(5)
        try:
            email_input = chrome_driver.find_element(by=By.XPATH, value="//*[@id='email']")
            for char_2 in user_name_email:
                email_input.send_keys(char_2)
                time.sleep(.2)
        except:
            sys_log_save(f'create_outlook_{self.item_object.id}', 'email field not found')
        # enter password
        elem = wait_for_element('xpath', 'one', '//*[@id="password"]', driver=chrome_driver)
        time.sleep(1)
        password_input_4 = chrome_driver.find_element(by=By.XPATH, value="//*[@id='password']")
        for char_2 in item_object.password:
            password_input_4.send_keys(char_2)
            time.sleep(.2)
        time.sleep(1)
        chrome_driver.find_element(by=By.XPATH, value="//*[@id='logInBtn']").click()
        sys_log_save(f'create_outlook_{self.item_object.id}', 'after login btn pressed')
        # enable two factor auth
        try:
            wait_for_element('xpath', 'one', '//*[@id="secureBtn"]', driver=chrome_driver)
            time.sleep(2)
            chrome_driver.find_element(by=By.XPATH, value="//*[@id='secureBtn']").click()
        except:
            sys_log_save(f'create_outlook_{self.item_object.id}', 'cant find secureBtn')
        start_time_5 = datetime.datetime.now(local_tz)
        wait_for_element('xpath', 'one', '//*[@id="btnSendCode"]', driver=chrome_driver)
        time.sleep(2)
        chrome_driver.find_element(by=By.XPATH, value="//*[@id='btnSendCode']").click()
        wait_for_element('xpath', 'one', '//*[@id="twoFactorCode"]', driver=chrome_driver)
        security_code_3 = None
        for wait_time_3 in range(50):
            last_email = get_last_email(
                imap_user=user_name_email, imap_pass=item_object.password, imap_host='outlook.office365.com'
            )
            if last_email.get('body', None) and last_email.get('time') > start_time_5:
                # get security code
                search_security_code = re.search(r'Your EA Security Code is: (\d+)', last_email.get('subject'))
                if search_security_code:
                    sys_log_save(f'create_outlook_{self.item_object.id}', last_email.get('subject'))
                    security_code_3 = search_security_code.group(1)
                    break
                sys_log_save(f'create_outlook_{self.item_object.id}',
                             'last email not mach 2 , time : ', last_email.get('time'))
                time.sleep(10)
                if wait_time_3 == 10:
                    chrome_driver.find_element(by=By.XPATH, value="//*[@id='resend']").click()
                    sys_log_save(f'create_outlook_{self.item_object.id}','click resend code 3')
            elif wait_time_3 and wait_time_3 % 10 == 0:
                chrome_driver.find_element(by=By.XPATH, value="//*[@id='resend']").click()
                sys_log_save(f'create_outlook_{self.item_object.id}', 'click resend code 2')
            else:
                sys_log_save(f'create_outlook_{self.item_object.id}',
                             'last email : ', last_email.get('time'), ' start time : ', start_time_5)
                time.sleep(10)
                continue
        if security_code_3 is None:
            raise Exception('can not get origin security code 2')
        ea_security_input = chrome_driver.find_element(by=By.XPATH, value="//*[@id='twoFactorCode']")
        for char_3 in str(security_code_3):
            ea_security_input.send_keys(char_3)
        time.sleep(1)
        chrome_driver.find_element(by=By.XPATH, value="//*[@id='btnSubmit']").click()
        time.sleep(15)
        return {'status_bool': True, 'status': 'success'}

    def login_to_fifa_web_app(self, item_object, open_link=False):
        if open_link:
            pass


    def get_last_create_step(self, status):
        steps_dict = {key: index for index, (key, status) in enumerate(CREATE_OUTLOOK_STATUS)}
        if status in steps_dict:
            return steps_dict[status]
        else:
            return 0

    def update_worker_status(self, status_text : str, update_time=True):
        self.worker.refresh_from_db()
        self.worker.status = status_text
        if update_time:
            self.worker.status_change_time = timezone.localtime()
        self.worker.save()


if __name__ == '__main__':
    print('adding accounts from file : ')
    CreateOutlookMail().add_accounts_from_file()
#     a = NewOutlookAccount.objects.filter(user_name__in=[
#
# # 'ErnestoLillian2032',
# # 'YosefHelena2019',
# # 'GustavoCasey2041',
# # 'SamirJoy2025',
# # 'CairoNavy2014',
# # 'VicenteHaisley2021',
# # 'EduardoRosalyn2049',
#     ])
#     for item in a:
#         NewOutlookAccount.objects.create(
#             user_name=item.user_name,
#             password=item.password,
#             create_outlook=False,
#             first_name=item.first_name,
#             last_name=item.last_name,
#             birth_date=item.birth_date,
#             support_email=item.support_email,
#             support_password=item.support_password,
#             support_imap_host=item.support_imap_host,
#             create_origin=True,
#             console=Console.objects.get(name=99),
#             browser='tor_windows'
#         )
#         # break
#     print(a)
