# -*- coding: utf-8 -*-
import copy
import json
import os
import re
import shutil
import time
import traceback
import urllib
from collections import defaultdict, Counter, deque
from datetime import timedelta
from random import randint
from urllib.parse import urlencode

import cloudscraper
import pyotp
import requests
import telepot
import unidecode
from bs4 import BeautifulSoup
from celery.result import allow_join_result
from django.contrib.auth.models import User as django_user
from django.core.cache import caches
from django.db import close_old_connections
from django.db.models import Count, Sum, Subquery, OuterRef, Value, IntegerField, Q
from django.db.models.functions import Coalesce
from django.forms import model_to_dict
from django.utils import timezone
from django.utils.timezone import get_current_timezone
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

from accounts.consts import TRADE_ACCESS_DICT
from accounts.models import FifaAccount, FifaProxy, PlayerCard, FifaAccountSearch, \
    MuleAccounts, ItemPack, FifaAccountRequest, \
    CaptchaSolverLog, ConsoleBotSetting, AccountPackData, FifaAccountCurrentItems, \
    TelegramMessage, AccountBoughtItem, AccountLoginLog
from futplus.settings import BASE_DIR, CONSOLE_NAME_LIST, TIME_ZONE
from sbc import FIFA_REPORT_TOKEN, Fifa_REPORT_CHANNEL_ID, ARZBAZI_REPORT_GROUP_ID, \
    ARZBAZI_REPORT_TOPIC_SBC_THREAD_MESSAGE_ID, ARZBAZI_REPORT_TOPIC_ERRORS_THREAD_MESSAGE_ID, \
    ARZBAZI_REPORT_TOPIC_LOGS_THREAD_MESSAGE_ID, \
    ARZBAZI_REPORT_TOPIC_SQUAD_ERROR_THREAD_MESSAGE_ID, ARZBAZI_REPORT_TOPIC_SBC_ERRORS_THREAD_MESSAGE_ID, \
    ARZBAZI_REPORT_TOPIC_UNHANDLED_ERRORS_THREAD_MESSAGE_ID, ONE_WEEK_SECONDS, ONE_HOUR_SECONDS, ONE_DAY_SECONDS
from sbc.check_healthy import CheckHealthyRunner
from sbc.consts import SBC_TARGET_CLUBS
from sbc.login_to_ea_with_selenium import login_to_account, wait_for_element
from sbc.models import SBCWorker, SBCProcess, SBCTarget, SBCProcessTarget, SBCType, SBCTargetFilter, \
    AccountCheckHealthyWorker, AccountSBCNeedPlayer, SBCSolvationModel, SBCSolvationModelPlayers, \
    SBCSolvationModelWorker, RareFlag
from sbc.public_methods import new_print, get_trade_pile, force_get, set_main_log, sell_items, \
    set_sub_log, get_previous_price_grade, get_next_price_grade, most_common, get_round_top_price, \
    put_item_for_sale, get_round_price, force_post, get_player_data_by_asset_id, get_trade_pile_2, \
    get_player_fifa_name_by_id, clim_lvlup_objectives_milestones, set_sbc_status, pin_events_creator, \
    get_chemistryProfilesVersion, \
    convert_club_players_to_solvation_format, \
    convert_players_to_solvation_format, get_newest_solvations_players, \
    save_account_request, convert_futbin_time, get_storage_pile, \
    get_trade_access_from_usermassinfo, get_team_links_from_file, user_agent
from accounts.web_login_utils import logout_login
from squad_battle import OPEN_PACKS_MAX_TRADE_PILE
from utils import deep_get
from utils.ea_settings import fifa_host, fifa_23_address, fifa_first_address, accounts_ea_auth_url, fut_web_number, \
    futbin_address, fifa_host_2
from utils.login_to_ea_with_requests import LoginWithRequest
from utils.public_moves import PublicMoves
from utils.realy_public_methods import get_db_time
from utils.tools import select_platform


if os.name != 'nt':
    from futplus.celery_conf import app

# if os.name == 'nt':
#     import pandas as pd
#     from sbc.solvation_maker.optimize import SolvationCore
import pandas as pd
from sbc.solvation_maker.optimize import SolvationCore

file_path = os.path.dirname(os.path.abspath(__file__))

# TODO : proxy haye serverhaye mokhtalef tanzim shavad

bot = telepot.Bot(FIFA_REPORT_TOKEN)
similar_positions = {'LB': ['LB', 'LWB'], 'LWB': ['LWB', 'LB'],
                     'RB': ['RB', 'RWB'], 'RWB': ['RWB', 'RB'],
                     'LW': ['LW', 'LM', 'LF'], 'LM': ['LM', 'LW'],
                     'RW': ['RW', 'RM', 'RF'], 'RM': ['RM', 'RW'],
                     'LF': ['LF', 'LW'], 'RF': ['RF', 'RW'],
                     'CM': ['CM', 'CAM', 'CDM'], 'CAM': ['CAM', 'CM', 'CF'],
                     'CDM': ['CDM', 'CM'],
                     'CF': ['CF', 'CAM', 'ST'], 'ST': ['ST', 'CF'],
                     }
change_pos_prices = {'LWB-LB': 200, 'LB-LWB': 200, 'RWB-RB': 350, 'RB-RWB': 200, 'LM-LW': 1200, 'LW-LM': 950,
                     'RM-RW': 750,
                     'RW-RM': 900, 'LW-LF': 200, 'LF-LW': 200, 'RW-RF': 200, 'RF-RW': 200, 'CM-CAM': 1000,
                     'CAM-CM': 4700,
                     'CM-CDM': 1100, 'CDM-CM': 1900, 'CAM-CF': 550, 'CF-CAM': 1200, 'CF-ST': 1400, 'ST-CF': 2200}


class SBCSolver:

    def __init__(self, worker_id, fifa_account_id, username, password, platform, manual_loyal, running_platform=None,
                 use_public_moves=True, account_healthy_worker_id=None):
        self.fifa_account = FifaAccount.objects.get(id=fifa_account_id)
        self.account_healthy_worker = None
        if account_healthy_worker_id:
            self.account_healthy_worker = AccountCheckHealthyWorker.objects.get(id=account_healthy_worker_id)
        self.sbc_worker = SBCWorker.objects.get(id=worker_id)
        self.running_platform = running_platform or self.sbc_worker.running_platform
        self.sbc_worker.last_run_time = timezone.localtime()
        self.sbc_worker.error_description = ''
        self.sbc_worker.save(update_fields=['last_run_time', 'error_description'])

        self.se = requests.session()
        self.se2 = requests.session()
        self.sid = None
        self.fcas_sid = None
        self.persona_id = None
        self.nucleus_id = None

        self.console_first_run = True
        self.program_end_time = ''
        self.job_time_id = 0

        self.username = username
        self.password = password
        self.platform = platform
        self.manual_loyal = manual_loyal
        fifa_backup = self.fifa_account.account_backup_code.first()
        if not fifa_backup:
            raise Exception('NO app code or backup code found')
        self.backup_code = fifa_backup.backup_code
        self.app_auth = fifa_backup.app_code

        self.need_contracts = 0
        self.manager_need_contracts = 0
        self.need_heals = 0
        self.need_position_change = 0
        self.need_players_for_special_squad = []
        self.first_list = True
        self.all_sbc_completed = False
        self.can_get_help_for_discharge = False
        self.need_to_complete_first_sbcs = True
        self.max_delete_club_checked = False
        self.need_play_for_account = False
        self.cant_set_active_squad = False

        self.platform_key = select_platform[self.platform]['platform_key']
        self.server_key = select_platform[self.platform]['server_key']

        with open(os.path.join(BASE_DIR, 'version.txt'), 'a') as version_file2:
            pass
        with open(os.path.join(BASE_DIR, 'version.txt'), 'r') as version_file:
            current_version = version_file.read()
        text = '###########################################################################\nsbc job starting ...'
        new_print(self.fifa_account, text)
        new_print(self.fifa_account, 'username = ', self.username, ' password = ', self.password, ' platform = ',
                  self.platform, ' name in console ', self.fifa_account.name_in_console,
                  ' -- console = ', self.fifa_account.console, ' -- bot : ', self.__class__.__name__,
                  ' -- running platform : ', running_platform,
                  ' -- self.running platform : ', self.running_platform,
                  ' -- current version : ', current_version)

        self.now_time = timezone.localtime()
        self.main_dic = {}
        self.main_dic.update({
            'first_buy': 0, 'first_sold': 0, 'check_bug': 0,
            'start_time': timezone.localtime(),
            'temp_bid': 0,
            'temp_buy': 0, 'first_check': 0, 'soft_ban_counter': 0, 'bid_controller_count': 0,
            'bid_controller_time': timezone.localtime(),
            'bid_controller_report': 0, 'win_controller_count': 0, 'target_controller_count': 0,
            'weak_target_controller_count': 0,
            'captcha_start_time': '', 'captcha_end_time': '', 'loop_controller_count': 0,
            'temperory_not_bid': 0,
            'bug_count': 0,
            'fixed_bug_count': 0, 'driver': '', 'search_min_time': 0, 'search_max_time': 0,
            'transfer_list_len': 0,
            'transfer_more_than_limit': 0,
            'number_of_searchs': 0, 'temp_number_of_searchs': 0, 'reporter_time': timezone.localtime(),
            'temp_bid_controller': 0,
            'temp_win_controller': 0, 'remaining_buys': 0, 'invest_id': 0, 'invest_sell_check': 0,
            'sleep_time': 0,
            'check_proxy': 0,
            'first_xi': 0, 'puzzle_master': 0, 'no_xi': 0, 'no_master': 0, 'empty_bid_handler': 0,
            'first_buy_items': 0, 'no_credit': 0,
            'no_good_pack': 0, 'begin_new_sid': timezone.localtime(),
            'end_new_sid': timezone.localtime() + timedelta(seconds=3),
            'third_sbc_problem': 0, 'last_sbc_failed': 0, 'proxy_ip': '', 'proxy_port': '',
            'new_sid_set': 0,
            'soft_ban_handler': 0, 'completed': 0,
            'options_header': self.get_ea_options_header(),
        })

        self.main_dic['control_bid_time'] = timezone.localtime()
        self.main_dic['control_bid_bid'] = 0
        self.account_id = fifa_account_id
        self.fifa_account.refresh_from_db()
        self.fifa_account.login_status = 0
        self.fifa_account.save(update_fields=['login_status'])

        self.special_squad_players_build = [178005, 193082, 253163, 241486, 202884, 231443, 241096, 226161,
                                            190286, 214997, 199110]
        self.special_squad_players_build_with_position = {
            '178005': [178005, 'GK'], '193082': [193082, 'RB', 3],
            '253163': [253163, 'CB', 5], '241486': [241486, 'CB', 5],
            '202884': [202884, 'LB', 7], '231443': [231443, 'RM', 12],
            '241096': [241096, 'CM', 14], '226161': [226161, 'CM', 14],
            '190286': [190286, 'LM', 16], '214997': [214997, 'ST', 25], '199110': [199110, 'ST', 25],
        }

        self.useful_items = {
            'RW-RM': 5003066, 'LW-LM': 5003065, 'CM-CAM': 5003071, 'CDM-CM': 5003073, 'CM-CDM': 5003074,
            'CF-CAM': 5003076, 'CF-ST': 5003077, 'ST-CF': 5003078, 'CAM-CM': 5003072,
            # 500 price
            'BASIC': 5003095, 'ANCHOR': 5003110, 'HUNTER': 5003111, 'SHADOW': 5003113,
            # 200 price
            'HAWK': 5003100, 'ENGINE': 5003105, 'GK-BASIC': 5003118,
            # 'POSITION-MODIFIER': 5003181,
            }

        self.squad_positions_in_futbin = {
            '3-1-4-2': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid5', 'cardlid7', 'cardlid6',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '3-4-1-2': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid2', 'cardlid3', 'cardlid1'],
            '3-4-2-1': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid1', 'cardlid2'],
            '3-4-3': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                      'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '3-5-2': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid6', 'cardlid5', 'cardlid7',
                      'cardlid4', 'cardlid2', 'cardlid3', 'cardlid1'],
            '4-1-2-1-2': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid5', 'cardlid6',
                          'cardlid4', 'cardlid2', 'cardlid3', 'cardlid1'],
            '4-1-2-1-2(2)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid5', 'cardlid6',
                              'cardlid4', 'cardlid2', 'cardlid3', 'cardlid1'],
            '4-1-3-2': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid5', 'cardlid6',
                        'cardlid3', 'cardlid4', 'cardlid2', 'cardlid1'],
            '4-1-4-1': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-2-2-2': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-2-1-3': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-2-3-1': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-2-3-1(2)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                            'cardlid4', 'cardlid2', 'cardlid3', 'cardlid1'],
            '4-2-4': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                      'cardlid4', 'cardlid2', 'cardlid1', 'cardlid3'],
            '4-3-1-2': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-3-2-1': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid1', 'cardlid2'],
            '4-3-3': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                      'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-3-3(2)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid5', 'cardlid6',
                          'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-3-3(3)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid4',
                          'cardlid5', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-3-3(4)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid4',
                          'cardlid5', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-3-3(5)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid5', 'cardlid6',
                          'cardlid4', 'cardlid2', 'cardlid3', 'cardlid1'],
            '4-4-1-1': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-4-1-1(2)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                            'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-4-2': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                      'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-4-2(2)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid5', 'cardlid4',
                          'cardlid6', 'cardlid3', 'cardlid2', 'cardlid1'],
            '4-5-1': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid4',
                      'cardlid2', 'cardlid5', 'cardlid3', 'cardlid1'],
            '4-5-1(2)': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                          'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '5-1-2-2': ['cardlid11', 'cardlid10', 'cardlid7', 'cardlid9', 'cardlid8', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '5-2-1-2': ['cardlid11', 'cardlid10', 'cardlid7', 'cardlid9', 'cardlid8', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid2', 'cardlid3', 'cardlid1'],
            '5-2-2-1': ['cardlid11', 'cardlid10', 'cardlid7', 'cardlid9', 'cardlid8', 'cardlid6', 'cardlid5',
                        'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '5-3-2': ['cardlid11', 'cardlid10', 'cardlid7', 'cardlid9', 'cardlid8', 'cardlid6', 'cardlid5',
                      'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '5-2-3': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                      'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
            '5-4-1': ['cardlid11', 'cardlid10', 'cardlid9', 'cardlid8', 'cardlid7', 'cardlid6', 'cardlid5',
                      'cardlid4', 'cardlid3', 'cardlid2', 'cardlid1'],
        }

        # self.clubs_dict = {i[0]: i[1] for i in SBC_TARGET_CLUBS}
        # self.teams_dict_data = {}
        # for i in SBC_TARGET_CLUBS:
        #     player_team_name = i[1].replace(' ( women )', '')
        #     similar_club_names = [player_team_name,
        #                           player_team_name + ' ( women )']
        #     similar_club_ids = [int(iin[0]) for iin in SBC_TARGET_CLUBS if
        #                         iin[1] in similar_club_names]
        #     self.teams_dict_data.update({i[0]: {'team_id': i[0], 'team_name': i[1], 'similar_team_names':
        #         similar_club_names, 'similar_team_ids': similar_club_ids}})
        self.teams_dict_data = {}
        for iie in SBC_TARGET_CLUBS:
            self.teams_dict_data.update({
                iie[0]: {'team_id': iie[0], 'team_name': iie[1],
                         'similar_team_names': [iie[1]], 'similar_team_ids': [iie[0]]}
            })
        for iit in get_team_links_from_file()['teamChemLinks']:
            self.teams_dict_data[iit['teamId']]['similar_team_ids'] += iit['linkedTeams']
            self.teams_dict_data[iit['teamId']]['similar_team_ids'] = list(
                sorted(self.teams_dict_data[iit['teamId']]['similar_team_ids']))
        self.can_send_telegram = True
        if self.running_platform in ['console', 'console_web_pc', 'console_manage_accounts'] and use_public_moves:
            self.public_moves = PublicMoves(
                sbc_solver_instance=self,
                sbc_worker=self.sbc_worker, se=self.se, main_dic=self.main_dic, server_key=self.server_key,
            )
            self.can_send_telegram = False
        self.account_high_search_count = ConsoleBotSetting.objects.get(name='account_high_search_count').int_value
        self.last_time_get_new_sid = timezone.localtime()
        self.danger_get_new_sid_counter = 0

        self.all_club_players_by_search = {}
        self.all_club_players_by_get_bronze = []
        self.club_players_information = {}
        self.club_asset_id = []
        self.transfer_list_asset_id = []
        self.unassigned_asset_id = []
        self.sbc_storage_players = None

        self.pin_events_counter = 0

        self.coins_used_pack_open = 0
        self.chemistry_profile_version = None

        self.players_log_cache = caches['print_log']

        self.check_healthy_utils = CheckHealthyRunner(sbc_solver=self)

    def get_ea_options_header(self, method='GET'):
        return {
            'Accept': '*/*',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'en-US,en;q=0.5',
            'Connection': 'keep-alive',
            'Host': fifa_host,
            'Access-Control-Request-Headers': 'content-type,x-ut-sid',
            'Access-Control-Request-Method': method,
            'Origin': 'https://www.ea.com',
            'Referer': 'https://www.ea.com/',
            'User-Agent': user_agent
        }

    def get_pin_events_counter(self):
        self.pin_events_counter += 1
        return self.pin_events_counter

    def get_new_sid_by_access_token(self, sid=None, game_sku=None):
        login_log = AccountLoginLog.objects.create(fifa_account=self.fifa_account, login_method=3)
        if not game_sku:
            pre_game_sku = 'FFA25'  # TODO: maybe read from shards v2
            if self.fifa_account.platform == 'pc':  # TODO: get this from shards
                game_sku = '%sPCC' % pre_game_sku
            elif self.fifa_account.platform == 'xbox360':
                game_sku = '%sXBO' % pre_game_sku
            elif self.fifa_account.platform == 'xboxs':
                game_sku = '%sXSX' % pre_game_sku
            # elif self.fifa_account.platform == 'ps3':
            #     game_sku = '%sPS3' % pre_game_sku  # not tested
            elif self.fifa_account.platform == 'ps':
                game_sku = '%sPS4' % pre_game_sku
            elif self.fifa_account.platform == 'ps5':
                game_sku = '%sPS5' % pre_game_sku
            else:
                raise Exception('Wrong platform. (Valid ones are pc/xbox/xbox360/ps3/ps4/ps5)')
        if not sid:
            new_print(self.fifa_account, 'getting new sid by access token , sid : ', sid)
            if not self.main_dic.get('header'):
                self.set_this_staff_to_pass_logout_login()

            # url = "https://accounts.ea.com/connect/auth?&redirect_uri=nucleus:rest&response_type=code&access_token=" \
            #       "%s" \
            #       "&release_type=prod&client_sequence=ut-auth" % self.fifa_account.access_token
            url = accounts_ea_auth_url
            save_account_request(
                fifa_account=self.fifa_account,
                link='https://accounts.ea.com/connect/auth?client_id=FC25_JS_WEB_APP&redirect_uri=nucleus:rest&response_type=code&access_token',
            )
            auth_params = {
                'client_id': 'FUTWEB_BK_OL_SERVER',
                'redirect_uri': 'nucleus:rest',
                'response_type': 'code',
                'access_token': str(self.fifa_account.access_token),
                'release_type': 'prod',
                'client_sequence': 'ut-auth',
            }
            headers = {
                'Content-Type': 'application/json',
                'Host': fifa_host,
                'Origin': 'https://www.ea.com',
                'Referer': 'https://www.ea.com/',
                'User-Agent': user_agent,
                'Accept': 'text/plain, */*; q=0.01'
            }

            self.se.headers.update(headers)
            # response = requests.request("GET", url, headers=headers, data=payload)
            response = self.se.get(url, headers=headers, params=auth_params)
            # save_account_request(
            #     fifa_account=self.fifa_account,
            #     link=url,
            # )
            # todo : fix data. json response has error
            new_print(self.fifa_account, 'ea auth response : ', response.text)
            json_resp = response.json()
            if json_resp.get('error', ''):
                new_print(self.fifa_account, 'access token is expired. need a new one')
                return False
            auth_code = json_resp['code']
            new_print(self.fifa_account, 'auth_code = ', auth_code)
            url2 = f"https://{fifa_host}/ut/auth"
            payload = {
                "isReadOnly": False,
                "sku": fut_web_number,
                "clientVersion": 1,
                "locale": "en-US",
                "method": "authcode",
                "priorityLevel": 4,
                "identification": {
                    "authCode": auth_code,
                    "redirectUrl": "nucleus:rest",
                    "tid": "RETAIL",
                },
                "nucleusPersonaId": int(self.fifa_account.persona_id),
                "gameSku": game_sku,
                "ds": "a010c20b65fcf46a0f6e40113b44b17d4badbdabd268582979e4acb81c7e9434/9bf9"
            }
            new_print(self.fifa_account, 'get new sid payload = ', payload)
            headers = {
                'Content-Type': 'application/json',
                'Origin': 'https://www.ea.com',
                'Referer': 'https://www.ea.com/',
                'Host': fifa_host,
                'User-Agent': user_agent,
                'Accept': '*/*'
            }

            # response = requests.request("POST", url, headers=headers, data=payload)
            response = self.se.post(url2, json=payload, headers=headers, )

            save_account_request(
                fifa_account=self.fifa_account,
                link=url2
            )
            new_print(self.fifa_account, 'auth response 2 : ', response.status_code, response.text)
            try:
                json_resp = response.json()
                if json_resp.get('sid', ''):
                    new_print(self.fifa_account, 'getting new sid is ok . new sid = ', json_resp['sid'])
                    self.sid = json_resp['sid']
                    self.main_dic['header'].update(self.se.headers)
                else:
                    new_print(self.fifa_account, 'app auth not working. will use the normal get new sid')
                    return False
            except:
                new_print(self.fifa_account,
                          'app auth not working. will use the normal get new sid , error : ',  traceback.format_exc())
                # new_print(self.fifa_account, 'app auth not working. will use the normal get new sid')
                return False
        else:
            new_print(self.fifa_account, 'getting new sid by old sid : ', sid)
            if not self.main_dic.get('header'):
                self.set_this_staff_to_pass_logout_login()
            try:
                self.nucleus_id = self.fifa_account.nucleus_id
                self.persona_id = self.fifa_account.persona_id

                # global pin_enevts_data
                self.main_dic['header'] = {
                    'Content-Type': 'application/json',
                    'Origin': 'https://www.ea.com',
                    'Referer': 'https://www.ea.com/',
                    'User-Agent': user_agent,
                    'X-UT-SID': sid,
                    'Accept': '*/*',
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept-Language': 'en-US,en;q=0.5',
                    'Connection': 'keep-alive',
                    'Host': fifa_host,
                }
                try:
                    data_2 = {"isReadOnly": False,
                              "sku": fut_web_number,
                              "clientVersion": 1,
                              "nucleusPersonaId": self.persona_id,
                              "gameSku": game_sku,
                              "locale": "en-US",
                              "method": "ACCESS_TOKEN",
                              "priorityLevel": 4,
                              "identification": {"redirectUrl": "nucleus:rest"},
                              }
                    headers_2 = self.main_dic['header']
                    headers_2.update({
                        'Host': fifa_host_2, 'Accept': '*/*',
                        'Authorization': f'Bearer {self.fifa_account.access_token}'

                    })
                    rc8_2 = self.se.post(f'https://{fifa_host_2}/fc/auth', data=json.dumps(data_2),
                                         headers=headers_2, timeout=20)
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=f'{fifa_23_address}/user/auth'
                    )
                    rc9_2 = rc8_2.json()
                    self.fcas_sid = rc9_2['sid']
                    self.se.get(f'https://{fifa_host_2}/fc/user', timeout=20)
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=f'{fifa_23_address}/fc/user'
                    )
                except:
                    new_print(self.fifa_account, 'error on get fcas_sid 1 , ', traceback.format_exc())
                # fake_trade_id = TradeLog.objects.filter(
                #     create_time__gt=timezone.localtime() - timezone.timedelta(days=7)
                # ).exclude(
                #     trade_id__in=['', None],
                # ).last()
                # if fake_trade_id:
                #     fake_trade_id = fake_trade_id.trade_id
                # else:
                #     fake_trade_id = 466355881582
                # check_resp = self.check_trade(fake_trade_id)
                self.se.headers.update(self.main_dic['header'])
                # check_resp = self.se.get(f'{fifa_23_address}/tradepile')
                # save_account_request(
                #     fifa_account=self.fifa_account,
                #     link=f'{fifa_23_address}/tradepile',
                # )
                check_resp = self.se.get(f'{fifa_23_address}/user/credits')
                save_account_request(
                    fifa_account=self.fifa_account,
                    link=f'{fifa_23_address}/user/credits'
                )
                new_print(self.fifa_account, 'get new sid check trade result : ', check_resp, check_resp.text[:100])
                json_check_resp = check_resp.json()
                # new_print(self.fifa_account, json_check_resp)
                if json_check_resp.get('credits', None) is not None:
                    self.sid = sid
                if json_check_resp.get('reason', '') == 'expired session':
                    return False
            except:
                new_print(self.fifa_account, 'can not login with old sid ', traceback.format_exc())
                return False

        self.nucleus_id = self.fifa_account.nucleus_id
        self.persona_id = self.fifa_account.persona_id

        self.fifa_account.refresh_from_db()
        self.fifa_account.sid = self.sid
        self.fifa_account.save(update_fields=['sid'])

        self.main_dic['header'] = {
            'Content-Type': 'application/json',
            'Origin': 'https://www.ea.com',
            'Referer': 'https://www.ea.com/',
            'User-Agent': user_agent,
            'X-UT-SID': self.sid,
            'Accept': '*/*',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'en-US,en;q=0.5',
            'Connection': 'keep-alive',
            'Host': fifa_host,
        }
        login_log.login_status = 1
        login_log.save(update_fields=['login_status'])
        return True

    def get_new_sid(self, ):
        try:
            if (timezone.localtime() - self.last_time_get_new_sid).total_seconds() < 120:
                self.danger_get_new_sid_counter += 1
                if self.danger_get_new_sid_counter > 10:
                    # self.sbc_worker.refresh_from_db()
                    self.sbc_worker.has_error = True
                    self.sbc_worker.error_description = 'too many login'
                    self.sbc_worker.save(update_fields=['has_error', 'error_description'])
                    self.send_message(bot, 123, f'account {self.fifa_account.user_name} too many login')
                    raise Exception('too many login')
            self.last_time_get_new_sid = timezone.localtime()
            new_print(self.fifa_account, f'getting new sid started , last time : {self.last_time_get_new_sid} , danger counter : {self.danger_get_new_sid_counter}')
            # new_print(self.fifa_account,'here i am')
            if self.sbc_worker.must_done:
                time.sleep(2)
                new_print(self.fifa_account, 'must done bot')
                raise Exception('must done bot')
            self.fifa_account.refresh_from_db()
            if not self.fifa_account.active:
                self.fifa_account.active = True
                self.fifa_account.save(update_fields=['active'])
            if self.fifa_account.need_captcha:
                new_print(self.fifa_account, 'captcha set in database')
                return

            if self.fifa_account.access_token and self.fifa_account.nucleus_id:
                logined_with_new_sid = False
                try:
                    if self.get_new_sid_by_access_token():
                        time.sleep(0.5)
                        self.update_credit()
                        time.sleep(0.5)
                        logined_with_new_sid = True
                        return
                except:
                    new_print(self.fifa_account, 'error 47 : ', traceback.format_exc())
                    close_old_connections()
                if not logined_with_new_sid:
                    new_print(self.fifa_account, 'not logined with new sid , try to login with requests')
                    try:
                        new_print(self.fifa_account,
                                  'cant get_new_sid_by_access_token so try to login with requests')
                        if self.fifa_account.console:
                            proxy_ip, proxy_port, proxy_user, proxy_pass, proxy_id = '', '', '', '', ''
                        else:
                            proxy_type_name = ''
                            if self.running_platform == 'web_healthy':
                                proxy_type_name = 'web_healthy'
                            if self.fifa_account.id in MuleAccounts.objects.values_list('fifa_account__id', flat=True):
                                proxy_type_name = 'mule'
                            set_proxy_result = self.set_sbc_proxy(proxy_type_name=proxy_type_name)
                            if set_proxy_result.get('status_bool') is True:
                                proxy_ip = set_proxy_result.get('proxy_host')
                                proxy_port = set_proxy_result.get('proxy_port')
                                proxy_user = set_proxy_result.get('proxy_user')
                                proxy_pass = set_proxy_result.get('proxy_pass')
                                proxy_id = set_proxy_result.get('proxy_id')
                            else:
                                new_print(self.fifa_account, 'proxy error 2 , ', set_proxy_result)
                                return {'status_bool': False, 'status': 'failed',
                                        'reason': set_proxy_result.get('error')}
                            # proxy_ip, proxy_port, proxy_user, proxy_pass, proxy_id = self.set_sbc_proxy(proxy_type_name=proxy_type_name)
                        fifa_backup = self.fifa_account.account_backup_code.first()
                        app_auth = fifa_backup.app_code
                        login_log = AccountLoginLog.objects.create(fifa_account=self.fifa_account, login_method=1)
                        login_result = LoginWithRequest(
                            fifa_account=self.fifa_account
                        ).new_login(
                            email=self.fifa_account.user_name, password=self.fifa_account.password, totp=app_auth,
                            proxy_ip=proxy_ip,
                            proxy_port=proxy_port, proxy_user=proxy_user, proxy_pass=proxy_pass,
                            platform=self.fifa_account.platform,
                            cookies=self.fifa_account.requests_cookies
                        )
                        if login_result.get('status_bool') is False:
                            new_print(self.fifa_account, 'login status false , result is : ', login_result)
                            if login_result.get('error') == 'need create club':
                                raise Exception('need create club')
                        else:
                            n_session = login_result.get('session')
                            n_sid = login_result.get('sid')
                            n_fcas_sid = login_result.get('fcas_sid')
                            n_persona_id = login_result.get('persona_id')
                            n_nucleus_id = login_result.get('nucleus_id')
                            n_access_token = login_result.get('access_token')
                            n_cookies = login_result.get('cookies')
                            time.sleep(2)
                            self.fifa_account.refresh_from_db()
                            self.fifa_account.access_token = n_access_token
                            self.fifa_account.nucleus_id = n_nucleus_id
                            self.fifa_account.persona_id = n_persona_id
                            self.fifa_account.sid = n_sid
                            self.fifa_account.requests_cookies = n_cookies
                            self.fifa_account.save(
                                update_fields=['access_token', 'nucleus_id', 'persona_id', 'sid', 'requests_cookies']
                            )
                            login_log.login_status = 1
                            login_log.save(update_fields=['login_status'])
                            self.se = n_session
                            self.main_dic['header'] = n_session.headers
                            self.fcas_sid = n_fcas_sid
                            new_print(self.fifa_account, 'login with request success 1')
                            return
                    except:
                        new_print(self.fifa_account, 'cant login with requests, error : ', traceback.format_exc())
                        close_old_connections()

            self.main_dic['begin_new_sid'] = timezone.localtime()
            self.fifa_account.driver = 1
            self.fifa_account.save(update_fields=['driver'])
            self.fifa_account.refresh_from_db()

            refresh_count = 0
            while True:
                if refresh_count >= 1:
                    break

                # new_print(self.fifa_account,'number of refresh count in get new sid = ', refresh_count)
                text = 'number of refresh count in get new sid = ' + str(refresh_count)
                new_print(self.fifa_account, text)
                try:
                    try:
                        self.main_dic['driver'].get(fifa_first_address)
                    except:
                        cookies = self.fifa_account.selenium_cookies
                        if cookies:
                            cookies = json.loads(cookies)
                        new_print(self.fifa_account, 'proxy_data = ', self.main_dic.get('proxy_ip'),
                                  self.main_dic.get('proxy_port'),
                                  self.main_dic.get('proxy_user'), self.main_dic.get('proxy_pass'))
                        self.main_dic['driver'], self.main_dic[
                            'futbin_cookies'], need_to_close_ultimate_in_console, need_to_create_club = login_to_account(
                            self.username, self.password, '', use_proxy=1, proxy_ip=self.main_dic.get('proxy_ip'),
                            proxy_port=self.main_dic.get('proxy_port'), proxy_user=self.main_dic.get('proxy_user'),
                            proxy_pass=self.main_dic.get('proxy_pass'), app_auth=self.app_auth, cookies=cookies
                        )
                        if need_to_close_ultimate_in_console and self.running_platform in [
                            'console', 'console_web', 'console_web_pc']:
                            # self.main_dic['driver'].close()
                            self.main_dic['driver'].quit()
                            if os.name == 'nt':
                                os.system("TASKKILL /F /IM chromedriver.exe")
                            self.public_moves.console_open_ultimate()
                            self.console_close_ultimate()
                            self.main_dic['driver'], self.main_dic[
                                'futbin_cookies'], need_to_close_ultimate_in_console, need_to_create_club = login_to_account(
                                self.username, self.password, '', use_proxy=1, proxy_ip=self.main_dic.get('proxy_ip'),
                                proxy_port=self.main_dic.get('proxy_port'), proxy_user=self.main_dic.get('proxy_user'),
                                proxy_pass=self.main_dic.get('proxy_pass'), app_auth=self.app_auth, cookies=cookies
                            )
                        if need_to_create_club and self.running_platform in [
                            'console', 'console_web', 'console_web_pc']:
                            new_print(self.fifa_account, 'need ro create club from getting new sid')
                            # self.main_dic['driver'].close()
                            self.main_dic['driver'].quit()
                            if os.name == 'nt':
                                os.system("TASKKILL /F /IM chromedriver.exe")
                            self.public_moves.console_open_ultimate(state_set='play_main')
                            if self.public_moves.create_club():
                                new_print(self.fifa_account, 'create club successful')
                                self.console_close_ultimate()
                                self.public_moves.console_login_utils.put_on_rest_mode()
                                # self.sbc_worker.refresh_from_db()
                                self.sbc_worker.has_error = True
                                self.sbc_worker.error_description = 'create club needed'
                                self.sbc_worker.save(update_fields=['has_error', 'error_description'])
                                self.handle_end_bot()
                                os.system("TASKKILL /F /IM run_console_manager.exe")
                                os.system("TASKKILL /F /IM run_console_manager.exe")
                                os.system("TASKKILL /F /IM run_console_manager.exe")
                                os.system("TASKKILL /F /IM python.exe")
                                return

                except:
                    new_print(self.fifa_account, 'error 46 : ', traceback.format_exc())
                    try:
                        self.main_dic['driver'].quit()
                    except:
                        new_print(self.fifa_account, 'error on close driver , ', traceback.format_exc())
                    close_old_connections()

                    # self.handle_end_bot()
                    # self.send_message(bot, '123', 'check account sbc log %s' % self.username)
                    # raise Exception('must done bot')
                    login_result = logout_login(self, self.sbc_worker, self.fifa_account)
                    if login_result.get('status_bool') is False:
                        self.sbc_worker.has_error = True
                        self.sbc_worker.error_description = login_result.get('reason')
                        self.sbc_worker.save(update_fields=['has_error', 'error_description'])
                        self.handle_end_bot()
                        return login_result.get('reason')

                elem = wait_for_element('class', 'one', 'view-navbar-currency-coins', special='captcha',
                                        driver=self.main_dic['driver'])
                new_print(self.fifa_account, 'wait for element driver : ', self.main_dic['driver'])
                self.main_dic['driver'].get_screenshot_as_file(file_path + '/logs/sid%s.png' % str(self.account_id))
                signed_in_elem = wait_for_element('xpath', 'one',
                                                  "//h2[contains(text(),'Signed Into Another Device')]",
                                                  special='break',
                                                  driver=self.main_dic['driver'])
                if signed_in_elem:
                    if self.running_platform in ['console_web', 'console_web_pc']:
                        return 'console login'
                    new_print(self.fifa_account, 'console login w8 5 minutes')
                    time.sleep(300)
                    continue

                refresh_count += 1
                new_print(self.fifa_account, 'view-navbar-currency-coins = ', elem)

                if elem:
                    break
                if not elem:
                    elem = wait_for_element('xpath', 'one', "//h2[contains(text(),'Verification Required')]",
                                            special='break',
                                            driver=self.main_dic['driver'])
                    if not elem:
                        try:
                            new_print(self.fifa_account, 'not elem')
                            elem = wait_for_element('class', 'one', 'call-to-action',
                                                    driver=self.main_dic['driver'])
                            ActionChains(self.main_dic['driver']).move_to_element(elem).click().perform()
                            elem = wait_for_element('class', 'one', 'view-navbar-currency-coins',
                                                    driver=self.main_dic['driver'])
                            if elem:
                                break
                        except:
                            pass
                    else:
                        new_print(self.fifa_account, 'captcha found')
                        self.main_dic['driver'].get_screenshot_as_file(
                            file_path + '/logs/captcha%s.png' % str(self.account_id))

                        self.main_dic['captcha_start_time'] = timezone.localtime()
                        self.fifa_account.refresh_from_db()
                        self.fifa_account.need_captcha = 1
                        self.fifa_account.save(update_fields=['need_captcha'])
                        last_24_hour_need_captcha = CaptchaSolverLog.objects.filter(
                            fifa_account=self.fifa_account,
                            create_time__gt=timezone.localtime() - timezone.timedelta(hours=24))
                        if last_24_hour_need_captcha.count() >= 1:
                            message_text = f'account {self.fifa_account.user_name} have been captcha 1 time in 24 hour. find problem.'
                            new_print(self.fifa_account, message_text)
                            self.send_message(bot, 123, message_text)
                            time.sleep(300)
                            return 'can not solve captcha'
                        captcha_solver_log = CaptchaSolverLog.objects.create(
                            fifa_account=self.fifa_account,
                        )
                        # if CaptchaSolverLog.objects.filter(
                        #         captcha_solver_name='solve_with_anticaptcha'
                        # ).count() < 50:
                        #     captcha_solver_log.captcha_solver_name = 'solve_with_anticaptcha'
                        #     captcha_solver_log.save()
                        #     solver_result = self.solve_with_anticaptcha()
                        # else:
                        #     captcha_solver_log.captcha_solver_name = 'solve_with_ramin_captcha'
                        #     captcha_solver_log.save()
                        #     solver_result = self.solve_with_ramin_captcha()
                        if (self.fifa_account.console and self.fifa_account.console.name in list(range(9000, 10000))
                        ) or (self.fifa_account.id in MuleAccounts.objects.filter(investors__id__in=[18, ]).values_list('fifa_account__id') or
                        self.fifa_account.creator and self.fifa_account.creator.id in [18, ]):
                            captcha_solver_log.captcha_solver_name = 'solve_with_ramin_captcha'
                            captcha_solver_log.save()
                            solver_result = self.solve_with_ramin_captcha()
                        else:
                            # captcha_solver_log.captcha_solver_name = 'solve_with_anticaptcha'
                            captcha_solver_log.captcha_solver_name = 'solve_with_ramin_captcha_new'
                            captcha_solver_log.save()
                            # solver_result = self.solve_with_anticaptcha()
                            solver_result = self.solve_with_ramin_captcha('51d6f1b562d03ccf8fe69ea7666f19f8')
                        if solver_result and solver_result == 'captcha solved':
                            captcha_solver_log.solve_status = 'captcha solved'
                            captcha_solver_log.save()
                            refresh_count = 2
                        else:
                            captcha_solver_log.solve_status = solver_result
                            captcha_solver_log.save()
                            return solver_result

            self.sid = self.main_dic['driver'].execute_script(
                "return services.Authentication.utasSession.id")
            self.fifa_account.refresh_from_db()
            self.fifa_account.sid = self.sid
            self.fifa_account.save(update_fields=['sid'])

            self.nucleus_id = self.main_dic['driver'].execute_script(
                "return services.User.getUser().id")

            platforms_skus = {'ps': ['FFA25PS4', 'FFA25PS5'], 'xbox360': ['FFA25XBO'], 'xboxs': ['FFA25XSX']}
            persona = self.main_dic['driver'].execute_script("return services.User.getUser().personas[0]['id']")
            for i in range(100):
                if self.main_dic['driver'].execute_script(
                    f"return services.User.getUser().personas[{i}]"):
                    skus = self.main_dic['driver'].execute_script(
                        "return services.User.getUser().personas[%s]['_sku']" % i)
                    if skus in platforms_skus.get(self.fifa_account.platform, []):
                        persona = self.main_dic['driver'].execute_script(
                            "return services.User.getUser().personas[%s]['id']" % i)
                        break
            persona = str(persona)
            access_token = self.main_dic['driver'].execute_script(
                "return window.localStorage.getItem('_eadp.identity.access_token')")
            new_print(self.fifa_account, 'access_token = ', access_token)
            self.fifa_account.refresh_from_db()
            self.fifa_account.access_token = access_token
            self.fifa_account.nucleus_id = self.nucleus_id
            self.fifa_account.persona_id = persona
            self.fifa_account.save()

            self.persona_id = int(persona)
            new_print(self.fifa_account, ' persona_id = ', self.persona_id,
                      ' , nucleus_id = ', self.nucleus_id,
                      ' , sid = ', self.sid)

            # global pin_enevts_data
            self.main_dic['header'] = {
                'Content-Type': 'application/json',
                'Origin': 'https://www.ea.com',
                'Referer': 'https://www.ea.com/',
                'User-Agent': user_agent,
                'X-UT-SID': self.sid,
                'Accept': '*/*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'en-US,en;q=0.5',
                'Connection': 'keep-alive',
                'Host': fifa_host,
            }
            self.main_dic['pin_enevts_header'] = {'Content-Type': 'application/json',
                                                  'Origin': 'https://www.ea.com',
                                                  'Referer': 'https://www.ea.com/',
                                                  'User-Agent': user_agent,
                                                  'Accept': '*/*',
                                                  'Accept-Encoding': 'gzip, deflate, br',
                                                  'Accept-Language': 'en-US,en;q=0.5',
                                                  'Connection': 'keep-alive',
                                                  'Host': fifa_host,
                                                  'x-ea-game-id': fut_web_number, 'x-ea-game-id-type': 'easku',
                                                  'x-ea-taxv': '1.1'
                                                  }
            self.main_dic['pin_enevts_option_header'] = {
                'Access-Control-Request-Headers': 'content-type,x-ea-game-id,x-ea-game-id-type,x-ea-taxv',
                'Access-Control-Request-Method': 'POST',
                'Origin': 'https://www.ea.com',
                'Referer': 'https://www.ea.com/',
                'User-Agent': user_agent
            }
            self.main_dic['driver'].get_screenshot_as_file(os.path.join(BASE_DIR, 'logs/get_new_sid_tmp.png'))
            self.main_dic['end_new_sid'] = timezone.localtime()
            self.main_dic['driver'].quit()
            if os.name == 'nt':
                os.system("TASKKILL /F /IM chromedriver.exe")

            self.fifa_account.refresh_from_db()
            self.fifa_account.driver = 0
            self.fifa_account.save(update_fields=['driver'])

        except:
            new_print(self.fifa_account, 'error 44 : ', traceback.format_exc())
            close_old_connections()
            raise Exception('error in get sid')
        # time.sleep(20)

    def get_new_backup_codes(self, driver, backup_code, app_code=None):
        new_print(self.fifa_account, 'getting backup code started')
        driver.get('https://myaccount.ea.com/am/ui/security-privacy/login-verification')
        time.sleep(5)
        password_elem = wait_for_element('xpath', 'one', "//input[@name = 'password']",
                                         driver=driver, wait_time=20)
        if password_elem:
            new_print(self.fifa_account, 'need to press password : ', password_elem)
            password_elem.send_keys(str(self.fifa_account.password))
            time.sleep(5)
            sign_in_button = wait_for_element('xpath', 'one', "//*[@id = 'logInBtn']",
                                             driver=driver, wait_time=1)
            self.custome_click(sign_in_button)
            time.sleep(10)
        trust_icon = wait_for_element('xpath', 'on', "//*[@id = 'truste-consent-button']", driver=driver, wait_time=1)
        if trust_icon:
            self.custome_click(trust_icon)

        elem = wait_for_element('xpath', 'one', "//*[@id = 'enter-tfa-button']", driver=driver)
        self.custome_click(elem)
        time.sleep(2)
        elem = wait_for_element('xpath', 'one', "//*[@id = 'verify-identity-app-radio-button']", driver=driver)
        self.custome_click(elem)
        time.sleep(1)
        elem = wait_for_element('xpath', 'one', "//*[@id = 'verify-identity-modal-confirm']", driver=driver)
        self.custome_click(elem)
        time.sleep(2)

        # elem = wait_for_element('xpath', 'one', "//div[text() = 'Security']", driver=driver)
        # # ActionChains(driver).move_to_element(elem).click().perform()
        # self.custome_click(elem)
        # time.sleep(2)
        # elem = wait_for_element('id', 'one', 'showBkpCodesLink', driver=driver)
        # # ActionChains(driver).move_to_element(elem).click().perform()
        # self.custome_click(elem)
        # time.sleep(2)
        # elem = wait_for_element('id', 'one', 'mfa_app_radio_label', driver=driver)
        # elem.click()
        # time.sleep(2)
        # elem = wait_for_element('id', 'one', 'mfa_send_mfa_code_span', driver=driver)
        # # ActionChains(driver).move_to_element(elem).click().perform()
        # self.custome_click(elem)
        # time.sleep(2)
        # elem = wait_for_element('id', 'one', 'mfa_code_input', driver=driver)
        elem = wait_for_element('xpath', 'one', "//input[@type = 'text']", driver=driver)
        if app_code:
            db_time = int(get_db_time(timezone_=TIME_ZONE).timestamp())
            backup_code = pyotp.TOTP(app_code).at(db_time)
        try:
            elem.send_keys(backup_code)
        except:
            text = f'problem in send backup code for {self.username}'
            new_print(self.fifa_account, text, ' error : ', traceback.format_exc())
            driver.get_screenshot_as_file(os.path.join(BASE_DIR, f'logs/send_backup_error{self.username}.png'))
            self.send_message(bot, 123, text, message_thread_id=ARZBAZI_REPORT_TOPIC_ERRORS_THREAD_MESSAGE_ID)
            self.handle_end_bot()
            time.sleep(50)
        time.sleep(1)

        elem = wait_for_element('id', 'one', 'verify-identity-modal-confirm', driver=driver)
        # ActionChains(driver).move_to_element(elem).click().perform()
        self.custome_click(elem)
        time.sleep(10)
        elem = wait_for_element('xpath', 'one', "//*[@id= 'tfa-section-details-view-backup-code']", driver=driver)
        time.sleep(1)
        if elem:
            elem = driver.find_elements(By.XPATH, "//*[@id='tfa-section-details-view-backup-code']")[-1]
            self.custome_click(elem)
            time.sleep(5)

        for ii in range(2):
            # elem = wait_for_element('id', 'one', 'backupcodes_table', driver=driver)
            # backup_table = elem.get_attribute('outerHTML')
            # # print backup_table
            elem = wait_for_element('xpath', 'one', "//div[div[span[contains(text(), 'Backup codes are the only way to log in')]]]/div[3]//span", driver=driver)
            driver.get_screenshot_as_file(os.path.join(BASE_DIR, f'logs/new_backup{self.username}.png'))
            begin_backup = 0
            new_backup_codes = []
            # for itt in range(backup_table.count('<strong>')):
            #     begin_backup = backup_table.find('<strong>', begin_backup) + len('<strong>')
            #     end_backup = backup_table.find('</strong>', begin_backup)
            #     backup = backup_table[begin_backup:end_backup]
            for itt in driver.find_elements(By.XPATH, "//div[div[span[contains(text(), 'Backup codes are the only way to log in')]]]/div[3]//span"):
                backup = itt.text
                backup = (backup.split('.'))[1]
                new_backup_codes.append(backup)
            if len(new_backup_codes) > 2:
                break
            new_print(self.fifa_account, 'old backup codes is low , request news')
            elem = wait_for_element('xpath', 'one', "//span[text() = 'Create new code']", driver=driver)
            # ActionChains(driver).move_to_element(elem).click().perform()
            self.custome_click(elem)
            time.sleep(3)
        new_print(self.fifa_account, 'get new backup code is done , ', new_backup_codes)
        return new_backup_codes

    def set_account_proxy(self, proxy_id, host, port):
        fifa_proxy = FifaProxy.objects.get(id=proxy_id)
        proxies = {
            'http': f'http://{fifa_proxy.user_name}:{fifa_proxy.password}@{host}:{port}',
            'https': f'http://{fifa_proxy.user_name}:{fifa_proxy.password}@{host}:{port}',
        }
        new_print(self.fifa_account, 'proxy info  : ', proxies)
        # if os.name != 'nt':
        if True:
            self.se.proxies.update(proxies)
        try:
            # resp = self.se.get("https://icanhazip.com/")
            resp = self.se.get("http://142.132.177.244:8000/accounts/get-local-timezone/")
            new_print(self.fifa_account, 'proxy set resp = ', resp.text)
        except:
            text = 'cant set this proxy %s account %s' % (proxy_id, self.username)
            self.send_message(bot, 123, text)
            new_print(self.fifa_account, 'can`t set proxy. icanhazip error : ')
            fifa_proxy.delete()
            self.handle_end_bot()
            time.sleep(30)
            return
        self.fifa_account.proxy = FifaProxy.objects.get(id=proxy_id)
        self.fifa_account.save(update_fields=['proxy'])
        self.fifa_account.refresh_from_db()
        new_print(self.fifa_account, 'proxy_id = ', proxy_id)

    def set_sbc_proxy(self, change=0, proxy_type_name=''):
        account_proxy = self.fifa_account.proxy
        new_print(self.fifa_account, 'set sbc proxy . current proxy : ', self.fifa_account.proxy,
                  ' change : ', change, ' proxy type name : ', proxy_type_name)
        if change:
            self.fifa_account.proxy = None
            self.fifa_account.save(update_fields=['proxy'])
            self.fifa_account.refresh_from_db()
            account_proxy = None
        temp_set_proxy = 0
        if not account_proxy:
            fifa_proxy_list = FifaProxy.objects.filter(type_name=proxy_type_name).annotate(
                usage_count=Coalesce(Subquery(FifaAccount.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')
            lowest_use = fifa_proxy_list.first()
            if lowest_use:
                self.set_account_proxy(lowest_use.id, lowest_use.ip_address, lowest_use.port)
                account_proxy = lowest_use
            else:
                self.send_message(
                    None, ARZBAZI_REPORT_GROUP_ID,
                    f'No lowest proxy found.\n{self.fifa_account}\nworker:{self.running_platform}\nproxy type:{proxy_type_name}')
                return {'status_bool': False, 'status': 'failed', 'error': 'No Lowest Proxy Found'}
                # raise Exception('No Lowest Proxy Found')
        PROXY_HOST = account_proxy.ip_address  # rotating proxy or host
        PROXY_PORT = account_proxy.port  # port
        PROXY_USER = account_proxy.user_name  # self.username
        PROXY_PASS = account_proxy.password  # self.password
        new_print(self.fifa_account, 'proxy set. data : ', PROXY_HOST, ':', PROXY_PORT, '@', PROXY_USER, ':',
                  PROXY_PASS)
        if not temp_set_proxy:
            try:
                proxies = {
                    'http': 'http://%s:%s@%s:%s' % (PROXY_USER, PROXY_PASS, PROXY_HOST, PROXY_PORT),
                    'https': 'http://%s:%s@%s:%s' % (PROXY_USER, PROXY_PASS, PROXY_HOST, PROXY_PORT)
                }
                self.se.proxies.update(proxies)
                # resp = self.se.get("https://icanhazip.com/", timeout=120)
                try:
                    resp = self.se.get("https://arzbazi.com/accounts/get-local-timezone/", timeout=120)
                except (requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError):
                    resp = self.se.get("https://icanhazip.com/", timeout=120)
                new_print(self.fifa_account, 'proxy set resp 2 = ', resp.text)
            except:
                new_print(self.fifa_account, 'error 43 : ', traceback.format_exc())
                text = f'proxy is expired for {self.username} , console : {self.fifa_account.console}'
                self.send_message(bot, 123, text)
                # self.handle_end_bot()
                time.sleep(50)
                return {'status_bool': False, 'status': 'failed', 'error': 'proxy is expired'}

        return {
            'status_bool': True, 'status': 'success',
            'proxy_host': PROXY_HOST, 'proxy_port': PROXY_PORT, 'proxy_user': PROXY_USER, 'proxy_pass': PROXY_PASS,
            'proxy_id': account_proxy.id,
        }
        # return PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS, account_proxy.id

    def check_account_problems(self, account_id, driver, nucleus, acc_email):
        new_print(self.fifa_account, 'check account problems')
        error = ''
        elem = wait_for_element('xpath', 'one', "//h2[contains(text(),'Signed Into Another Device')]",
                                special='fast_break',
                                driver=driver)
        if elem:
            error = 'console login'
        else:
            elem = wait_for_element('xpath', 'one',
                                    "//p[contains(text(),'It looks like your EA Account doesn’t have a FUT')]",
                                    special='fast_break',
                                    driver=driver)
            if elem:
                error = 'no club'
            else:
                try:
                    self.fifa_account.refresh_from_db()
                    trade_access = driver.execute_script(
                        "return services.User.repository._collection[%s]['tradeAccess']" % nucleus)
                    new_print(self.fifa_account, 'trade access =', trade_access)
                    credit = driver.execute_script(
                        "return services.User.repository._collection[%s].coins.amount" % nucleus)
                    if credit:
                        new_print(self.fifa_account, 'credit from javascript : ', credit)
                        self.fifa_account.credit = int(credit or 0)
                        self.fifa_account.save(update_fields=['credit'])

                    if str(trade_access) == '0':
                        elem_transfer = wait_for_element('class', 'one', 'icon-transfer', driver=driver,
                                                         special='fast_break')
                        if elem_transfer:
                            error = 'account not yet access'
                    if str(trade_access) == '3' or str(trade_access) == '1':
                        error = 'account transfer is ban'
                    if self.fifa_account.trade_access != str(trade_access):
                        if str(trade_access) in ['1', '3']:
                            self.send_message(
                                bot, 123,
                                f'!Warning : \nAccount {self.fifa_account} change trade access from {self.fifa_account.get_trade_access_display()} to {TRADE_ACCESS_DICT.get(str(trade_access))} , console : {self.fifa_account.console}')
                        elif str(trade_access) == '2':
                            self.send_message(
                                bot, 123,
                                f'Greeting : \nAccount {self.fifa_account} change trade access from {self.fifa_account.get_trade_access_display()} to {TRADE_ACCESS_DICT.get(str(trade_access))} , console : {self.fifa_account.console}')
                    self.fifa_account.trade_access = str(trade_access)
                    self.fifa_account.save(update_fields=['trade_access'])
                except:
                    new_print(self.fifa_account, 'account problem : ', traceback.format_exc())
        return error

    # def need_backup_from_auth(self, ):
    #     backup_file = open(file_path + '/backups/' + self.username, 'w')
    #     backup_file.close()
    #     while True:
    #         backup_file = open(file_path + '/backups/' + self.username, 'r')
    #         backup_code = backup_file.read()
    #         backup_file.close()
    #         if backup_code:
    #             return backup_code

    def check_captcha(self, ):
        elem = wait_for_element('xpath', 'one', "//h2[contains(text(),'Verification Required')]", special='break',
                                driver=self.main_dic['driver'])
        if elem:
            new_print(self.fifa_account, 'in checking for captcha : captcha found')
            return 1
        return 0

    def custome_click(self, elem):
        for i in range(1):
            try:
                elem.click()
                # ActionChains(self.main_dic['driver']).move_to_element(elem).click().perform()
            except:
                pass

    def handle_end_bot(self, without_update_time=0):
        self.sbc_worker.refresh_from_db()
        self.sbc_worker.must_done = True
        self.sbc_worker.save(update_fields=['must_done'])
        new_print(self.fifa_account, 'inside handle end bot')
        self.fifa_account.refresh_from_db()
        self.fifa_account.active = False
        self.fifa_account.login_status = 0
        self.fifa_account.driver = False
        self.fifa_account.can_kill_by_mother = False
        self.fifa_account.save()
        if not without_update_time:
            self.sbc_worker.last_run_time = timezone.localtime()
            self.sbc_worker.save(update_fields=['last_run_time'])
        # sbc_type = SBCType.objects.filter(checker_account=self.fifa_account).first()
        # if sbc_type:
        #     sbc_type.updating_price = 0
        #     sbc_type.save()
        try:
            self.main_dic['driver'].quit()
            if os.name == 'nt':
                os.system("TASKKILL /F /IM chromedriver.exe")
        except:
            pass
        if os.name != 'nt':
            try:
                shutil.rmtree("%s/user_data/%s" % (os.path.join(BASE_DIR, 'accounts'), self.username))
            except:
                pass
        # os.remove('%s/user_data/%s' % (file_path, self.username))
        # data = {'terminate': True,
        #         'signal': 'SIGKILL'}
        # link = '/api/task/revoke/{}?terminate=true'.format(self.sbc_worker.task_id)
        # api_root = FLOWER_ADDRESS
        new_print(self.fifa_account, 'before revoking task ...')
        if os.name != 'nt':
            try:
                app.control.revoke(self.sbc_worker.task_id, terminate=True, signal='SIGKILL')
            except:
                new_print(self.fifa_account, 'no app found to kill will revoking ...')
        # requests.post(api_root + link, data=data)
        time.sleep(3)
        # if os.name == 'nt':
        #     self.public_moves.put_on_rest_mode()
        #     os.system("TASKKILL /F /IM run_console_manager.exe")
        #     os.system("TASKKILL /F /IM run_console_manager.exe")
        #     os.system("TASKKILL /F /IM run_console_manager.exe")
        #     os.system("TASKKILL /F /IM python.exe")

        new_print(self.fifa_account, 'after handle end bot')
        time.sleep(10)
        raise Exception('After Handle End Bot')

    def send_message(self, bot, chat_id, text, message_type=None, message_thread_id=None, parse_mode=None):
        try:
            new_print(self.fifa_account, 'sending on telegram : ', text)
            close_old_connections()
            TelegramMessage.objects.create(
                fifa_account=self.fifa_account,
                message_type=message_type,
                text=text
            )

            # text += '\nserver address:\n%s' % self.fifa_account.server.ip_address
            # if chat_id == 'critical':
            #     chat_id = -1001625826333
            # else:
            #     if chat_user_name.find('ahmad') == -1:
            #         chat_id = -1001712554408
            #     else:
            #         chat_id = -1001554460187
            if not chat_id or chat_id == 123:
                chat_id = ARZBAZI_REPORT_GROUP_ID
                if self.fifa_account.creator in django_user.objects.filter(id__in=[18, ]):
                    chat_id = Fifa_REPORT_CHANNEL_ID
                elif message_thread_id is None:
                    chat_id = '-1001711538724'
            params = {
                'chat_id': chat_id,
                'text': text,
            }
            if parse_mode:
                params.update({'parse_mode': parse_mode})
            if message_thread_id:
                url = f'https://api.telegram.org/bot{FIFA_REPORT_TOKEN}/sendMessage'
                params.update({'message_thread_id': message_thread_id})
                result = requests.get(url, params=params)
                if result.status_code != 200:
                    new_print(self.fifa_account, 'sending on telegram in topic error : ', result.text)
            else:
                url = f'https://api.telegram.org/bot{FIFA_REPORT_TOKEN}/sendMessage'
                result = requests.get(url, params=params)
                if result.status_code != 200:
                    new_print(self.fifa_account, 'sending on telegram error : ', result.text)
                # bot.sendMessage(chat_id, text)
            # if self.running_platform != 'console':
            #     bot.sendMessage(chat_id, text)
            # elif self.can_send_telegram:
            #     bot.sendMessage(chat_id, text)
            if self.fifa_account.creator not in django_user.objects.filter(
                    id__in=[18, ]
            ) and TelegramMessage.objects.filter(
                create_time__gte=timezone.localtime() - timezone.timedelta(hours=24),
                fifa_account=self.fifa_account, text=text
            ).count() <= 1 and message_type == 'error':
                chat_id = '-1001802370673'  # گروه اجرایی فات پلاس
                bot.sendMessage(chat_id, text)
        except:
            new_print(self.fifa_account, 'except in send message , error 42 : ', traceback.format_exc())

    def search_player(self, player_id, max_price, search_type, number='21', start='0', rare=0, pos='', link='', team=0,
                      safe=True, filter_target: SBCTargetFilter = None, level=None):
        # self.fifa_account.refresh_from_db()
        # self.fifa_account.search_number += 1
        # self.fifa_account.save()

        if safe:
            FifaAccountSearch.objects.create(fifa_account=self.fifa_account, search_time=timezone.localtime())
            search_number = self.fifa_account.account_search.filter(
                search_time__gt=timezone.localtime() - timezone.timedelta(hours=24)).count()
            new_print(self.fifa_account,
                      'search_number = ', search_number, ' time : ', timezone.localtime(),
                      f'number {number} , start {start} , rare {rare}, pos {pos}',
                      f'filter_target {filter_target}, level {level}'
                      )
        else:
            search_number = 1
        if (search_number + 1 > self.account_high_search_count) and (
                self.running_platform == 'web' or self.running_platform == 'inject'):
            self.sbc_worker.has_error = True
            self.sbc_worker.error_description = "high search"
            self.sbc_worker.save(update_fields=['has_error', 'error_description'])
            text = 'search number more than 300 for account %s' % self.username
            resp = get_trade_pile(self.fifa_account, self.se, self.main_dic, self.server_key)
            json_resp = resp.json()
            trades = json_resp['auctionInfo']
            sum_active_trades = 0
            sum_starting_bids = 0
            for trade in trades:
                if trade['tradeState'] in ['active', 'expired']:
                    sum_active_trades += 1
                    sum_starting_bids += trade['startingBid']
            add_part = '\nnumber of active trades = %s\nactive trades starting bids sum = %s' % (
                sum_active_trades, sum_starting_bids)

            self.send_message(bot, 'critical', text + add_part)
            self.handle_end_bot()
            return 'sid'
            # time.sleep(50)
        # print 'in search'
        rare_item = ''
        if rare > 1:
            rare_item = 'SP'

        if self.running_platform != 'inject':
            time.sleep(randint(2, 3))
        # time.sleep(1)
        # while True:
        #     if self.main_dic['temp_number_of_searchs'] >= 60:
        #         time.sleep(1)
        #     else:
        #         break
        try:
            sp = ''
            if search_type == 'max_bid':
                sp = 'macr'
            elif search_type == 'max_buy':
                sp = 'maxb'
            search_part = ''
            if sp:
                search_part = '&' + sp + '=' + str(max_price)
            pos_part = ''
            if pos:
                pos_part = '&pos=' + pos
            team_part = ''
            if team:
                team_part = '&team=' + str(team)
            rare_part = ''
            rarity = ''
            if rare_item:
                rare_part = '&rare=SP'
                rarity = '&rarityIds=%s' % rare
            elif rare:
                rarity = f'&rarityIds={rare}'
            level_part = ''
            if level:
                level_part = f'&lev={level}'

            if not link:
                link = f'{fifa_23_address}/transfermarket?start={start}&num={number}&type=player&maskedDefId={player_id}{search_part}{rare_part}{pos_part}{rarity}{team_part}{level_part}'
            if filter_target:
                payload = {'start': start, 'num': number, 'type': 'player'}
                if filter_target.position:
                    payload.update({'pos': filter_target.position})
                if filter_target.rarity_ids:
                    payload.update({'rarityIds': filter_target.rarity_ids})
                if filter_target.level:
                    payload.update({'lev': filter_target.level})
                if filter_target.nation:
                    payload.update({'nat': filter_target.nation})
                if filter_target.team:
                    payload.update({'team': filter_target.team})
                if filter_target.league:
                    payload.update({'leag': filter_target.league})
                if filter_target.chemistry_style:
                    payload.update({'playStyle': filter_target.chemistry_style})

                payload.update({'maxb': str(max_price)})

                link = f'{fifa_23_address}/transfermarket?' + str(urlencode(payload))
            if safe:
                new_print(self.fifa_account, 'search player link : ', link)
                self.se.options(link, headers=self.get_ea_options_header())
                # new_print(self.fifa_account,link, self.main_dic['header'])
                save_account_request(
                    fifa_account=self.fifa_account,
                    link=link,
                )
            resp = force_get(link, self.fifa_account, self.se, self.main_dic['header'], save_log=False)
            if safe:
                try:
                    json_resp = resp.json()
                    auction_info = json_resp['auctionInfo']
                except:
                    new_print(self.fifa_account, 'search auction error , ', resp.status_code, ' -- ', resp.text)
                    time.sleep(2)
                    resp = force_get(link, self.fifa_account, self.se, self.main_dic['header'])
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=link,
                    )
                    # print 'new search result = ',resp.content
                # print 'link =', link
                # print "self.main_dic['header'] = ",self.main_dic['header']
                # print 'resp.content = ', resp.content
                # time.sleep(10)
                pin_events_creator(
                    self.fifa_account, self.se, source="Transfer Market Results - List View",
                    persona_id=self.fifa_account.persona_id, nucleus_id=self.fifa_account.nucleus_id,
                    sid=self.fifa_account.sid, platform=self.platform_key, counter=self.get_pin_events_counter()
                )
                # self.se.options('https://pin-river.data.ea.com/pinEvents', headers=self.main_dic['pin_enevts_option_header'])
                # now_time = timezone.localtime()
                # ea_now_time = now_time + timedelta(hours=7, minutes=30)
                # ea_now_time_date = str(ea_now_time.date())
                # ea_now_time_time = str(ea_now_time.time())[:-3]
                # ea_now_time_plus = ea_now_time + timedelta(seconds=1)
                # ea_now_time_plus_date = str(ea_now_time_plus.date())
                # ea_now_time_plus_time = str(ea_now_time_plus.time())[:-3]

                # pin_enevts_data = '''{"custom": {"networkAccess": "W", "service_plat": "%s"}, "et": "client", "events": [
                #     {"type": "menu", "pgid": "Transfer Market Results - List View",
                #      "core": {"s": 20, "pidt": "persona", "pid": "%s", "ts_event": "%sT%sZ",
                #               "en": "page_view", "pidm": {"nucleus": %s}, "dob": "1995-02"}}], "gid": 0, "is_sess": true,
                #                    "loc": "en_US", "plat": "web", "rel": "prod",
                #                     "taxv": "1.1", "tid": "%s", "tidt": "easku",
                #                    "ts_post": "%sT%sZ", "v": "23.0.2",
                #                    "sid": "%s"}''' % (
                #     self.platform_key, str(self.persona_id), ea_now_time_date, ea_now_time_time,
                #     str(self.nucleus_id), fut_web_number,
                #     self.main_dic['header']['X-UT-SID'],
                #     ea_now_time_plus_date, ea_now_time_plus_time)
                # try:
                #     self.se.post('https://pin-river.data.ea.com/pinEvents', data=pin_enevts_data,
                #                  headers=self.main_dic['pin_enevts_header'], timeout=2)
                # except:
                #     new_print(self.fifa_account, 'pin events data sent failed')
                self.main_dic['number_of_searchs'] += 1
                self.main_dic['temp_number_of_searchs'] += 1

            return resp
        except Exception as e:
            new_print(self.fifa_account, 'error 41 : ', traceback.format_exc())

    def get_price_limit(self, player_club_id):
        self.se.options(
            f'{fifa_23_address}/marketdata/item/pricelimits?itemIdList={player_club_id}',
            headers=self.get_ea_options_header())
        resp = force_get(
            f'{fifa_23_address}/marketdata/item/pricelimits?itemIdList={player_club_id}',
            self.fifa_account,
            self.se,
            self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/marketdata/item/pricelimits?itemIdList=%s',
        )
        return resp

    def get_items(self, ):
        self.se.options(
            f'{fifa_23_address}/purchased/items',
            headers=self.get_ea_options_header())
        resp = force_get(
            f'{fifa_23_address}/purchased/items',
            self.fifa_account,
            self.se,
            self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/purchased/items'
        )
        return resp

    # def relist_all(self, ):
    #     options_header = {'Accept': '*/*',
    #                       'Accept-Encoding': 'gzip, deflate, br',
    #                       'Accept-Language': 'en-US,en;q=0.5',
    #                       'Connection': 'keep-alive',
    #                       'Host': fifa_host,
    #                       'Access-Control-Request-Headers': 'content-type,x-ut-sid',
    #                       'Access-Control-Request-Method': 'PUT',
    #                       'Origin': 'https://www.ea.com',
    #                       'Referer': 'https://www.ea.com/',
    #                       'User-Agent': user_agent
    #                       }
    #     self.se.options(
    #         f'{fifa_23_address}/auctionhouse/relist',
    #         headers=options_header)
    #     resp = self.se.put(f'{fifa_23_address}/auctionhouse/relist',
    #                        headers=self.main_dic['header'])
    #     return resp

    def put_item_in_auction_house(self, data):
        new_print(self.fifa_account, 'put item in auction , auction data = ', data)
        link = f'{fifa_23_address}/auctionhouse'
        self.se.options(link, headers=self.get_ea_options_header(method='POST'))
        resp = self.se.post(link, data=data, headers=self.main_dic['header'])
        save_account_request(fifa_account=self.fifa_account, link=link)
        new_print(self.fifa_account, 'resp.content = ', resp.text[:1000])
        return resp

    def clear_outbid(self, trade_ids):
        link = f'{fifa_23_address}/watchlist?tradeId={trade_ids}'
        self.se.options(link, headers=self.get_ea_options_header(method='DELETE'))
        resp = self.se.delete(link, headers=self.main_dic['header'])
        new_print(self.fifa_account, 'clear outbid = ', link)
        return resp

    def bid_trade(self, trade_id, data, safe=True):
        link = f'{fifa_23_address}/trade/{trade_id}/bid'
        if safe:
            self.se.options(link, headers=self.get_ea_options_header(method='PUT'))
        resp = self.se.put(link, data=data, headers=self.main_dic['header'])
        return resp

    def item_put_for_sale(self, item_id, trade_id, win_price, start_price=0, buy_now_price=0):
        if not start_price:
            sell_price = win_price + 100
            sell_price_cal_tax = get_round_top_price((sell_price * 100) / 95)
            start_price = get_previous_price_grade(sell_price_cal_tax)
            buy_now_price = sell_price_cal_tax
        if trade_id:
            data = '{"itemData":[{"id":%s,"pile":"trade","tradeId":"%s"}]}' % (item_id, trade_id)
        else:
            data = '{"itemData":[{"id":%s,"pile":"trade"}]}' % item_id
        new_print(self.fifa_account, 'put for sale data =', data)
        resp = put_item_for_sale(self.se, self.main_dic['header'], data, self.server_key)
        time.sleep(1)
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/item/pile_trade',
        )
        new_print(self.fifa_account, 'put for sale resp : ', resp.text)
        json_resp = resp.json()
        item_resp = json_resp['itemData'][0]
        item_resp_reason = item_resp.get('reason', '')

        if item_resp_reason.find('No such card exists') != -1:
            new_print(self.fifa_account, 'No such card exists')
        elif not item_resp['success']:
            new_print(self.fifa_account, 'some thing is wrong. not try to sell this card.')
        else:
            link = f'{fifa_23_address}/marketdata/item/pricelimits?itemIdList={item_id}'
            resp = self.se.get(link, headers=self.main_dic['header'])
            time.sleep(1)
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/marketdata/item/pricelimits?itemIdList=%s',
            )
            # new_print(self.fifa_account, link)
            new_print(self.fifa_account, 'link : ', link, '  resp = ', resp.text)
            js_resp = resp.json()
            min_price = js_resp[0]['minPrice']
            max_price = js_resp[0]['maxPrice']
            if min_price > start_price and start_price < 30000:
                new_print(self.fifa_account, 'Min price is less than limit. Quick sell this item', min_price,
                          start_price)
                resp2 = self.se.delete(f'{fifa_23_address}/item/{item_id}',
                                       headers=self.main_dic['header'])
                new_print(self.fifa_account, 'quick sell item response : ', resp2.text)
                time.sleep(randint(1, 3))
                return ''
            elif min_price > start_price and start_price > 30000:
                new_print(self.fifa_account, 'min price higher than start price , min : ',
                          min_price, ' start ', start_price)
                start_price = min_price
                buy_now_price = get_next_price_grade(min_price)
            if buy_now_price > max_price:
                new_print(self.fifa_account, 'buy now price higher than max price , ',
                          ' buy now : ', buy_now_price, ' max price :', max_price)
                buy_now_price = max_price
                if start_price >= buy_now_price:
                    start_price = get_previous_price_grade(buy_now_price)
            data = '{"itemData":{"id":%s},"startingBid":%d,"duration":3600,"buyNowPrice":%d}' % (
                item_id, start_price, buy_now_price)
            sell_resp = self.put_item_in_auction_house(data)
            if sell_resp.text:
                self.main_dic['win_controller_count'] += 1
                self.main_dic['temp_win_controller'] += 1
            else:
                text = 'problem in listing. account : %s' % self.username
                self.send_message(bot, 123, text)
                new_print(self.fifa_account, text)
                time.sleep(300)
            time.sleep(randint(1, 3))
            return sell_resp

    def use_cloud_scraper(self, link, params: {} = None):
        if not params:
            params = {}
        counter = 0
        while True:
            new_print(self.fifa_account, 'cloud scraper link = ', link,
                      ' counter = ', counter, 'proxie = ', self.main_dic.get('proxy_ip'),
                      self.main_dic.get('proxy_port'), ' params = ', params)
            counter += 1
            scraper = cloudscraper.create_scraper(browser={
                'browser': 'firefox',
                'platform': 'linux',
                'mobile': False
            })
            if str(self.main_dic.get('proxy_ip')):
                proxy_protocol = self.main_dic.get('proxy_protocol') or 'http'
                if self.main_dic.get('proxy_user'):
                    proxies = {
                        'http': f"{proxy_protocol}://{self.main_dic['proxy_user']}:{self.main_dic['proxy_pass']}@{self.main_dic['proxy_ip']}:{self.main_dic['proxy_port']}",
                        'https': f"{proxy_protocol}://{self.main_dic['proxy_user']}:{self.main_dic['proxy_pass']}@{self.main_dic['proxy_ip']}:{self.main_dic['proxy_port']}"
                    }
                else:
                    proxies = {
                        'http': f"{proxy_protocol}://{self.main_dic['proxy_ip']}:{self.main_dic['proxy_port']}",
                        'https': f"{proxy_protocol}://{self.main_dic['proxy_ip']}:{self.main_dic['proxy_port']}"
                    }
                scraper.proxies.update(proxies)
                resp = scraper.get(link, params=params)
            else:
                resp = scraper.get(link, params=params)
            if resp.text.find('Why do I have to complete a CAPTCHA?') == -1:
                break
            new_print(self.fifa_account, 'cloud scraper resp : ', resp.text[:500])
            time.sleep(2)
            if counter % 10 == 0:
                self.send_message(bot, 123, 'cant get price from futbin for 10 try. account = %s. ip = %s' % (
                    self.username, self.main_dic['proxy_ip']))
                time.sleep(300)
            if counter > 50:
                return resp
        return resp

    def search_price(self, price, player_asset_id, trade_mode=1, position=0, accounts_sbc_id=0, rating=0, rare=0,
                     pos='', change_pos='', force_manual=0, limit_max_price=999999999, buy=1, team=0, link='',
                     futbin_price_only=False):
        new_print(self.fifa_account, 'search price on web , ', price, ' -- ', player_asset_id,
                  ' -- ', trade_mode, ' -- ', rating, ' -- ', rare)
        temp_link = ''
        try:
            last_price = price
            futbin_and_futwiz_price = 0
            if (not force_manual) or (not price):
                if not link:
                    card_info = get_player_data_by_asset_id(player_asset_id=player_asset_id)
                    futbin_result = self.get_player_price_from_futbin_web_app(
                        card_info[0],
                        rating,
                        card_info[1],
                        player_rare=rare,
                        player_f=card_info[2],
                        player_l=card_info[3],
                    )
                    # futbin_result = self.get_price_from_futbin_and_futwiz(player_asset_id)
                    price = futbin_result.get('price', 0)
                    updated_time = futbin_result.get('update_time')
                    # first_price = futbin_result.get('first_price')
                    # futbin_min_price = futbin_result.get('futbin_min_price')
                    # futbin_max_price = futbin_result.get('futbin_max_price')
                    # price, updated_time, first_price, futbin_min_price, futbin_max_price = self.get_price_from_futbin_and_futwiz(
                    #     player_asset_id)
                    if price == 0:
                        price = last_price
                    else:
                        price = get_previous_price_grade(price)
                        futbin_and_futwiz_price = 1

                    # special just for sbc *****************
                    local_data = PlayerCard.objects.filter(
                        asset_id=player_asset_id, rating=rating, rare=rare, team=team, position=pos).first()
                    price = self.compare_futbin_price_with_local_data(local_data, price, updated_time)

            if price == 0:
                # price = 1000
                price = 400
            # get player price
            min_check = max_check = 0
            old_len = 0
            bug_check = 0
            bug = 0
            bought = 0
            increase_count = 0
            decrease_count = 0
            if futbin_and_futwiz_price and (not buy):
                resp = self.search_player(player_asset_id, price, 'max_buy', rare=rare, pos=pos, team=team)
                json_resp = resp.json()
                auction_info = json_resp['auctionInfo']
                if len(auction_info) < 15:
                    futbin_and_futwiz_price = 0

            if price > limit_max_price:
                price = limit_max_price
            can_check_for_limit_max_price = 0
            if ((not futbin_and_futwiz_price) or rare > 1 or force_manual) and not futbin_price_only:
                while True:
                    if can_check_for_limit_max_price:
                        if price >= limit_max_price:
                            new_print(self.fifa_account, 'max price reached')
                            price = limit_max_price
                            break
                    can_check_for_limit_max_price = 1
                    player_id = player_asset_id
                    if link:
                        temp_link = link + '&maxb=%s' % price
                    resp = self.search_player(player_id, price, 'max_buy', rare=rare, pos=pos, team=team,
                                              link=temp_link)
                    json_resp = resp.json()
                    auction_info = json_resp['auctionInfo']
                    new_print(self.fifa_account, 'price = ', price)
                    new_print(self.fifa_account, 'length = ', len(auction_info))
                    expire_check = 1
                    if trade_mode == 1:
                        if 0 < len(auction_info) < 21:
                            if len(auction_info) == old_len:
                                if bug_check == 1:
                                    new_print(self.fifa_account, 'bug found')
                                    return 'bug'
                                bug_check = 1
                            old_len = len(auction_info)

                    # for trade in auction_info:
                    #     if trade['expires'] < 3420:
                    #         expire_check = 0
                    if len(auction_info) < 5 and expire_check:
                        if max_check:
                            # price = get_next_price_grade(price)
                            break
                        if trade_mode == 2 and len(auction_info) > 0 and buy:
                            auction_info = auction_info[::-1]
                            data = '{"bid":%d}' % price
                            for trade in auction_info:
                                if price > 16000:
                                    # text = 'player price is more than 5000. will not buy this item . account = %s' % self.username
                                    # send_message(bot, 'critical', text)
                                    # time.sleep(300)
                                    new_print(self.fifa_account, 'player price more than 16000')
                                    break
                                else:
                                    new_print(self.fifa_account, 'data = ', data, 'in search price')
                                    # if trade['itemData']['preferredPosition'] == pos:
                                    check_resp = self.check_trade(trade['tradeId'])
                                    json_check_resp = check_resp.json()
                                    if json_check_resp['auctionInfo'][0]['tradeState'] != 'active':
                                        new_print(self.fifa_account, 'trade is closed')
                                        time.sleep(0.5)
                                        continue
                                    bid_resp = self.bid_trade(trade['tradeId'], data)
                                    new_print(self.fifa_account, 'bid_resp.content = ', bid_resp.text[:100])
                                    if (bid_resp.text != 'Permission Denied' and
                                            bid_resp.text != '' and
                                            bid_resp.text != 'You are not allowed to bid on this trade'):
                                        self.main_dic['soft_ban_handler'] = 0
                                        self.account_sbc_targets_buy_staff(accounts_sbc_id, bid_resp, position,
                                                                           player_asset_id,
                                                                           change_pos)
                                        new_print(self.fifa_account, 'we bought this one')
                                        new_print(self.fifa_account, bid_resp.text)
                                        bought = 1
                                        break
                                    else:
                                        self.main_dic['soft_ban_handler'] += 1
                                        if self.main_dic['soft_ban_handler'] > 70:
                                            text = 'account %s temperory cant bid. deactivated' % self.username
                                            new_print(self.fifa_account, text)
                                            self.send_message(bot, 'critical', text)
                                            self.sbc_worker.error_description = "temp cant bid"
                                            self.sbc_worker.has_error = True
                                            self.sbc_worker.save()
                                            self.handle_end_bot()
                                            time.sleep(50)
                                            return
                                        time.sleep(1.5)
                            if bought:
                                break
                        price = get_next_price_grade(price)
                        min_check = 1
                        if trade_mode == 3:
                            increase_count += 1
                            if increase_count == 5:
                                while True:
                                    price_help = price
                                    if price >= limit_max_price:
                                        new_print(self.fifa_account, 'max price reached')
                                        price = limit_max_price
                                        break
                                    for i in range(10):
                                        price_help = get_next_price_grade(price_help)
                                    if link:
                                        temp_link = link + '&maxb=%s' % price
                                    resp = self.search_player(player_id, price_help, 'max_buy', rare=rare, pos=pos,
                                                              team=team, link=temp_link)
                                    json_resp = resp.json()
                                    auction_info = json_resp['auctionInfo']
                                    if len(auction_info) < 5 and expire_check:
                                        price = price_help
                                        for i in range(20):
                                            price_help = get_next_price_grade(price_help)
                                        if link:
                                            temp_link = link + '&maxb=%s' % price
                                        resp = self.search_player(player_id, price_help, 'max_buy', rare=rare, pos=pos,
                                                                  team=team, link=temp_link)
                                        json_resp = resp.json()
                                        auction_info = json_resp['auctionInfo']
                                        if len(auction_info) < 5 and expire_check:
                                            price = price_help

                                            for i in range(50):
                                                price_help = get_next_price_grade(price_help)
                                            if link:
                                                temp_link = link + '&maxb=%s' % price
                                            resp = self.search_player(player_id, price_help, 'max_buy', rare=rare,
                                                                      pos=pos, team=team, link=temp_link)
                                            json_resp = resp.json()
                                            auction_info = json_resp['auctionInfo']
                                            if len(auction_info) < 5 and expire_check:
                                                price = price_help

                                                for i in range(100):
                                                    price_help = get_next_price_grade(price_help)
                                                if link:
                                                    temp_link = link + '&maxb=%s' % price
                                                resp = self.search_player(player_id, price_help, 'max_buy', rare=rare,
                                                                          pos=pos, team=team, link=temp_link)
                                                json_resp = resp.json()
                                                auction_info = json_resp['auctionInfo']
                                                if len(auction_info) < 5 and expire_check:
                                                    price = price_help
                                    else:
                                        break

                                increase_count = 0

                    else:
                        if min_check:
                            price = get_previous_price_grade(price)
                            break
                        price = get_previous_price_grade(price)
                        max_check = 1
                        if trade_mode == 3:
                            decrease_count += 1
                            if decrease_count == 10:
                                price_help = price
                                for i in range(20):
                                    price_help = get_previous_price_grade(price_help)
                                if price_help > 400:
                                    if link:
                                        temp_link = link + '&maxb=%s' % price
                                    resp = self.search_player(player_id, price_help, 'max_buy', rare=rare, pos=pos,
                                                              team=team, link=temp_link)
                                    json_resp = resp.json()
                                    auction_info = json_resp['auctionInfo']
                                    if len(auction_info) >= 5:
                                        price = price_help
                                decrease_count = 0
                    # time.sleep(1)

                    if trade_mode == 1 and min_check and price >= get_next_price_grade(1200):
                        price = get_previous_price_grade(price)
                        break

            try:
                player_card, created = PlayerCard.objects.get_or_create(
                    asset_id=player_asset_id, rare=rare, rating=rating)
            except:
                player_card = PlayerCard.objects.filter(asset_id=player_asset_id, rare=rare, rating=rating).first()

            new_print(self.fifa_account, 'player card created 2 : ', player_card)
            player_card.name = get_player_fifa_name_by_id(player_card.asset_id)
            if not player_card.team and team:
                player_card.team = team
            if not player_card.position and pos:
                player_card.position = pos
            if price:
                player_card.price = price
                player_card.update_time = timezone.localtime()
            player_card.save()

            new_print(self.fifa_account, 'player_price 2 = ', price)
            if trade_mode == 3:
                return price

            if trade_mode == 2:
                # sbc_target = SBCTarget.objects.filter(asset_id=player_asset_id)
                SBCTarget.objects.filter(asset_id=player_asset_id).update(price=price)
                # sbc_process = SBCProcess.objects.filter(worker=self.sbc_worker, is_done=False).first()
                # sum_sbc_price = SBCTarget.objects.filter(sbc_type=sbc_process.sbc_type).aggregate(
                #     sum_price=Sum('price')).get('sum_price')
                # new_print(self.fifa_account, 'sum actual price =', sum_sbc_price)
                # sbc_process.sbc_type.refresh_from_db()
                # sbc_process.sbc_type.sbc_actual_price = sum_sbc_price
                # sbc_process.sbc_type.update_time = timezone.localtime()
                # sbc_process.sbc_type.save()

                if not bought:
                    return price

            if bought:
                return 'player bought'

        except:
            new_print(self.fifa_account, 'error 39 : ', traceback.format_exc())
            self.get_new_sid()
            return 'sid'

    def compare_futbin_price_with_local_data(self, local_data, price, updated_time):
        if local_data:
            new_print(self.fifa_account, 'local data found , compare futbin price with local ',
                      local_data, ' -- ', price, ' -- ', updated_time)
            if updated_time.find('secs') == -1 and local_data.update_time:
                if updated_time.find('mins') != -1:
                    updated_time_min = updated_time.split()
                    futbin_updated_time = timezone.localtime() - timedelta(minutes=int(updated_time_min[0]))
                    new_print(self.fifa_account, 'futbin update time , ', futbin_updated_time,
                              local_data.update_time.astimezone(get_current_timezone()))
                    if futbin_updated_time < local_data.update_time.astimezone(get_current_timezone()):
                        new_print(self.fifa_account, 'local data is updater than futbin', local_data.price)
                        price = local_data.price
                elif updated_time.find('hour') != -1:
                    updated_time_hour = updated_time.split()
                    futbin_updated_time = timezone.localtime() - timedelta(hours=int(updated_time_hour[0]))
                    new_print(self.fifa_account, 'futbin update time 2 , ', futbin_updated_time,
                              local_data.update_time.astimezone(get_current_timezone()))
                    if futbin_updated_time < local_data.update_time.astimezone(get_current_timezone()):
                        new_print(self.fifa_account, 'local data is updater than futbin', local_data.price)
                        price = local_data.price
        return price

    def search_player_and_bid(self, player_asset_id, player_bid_price, number_of_bids, rating=0, rare=0,
                              trade_mode=1, max_bid_price=0, position=0, accounts_sbc_id=0,
                              pos='', change_pos='', sbc_target_id=0, team=0,
                              filter_target: SBCTargetFilter = None):
        new_print(self.fifa_account, 'search player and bid , ', player_asset_id,
                  ' -- ', rating, ' -- ', rare, ' -- ', trade_mode,
                  ' ** ', player_bid_price, ' -- ', ' filter : ', filter_target, )
        start = 0
        bought_trade = {}
        done = 0
        temp_number_of_bids = 0
        let_it_go = 0
        if trade_mode == 1:
            expire_time = 720
        elif trade_mode == 0:
            expire_time = 600
        elif trade_mode == 2:
            expire_time = 99999999
        elif trade_mode == 3:
            expire_time = 99999999
        while True:
            self.sbc_worker.refresh_from_db()
            if self.sbc_worker.must_done or self.sbc_worker.has_error:
                new_print(self.fifa_account, 'worker has error or must done')
                return
            if (trade_mode == 0) and self.job_time_id:
                if self.main_dic['remaining_buys'] < 0:
                    self.handle_end_bot()
                    time.sleep(60)
                    return
            if start >= 300:
                new_print(self.fifa_account, 'no more try')
                break
            new_print(self.fifa_account, 'search and bid for %s bids' % str(start + 20),
                      '   ,   temp_number_of_bids = ', temp_number_of_bids)
            # new_print(self.fifa_account, 'temp_number_of_bids = ', temp_number_of_bids)
            if trade_mode == 2:
                if filter_target:
                    new_print(self.fifa_account, 'filter target found ...', filter_target)
                    resp = self.search_player(
                        player_asset_id, get_next_price_grade(filter_target.buy_now_price), 'max_buy',
                        start=str(start), pos=pos, team=team, filter_target=filter_target)
                else:
                    resp = self.search_player(
                        player_asset_id, get_next_price_grade(player_bid_price), 'max_buy',
                        start=str(start), pos=pos, team=team, filter_target=filter_target)

            elif trade_mode == 3:
                level = ''
                if rare in [0, 1] and rating >= 85:
                    level = 'gold'
                resp = self.search_player(player_asset_id, player_bid_price, 'max_buy',
                                          start=str(start), rare=rare, level=level)
                json_resp = resp.json()
                trades = json_resp['auctionInfo']
                if len(trades) == 0:
                    new_print(self.fifa_account, 'trade mode 3 , len trade is low , ', len(trades))
                    # resp = self.search_player(player_asset_id, get_next_price_grade(player_bid_price), 'max_buy',
                    #                           start=str(start), rare=rare)
                else:
                    new_print(self.fifa_account, 'trade mode 3 , len trade is ok , ', len(trades))

            else:
                resp = self.search_player(player_asset_id, get_next_price_grade(player_bid_price), '',
                                          start=str(start), team=team)

            json_resp = resp.json()
            trades = json_resp['auctionInfo']
            if trade_mode == 2:
                if len(trades) < 2:
                    if filter_target:
                        player_price = get_next_price_grade(filter_target.buy_now_price)
                        for counter in range(10):
                            resp = self.search_player(player_asset_id, get_next_price_grade(player_price), 'max_buy',
                                                      start=str(start), pos=pos, team=team, filter_target=filter_target)
                            player_price = get_next_price_grade(player_price)
                            json_resp = resp.json()
                            trades = json_resp['auctionInfo']
                            if len(trades) >= 2:
                                break
                    else:
                        new_print(self.fifa_account, 'player price need update. cant buy.')
                        return False
                        # new_print(self.fifa_account, 'player price need update. I will use ancient way :)')
                        # error = self.search_price(get_next_price_grade(player_bid_price), player_asset_id,
                        #                           rating=rating,
                        #                           rare=rare,
                        #                           trade_mode=2,
                        #                           position=position,
                        #                           accounts_sbc_id=accounts_sbc_id, change_pos=change_pos,
                        #                           force_manual=1,
                        #                           team=team)
                        # try:
                        #     player_bid_price = int(error)
                        # except:
                        #     new_print(self.fifa_account, 'error 139 : ', traceback.format_exc(), ' error = ', error)
                        #     # new_print(self.fifa_account, 'error = ', error)
                        #     if error == 'player bought':
                        #         new_print(self.fifa_account, 'player already bought look for next one')
                        #         return
                        #     elif error:
                        #         if self.main_dic['new_sid_set'] > 2:
                        #             text = 'search loop for %s' % self.username
                        #             self.send_message(bot, 'critical', text)
                        #             time.sleep(3000)
                        #         new_print(self.fifa_account, 'new sid set.reloop.')
                        #         sid_control = 0
                        #         break
                        # self.main_dic['new_sid_set'] = 0
                        # resp = self.search_player(player_asset_id, get_next_price_grade(player_bid_price), 'max_buy',
                        #                           start=str(start), pos=pos, team=team)
                        # json_resp = resp.json()
                        # trades = json_resp['auctionInfo']
                trades = trades[::-1]
            for trade in trades:
                if trade['expires'] > expire_time:
                    new_print(self.fifa_account, 'remaining trades are more than %d seconds' % expire_time)
                    done = 1
                    break
                if trade_mode not in [2, 3]:
                    bid_this_one = 0
                    temp_bid_price = player_bid_price
                    if trade['startingBid'] <= player_bid_price and trade['currentBid'] < player_bid_price:
                        bid_this_one = 1
                    elif trade['startingBid'] <= max_bid_price and trade['currentBid'] < max_bid_price:
                        bid_this_one = 1
                        temp_bid_price = max_bid_price
                else:
                    bid_this_one = 1
                    temp_bid_price = trade['buyNowPrice']
                if bid_this_one:
                    data = '{"bid":%d}' % temp_bid_price
                    if let_it_go == 0:
                        if self.main_dic['bid_controller_count'] < 80:

                            if trade['bidState'] == "highest":
                                new_print(self.fifa_account, 'I already have highest offer on this trade')
                                continue

                            self.fifa_account.refresh_from_db()
                            if self.fifa_account.credit < temp_bid_price:
                                if trade_mode == 2:
                                    new_print(self.fifa_account, 'not enough credit.w8 5 minutes.')
                                    self.main_dic['no_credit'] += 1
                                    new_print(self.fifa_account, "self.main_dic['no_credit'] = ",
                                              self.main_dic['no_credit'])
                                    if self.main_dic['no_credit'] == 13:
                                        self.get_new_sid()
                                    elif self.main_dic['no_credit'] == 14:
                                        self.sbc_low_credit_staff()

                                    elif self.main_dic['no_credit'] > 26:
                                        text = 'not enough credit for account %s . In sbc' % self.username
                                        self.send_message(bot, 123, text)
                                        self.sbc_worker.error_description = "no credit"
                                        self.sbc_worker.has_error = True
                                        self.sbc_worker.save()

                                        self.handle_end_bot()
                                        time.sleep(30)
                                        return
                                    time.sleep(300)
                                    self.update_credit()
                                    return
                                elif trade_mode == 3:
                                    # for i in range(220):
                                    #     self.send_message(bot, -1001444245007,
                                    #                       u'اعتبار اکانت کافی نمی باشد %s ' % self.username)
                                    #     time.sleep(100)
                                    new_print(self.fifa_account, 'not enough credit ... bid_price =', temp_bid_price,
                                              'self.fifa_account.credit = ', self.fifa_account.credit)
                                    return False
                                else:
                                    new_print(self.fifa_account, 'not enough credit.w8 5 minutes.')
                                    time.sleep(300)
                                    break
                            new_print(self.fifa_account, 'search player data = ', data)
                            # if trade_mode == 2:
                            #     if trade['itemData']['preferredPosition'] != pos:
                            #         continue
                            check_resp = self.check_trade(trade['tradeId'])
                            time.sleep(1)
                            json_check_resp = check_resp.json()
                            if json_check_resp['auctionInfo'][0]['tradeState'] != 'active':
                                new_print(self.fifa_account, 'trade is closed')
                                time.sleep(0.5)
                                continue
                            bid_resp = self.bid_trade(trade['tradeId'], data)
                            new_print(self.fifa_account, 'bid_resp = ', bid_resp,
                                      ' text = ', bid_resp.text[:100])
                            if trade_mode == 2:
                                if (bid_resp.text == 'Permission Denied' or
                                        bid_resp.text == '' or
                                        bid_resp.text == 'You are not allowed to bid on this trade'):
                                    time.sleep(1.5)
                                    self.main_dic['soft_ban_handler'] += 1
                                    if self.main_dic['soft_ban_handler'] > 70:
                                        text = 'account %s temperory cant bid. deactivated' % self.username
                                        new_print(self.fifa_account, text)
                                        self.send_message(bot, 'critical', text)
                                        self.sbc_worker.error_description = "temp cant bid"
                                        self.sbc_worker.has_error = True
                                        self.sbc_worker.save()

                                        self.handle_end_bot()
                                        time.sleep(50)
                                        return

                                    self.main_dic['empty_bid_handler'] += 1
                                    if self.main_dic['empty_bid_handler'] > 17:
                                        # text = 'too many empty bid %s'%self.username
                                        # self.send_message(bot, -1001444245007, text )
                                        time.sleep(60)
                                        self.main_dic['empty_bid_handler'] = 0
                                        raise Exception('Empty bid handler')
                                    continue
                                else:
                                    self.main_dic['soft_ban_handler'] = 0
                                    self.main_dic['empty_bid_handler'] = 0

                                    self.account_sbc_targets_buy_staff(accounts_sbc_id, bid_resp, position,
                                                                       trade['itemData']['assetId'],
                                                                       change_pos, filter_target)
                                    if not accounts_sbc_id:
                                        return trade['itemData']['id']
                            if trade_mode == 3:
                                try:
                                    bid_resp.json()
                                    check_for_json_resp = True
                                except:
                                    check_for_json_resp = False
                                if (bid_resp.text == 'Permission Denied' or
                                        bid_resp.text == '' or
                                        bid_resp.text == 'You are not allowed to bid on this trade' or
                                        (not check_for_json_resp)):
                                    continue
                                else:
                                    done = 1
                                    bought_trade = trade
                                    break
                            self.main_dic['bid_controller_count'] += 1
                            self.main_dic['temp_bid_controller'] += 1
                            temp_number_of_bids += 1
                            if temp_number_of_bids >= number_of_bids:
                                new_print(self.fifa_account, 'bid completed')
                                done = 1
                                break
                            time.sleep(randint(1, 3))
                            if trade_mode == 1:
                                let_it_go = 1
                        else:
                            new_print(self.fifa_account,
                                      'number of bids will be more than standard bid number. I wont bid')
                            done = 1
                            break
                    else:
                        let_it_go = 0
            if done:
                break
            start += 20
            if trade_mode == 2 or trade_mode == 3:
                break
            # time.sleep(1)
        if temp_number_of_bids < number_of_bids:
            self.main_dic['weak_target_controller_count'] += 1
        if trade_mode == 3:
            if done == 1:
                return bought_trade
            else:
                return False

    def account_sbc_targets_buy_staff(self, accounts_sbc_id, bid_resp, position, asset_id, change_pos,
                                      filter_target=None):
        json_bid_resp = bid_resp.json()
        player_club_id = json_bid_resp['auctionInfo'][0]['itemData']['id']
        data = '{"itemData":[{"id":%s,"pile":"club"}]}' % player_club_id
        new_print(self.fifa_account, 'data =', data)
        # item send to club
        resp = put_item_for_sale(self.se, self.main_dic['header'], data, self.server_key)
        json_resp = resp.json()
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/item/pile_club',
        )
        try:
            reason = json_resp['itemData'][0]['reason']
            new_print(self.fifa_account, 'duplicate item 3, reason ', reason)
            # self.se.get(f'{fifa_23_address/item?idList=%s'%(player_club_id,), headers=self.main_dic['header'])
            payload = {"type": "player", "start": 0, "count": 21, "sort": "desc", "sortBy": "value", "defId": asset_id}

            json_resp = self.se.post(f'{fifa_23_address}/club', json=payload,
                                     headers=self.main_dic['header']).json()
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/club',
            )
            dup_id = json_resp['itemData'][0]['id']
            data = '{"itemData":[{"id":%s,"pile":"club","swap":%s}]}' % \
                   (player_club_id, dup_id)
            resp = put_item_for_sale(self.se, self.main_dic['header'], data, self.server_key)
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/item/pile_club',
            )
            new_print(self.fifa_account, resp.text)

        except:
            pass

        # if str(json_bid_resp['auctionInfo'][0]['itemData']['preferredPosition']) != str(
        #         change_pos) and not filter_target:
        #     self.buy_pos_change_and_apply(json_bid_resp['auctionInfo'][0]['itemData']['preferredPosition'], change_pos,
        #                                   player_club_id)

        if accounts_sbc_id:
            current_sbc_process = SBCProcess.objects.filter(worker=self.sbc_worker, is_done=False).first()
            SBCProcessTarget.objects.create(sbc_process=current_sbc_process, club_id=player_club_id, position=position)

    def check_trade(self, trade_id):
        self.se.options(
            f'{fifa_23_address}/trade/status/lite?tradeIds={str(trade_id)}',
            headers=self.get_ea_options_header())
        resp = force_get(
            f'{fifa_23_address}/trade/status/lite?tradeIds={str(trade_id)}',
            self.fifa_account,
            self.se,
            self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/trade/status/lite?tradeIds=%s',
        )
        new_print(self.fifa_account, 'check trade : ', trade_id)
        return resp

    def sell_process(self, asset_id, club_id, trade_id_list, rare, rating, team_id, expired=False):
        trade_id_list = ''
        if trade_id_list:
            self.se.options(
                f'{fifa_23_address}/trade/status/lite?tradeIds={str(trade_id_list)}',
                headers=self.get_ea_options_header(method='PUT'))
            resp = force_get(
                f'{fifa_23_address}/trade/status/lite?tradeIds={str(trade_id_list)}',
                self.fifa_account,
                self.se,
                self.main_dic['header'])
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/trade/status/lite?tradeIds=%s',
            )
            json_resp = resp.json()
            trades = json_resp['auctionInfo']
            bid_list = []
            for trade in trades:
                if trade['currentBid'] != 0:
                    bid_list.append(trade['currentBid'])
            try:
                bid_price = most_common(bid_list)
                new_print(self.fifa_account, 'most bid price =', bid_price, 'asset id ', asset_id)
            except:
                new_print(self.fifa_account, 'bid list is empty')
                bid_price = 800
        else:
            bid_price = 800

        time.sleep(1.5)
        limits = self.get_price_limit(club_id)
        limits_json = limits.json()
        max_price = limits_json[0]['maxPrice']
        new_print(self.fifa_account, 'player limit max_price = ', max_price)
        complete_number = self.sbc_worker.complete_number
        force_manual = 0
        if complete_number > 0:
            force_manual = 1
        # price = self.search_price(get_next_price_grade(get_next_price_grade(bid_price)), asset_id,
        #                           trade_mode=3, rare=rare,
        #                           limit_max_price=max_price, force_manual=force_manual)
        price = 0
        # if complete_number == 0:
        time.sleep(0.5)
        resp = self.get_price_limit(club_id)
        js_resp = resp.json()
        min_price = js_resp[0]['minPrice']
        new_print(self.fifa_account, 'item price limits = ', js_resp)
        card_info = get_player_data_by_asset_id(player_asset_id=asset_id)
        new_print(self.fifa_account, 'asset id = ', asset_id, 'rate = ', rating, 'card info = ', card_info)
        try:
            # price, update_time, fp, fnp, fxp = self.get_player_price_from_futbin_web_app(
            futbin_result = self.get_player_price_from_futbin_web_app(
                card_info[0],
                rating,
                card_info[1],
                player_club=team_id,
                player_rare=rare,
                player_f=card_info[2],
                player_l=card_info[3],
                player_asset_id=asset_id,
            )
            price = futbin_result.get('price')
            price = int(price)
            back_steps = int(price)
            for i in range(5):
                back_steps = get_previous_price_grade(back_steps)
            if (int(price) != 0 and back_steps <= int(min_price)) and int(price) < 30000:
                new_print(self.fifa_account, 'quick sell this item price = ', price, ' and min price = ', min_price)
                resp2 = self.se.delete(
                    f'{fifa_23_address}/item/{club_id}',
                    headers=self.main_dic['header'])
                new_print(self.fifa_account, resp2.text)
                time.sleep(1)
            else:
                new_print(self.fifa_account,
                          f'will not quick sell 2 this item player price = {price} and min price = {min_price}')
        except:
            new_print(self.fifa_account, 'error 38 : ', traceback.format_exc())

        if not price and self.running_platform == 'web':
            new_print(self.fifa_account, 'price not found , sell item with min and max')
            self.item_put_for_sale(club_id, '', 0, start_price=min_price,
                                   buy_now_price=max_price)
            return
        if complete_number > 8 or (not price):
            new_print(self.fifa_account,
                      f'price not found , sell item with min and max 2 , {complete_number} , {price}')
            self.item_put_for_sale(club_id, '', 0, start_price=min_price,
                                   buy_now_price=max_price)
            return

        if complete_number > 10 or (not price):
            price = self.search_price(price, asset_id,
                                      trade_mode=3, rating=rating, rare=rare,
                                      limit_max_price=max_price, force_manual=force_manual)

        # for i in range(complete_number):
        #     price = get_previous_price_grade(get_previous_price_grade(get_previous_price_grade(get_previous_price_grade(price))))
        # if complete_number > 0:
        for i in range(complete_number):
            price = get_previous_price_grade(price)
        if expired:
            price = get_previous_price_grade(get_previous_price_grade(price))

        if price > 50000:
            int_price = 0
            try:
                a = int(price)
                int_price = 1
            except:
                pass

            if int_price:
                try:
                    player_name = ''
                    players_file = open(os.path.join(BASE_DIR, 'utils/players.json'), encoding='utf-8')
                    players_data = players_file.read()
                    players_file.close()
                    players_data = json.loads(players_data)
                    for player in players_data['LegendsPlayers']:
                        if str(player['id']) == str(asset_id):
                            if player.get('c'):
                                player_name = player['c']
                            else:
                                player_name = player['f'] + ' ' + player['l']
                            break
                    if not player_name:
                        for player in players_data['Players']:
                            if str(player['id']) == str(asset_id):
                                if player.get('c'):
                                    player_name = player['c']
                                else:
                                    player_name = player['f'] + ' ' + player['l']
                                break

                except:
                    player_name = ''
                if int_price > 500000:
                    text = f'''
                    Congratulations. Account {self.username} Earned a good player
                    player_name = {player_name}
                    player_price = {price}
                    player_asset = {asset_id}
                    player_rare_and_rate = {rare}, {rating}
                    '''.replace('  ', '')
                    text += f'\nconsole = {self.fifa_account.console}' if self.fifa_account.console else ''
                    self.send_message(bot, 123, text)

        new_print(self.fifa_account, 'sing1 , price = ', price, ' asset id = ', asset_id)
        try:
            price = int(price)
            self.item_put_for_sale(club_id, '', 0, start_price=get_previous_price_grade(price),
                                   buy_now_price=price)
        except:
            new_print(self.fifa_account, 'error 37 : ', traceback.format_exc())

    def apply_contract(self, player_club_id, manager=False, apply_num=1):
        new_print(self.fifa_account, 'apply contract failed. contract not exists any more')
        return
        payload = {"apply": [{"id": str(player_club_id)}]}
        url = f"{fifa_23_address}/item/resource/5001006"
        if manager:
            url = f"{fifa_23_address}/item/resource/5001010"

        new_print(self.fifa_account, 'applying contract , url : ', url, ' payload : ', payload)
        try:
            for ite in range(apply_num):
                resp = self.se.post(url, json=payload, headers=self.main_dic['header'])
                save_account_request(
                    fifa_account=self.fifa_account,
                    link=url
                )
                new_print(self.fifa_account, 'first contract resp : ', resp, resp.text)
                json_resp = resp.json()
                # new_print(self.fifa_account, 'first contract type is applied . result : ', json_resp)
        except:
            new_print(self.fifa_account, 'first contract type is finished. Try new one.')
            url = f"{fifa_23_address}/item/resource/5001003"
            if manager:
                url = f"{fifa_23_address}/item/resource/5001013"
            new_print(self.fifa_account, 'applying contract , url : ', url, ' payload : ', payload)
            try:
                for ite in range(apply_num):
                    resp = self.se.post(url, json=payload, headers=self.main_dic['header'])
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=url
                    )
                    new_print(self.fifa_account, 'second contract resp : ', resp, resp.text)
                    json_resp = resp.json()
                    # new_print(self.fifa_account, 'second contract type is applied . result : ', json_resp)
            except:
                new_print(self.fifa_account, 'second contract type is finished.')
                self.fifa_account.refresh_from_db()
                if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                    if manager:

                        self.manager_need_contracts += apply_num
                        new_print(self.fifa_account, 'manager contracts need to buy = ', self.manager_need_contracts)
                    else:
                        if self.fifa_account.credit > 7000:
                            self.need_contracts += apply_num
                            new_print(self.fifa_account, 'contracts need to buy = ', self.need_contracts)
                        else:
                            set_sbc_status(self.sbc_worker, 'need contract but low credit')
                            # tood : uncomment bellow after accounts have some play
                            # time.sleep(600)
                            new_print(self.fifa_account, 'contracts need to buy = ', self.need_contracts,
                                      ' but low credit ', self.fifa_account.credit)
                else:
                    new_print(self.fifa_account, 'no contract found. must buy a contract first')
                    if self.fifa_account.credit > 7000:
                        bought = 0

                        bid_count = 0
                        for i in range(10):
                            link = f'{fifa_23_address}/transfermarket?num=21&start=0&type=development&cat=contract&lev=gold&maxb=200'
                            resp = self.search_player(0, 0, '', link=link)
                            json_resp = resp.json()
                            auction_info = json_resp['auctionInfo']
                            auction_info = auction_info[::-1]
                            counter = 0
                            for auction in auction_info:
                                counter += 1
                                if counter == 11:
                                    break
                                if bid_count > 17:
                                    self.sbc_worker.error_description = "temp cant bid"
                                    self.sbc_worker.has_error = True
                                    self.sbc_worker.save()
                                    new_print(self.fifa_account, 'temp cant bid')
                                    self.handle_end_bot()
                                    time.sleep(300)
                                    return

                                check_resp = self.check_trade(auction['tradeId'])
                                json_check_resp = check_resp.json()
                                if json_check_resp['auctionInfo'][0]['tradeState'] != 'active':
                                    new_print(self.fifa_account, 'trade is closed')
                                    time.sleep(0.5)
                                    continue

                                bid_count += 1
                                bid_price = auction['buyNowPrice']
                                data = '{"bid":%d}' % bid_price
                                new_print(self.fifa_account, 'apply contract data = ', data)
                                bid_resp = self.bid_trade(auction['tradeId'], data)
                                if bid_resp.text.find(
                                        'Permission Denied') != -1 or bid_resp.text == '' or bid_resp.text.find(
                                    'You are not allowed to bid on this trade') != -1:
                                    time.sleep(1)
                                else:
                                    new_print(self.fifa_account, 'bid_resp.text = ', bid_resp.text)
                                    consume_id = auction['itemData']['id']
                                    data = '{"itemData":[{"id":%s,"pile":"club"}]}' % \
                                           (consume_id)
                                    new_print(self.fifa_account, 'data =', data)
                                    # item send to club
                                    put_item_for_sale(self.se, self.main_dic['header'], data, self.server_key)
                                    save_account_request(
                                        fifa_account=self.fifa_account,
                                        link=f'{fifa_23_address}/item/pile_club',
                                    )
                                    time.sleep(1.5)
                                    new_print(self.fifa_account, "auction['itemData']['resourceId'] = ",
                                              auction['itemData']['resourceId'])
                                    url = f"{fifa_23_address}/item/resource/%s" % \
                                          auction['itemData']['resourceId']
                                    self.se.post(url, data=payload,
                                                 headers=self.main_dic['header'])
                                    save_account_request(
                                        fifa_account=self.fifa_account,
                                        link=url,
                                    )
                                    # new_print(self.fifa_account,resp.content)
                                    bought = 1
                                    break
                            if bought:
                                break

                    else:
                        new_print(self.fifa_account, 'no credit to buy contract . will deactivate')
                        self.handle_end_bot()
                        time.sleep(300)
                        return

    def apply_healing(self, player_club_id):
        payload = {"apply": [{"id": str(player_club_id)}]}
        url = f"{fifa_23_address}/item/resource/5002030"
        resp = self.se.post(url, json=payload, headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=url,
        )
        try:
            json_resp = resp.json()
            new_print(self.fifa_account, 'apply healing was success. result : ', json_resp)
        except:
            new_print(self.fifa_account, 'first healing type is finished. Try new one. result : ', resp, resp.text)
            url = f"{fifa_23_address}/item/resource/5002031"
            resp = self.se.post(url, json=payload, headers=self.main_dic['header'])
            try:
                json_resp = resp.json()
                new_print(self.fifa_account, 'apply healing was success. result : ', json_resp)
            except:
                new_print(self.fifa_account, 'second healing type is finished. Try new one. result : ', resp, resp.text)
                if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                    self.need_heals += 1
                    new_print(self.fifa_account, 'heals need to buy =', self.need_heals)
                else:
                    self.need_heals += 1
                    new_print(self.fifa_account, 'apply_healing has not run on server')

    def apply_position_modifier(self, player_club_id, new_position_index):
        payload = {"apply": [{"id": str(player_club_id)}]}
        url = f"{fifa_23_address}/item/resource/5003181?position={new_position_index}"
        resp = self.se.post(url, json=payload, headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=url,
        )
        try:
            json_resp = resp.json()
            new_print(self.fifa_account, 'apply position change was success. result : ', json_resp)
            return True
        except:
            new_print(self.fifa_account, 'position change is finished. Try new one. result : ', resp, resp.text)
            if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                if self.fifa_account.credit > 10000:
                    self.need_position_change += 1
                    new_print(self.fifa_account, 'posistion change need to buy = ', self.need_position_change)
                else:
                    new_print(self.fifa_account, 'posistion change need to buy = ', self.need_position_change,
                              ' but low credit _p')
            else:
                self.need_position_change += 1
                new_print(self.fifa_account, 'apply_position_modifier has not run on server')
            return False

    def active_squad_handler(self, formation='4-4-2', use_contract=True, change_manager=False, try_counter=0):
        new_print(self.fifa_account, 'active squad handler : ', formation, ' -- ',
                  use_contract, ' -- ', change_manager, ' -- ', try_counter)
        # if self.sbc_worker.main_squad:
        #     new_print(self.fifa_account, 'main squad is already set')
        #     return True
        time.sleep(1)
        for nnnt in range(2):
            payload = {"type": "manager", "start": 0, "count": 190, "sort": "desc", "sortBy": "value"}
            resp = self.se.post(f'{fifa_23_address}/club', json=payload,
                                headers=self.main_dic['header'])
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/club'
            )
            json_resp = resp.json()
            managers = json_resp['itemData']
            club_id = managers[0]['id']
            if nnnt == 0 and len(managers) > 1 and change_manager:
                resp2 = self.se.delete(
                    f'{fifa_23_address}/item/{club_id}',
                    headers=self.main_dic['header'])
                new_print(self.fifa_account, 'remove current manager , remove status ', resp2, resp2.text)
                continue
            else:
                break
        # new_print(self.fifa_account,'temperory : manager contract data : ', json_resp)
        # manager_max_contract = -1
        # selected_manager = {}
        # manager_with_contracts = 0
        # for manager in managers:
        #     if manager['contract'] > manager_max_contract:
        #         manager_max_contract = manager['contract']
        #         selected_manager = manager
        #     if manager['contract'] > 0:
        #         manager_with_contracts += 1
        # if manager_with_contracts < 2 and manager_max_contract < 13:
        # if manager_max_contract < 10:
        selected_manager = managers[0]
        manager_club_id = selected_manager['id']
        needed_manager_contract = int(
            (40 - self.fifa_account.account_played_games - int(
                selected_manager['contract'])) / 13) + 1
        new_print(
            self.fifa_account,
            f'manager {manager_club_id}'
            f' has {selected_manager["contract"]}'
            f' contract - {needed_manager_contract}'
        )
        self.apply_contract(manager_club_id, manager=True, apply_num=needed_manager_contract)
        players_list = []
        players_asset_list = []
        players_list_full_data = []
        all_need_players = 22
        self.sbc_worker.refresh_from_db()
        # try:
        #     time.sleep(2)
        #     resp = self.se.get(
        #         f'{fifa_23_address/sbs/challenge/%s/squad' % (20,),
        #         headers=self.main_dic['header'])
        #     squad_resp = resp.json()
        #     squad_players = squad_resp['squad']['players']
        #     squad_club_ids = []
        #     for player in squad_players:
        #         if player['itemData']['id']:
        #             squad_club_ids.append(player)
        #     if len(squad_club_ids) == 11:
        #         for player in squad_club_ids[:5]:
        #             players_list.append(player['itemData']['id'])
        #             players_asset_list.append(player['itemData']['assetId'])
        #             if player['itemData']['contract'] < (10 - self.sbc_worker.loyal_played_numbers):
        #                 new_print(self.fifa_account, 'need to apply contract')
        #                 self.apply_contract(player['itemData']['id'])
        #         all_need_players -= 5
        #         new_print(self.fifa_account, 'all_need_players = ', all_need_players)
        # except:
        #     new_print(self.fifa_account, traceback.format_exc())
        # try:
        #     time.sleep(2)
        #     resp = self.se.get(
        #         f'{fifa_23_address/sbs/challenge/%s/squad' % (36,),
        #         headers=self.main_dic['header'])
        #     squad_resp = resp.json()
        #     squad_players = squad_resp['squad']['players']
        #     squad_club_ids = []
        #     for player in squad_players:
        #         if player['itemData']['id']:
        #             squad_club_ids.append(player)
        #     if len(squad_club_ids) == 11:
        #         for player in squad_club_ids[5:11]:
        #             players_list.append(player['itemData']['id'])
        #             players_asset_list.append(player['itemData']['assetId'])
        #             if player['itemData']['contract'] < (10 - self.sbc_worker.loyal_played_numbers):
        #                 self.apply_contract(player['itemData']['id'])
        #         all_need_players -= 6
        #         new_print(self.fifa_account, 'all_need_players = ', all_need_players)
        # except:
        #     new_print(self.fifa_account, traceback.format_exc())

        # if all_need_players < 18:
        team_positions = {
            '3-4-3': ['GK', 'CB', 'CB', 'CB', 'RM', 'CM', 'CM', 'LM', 'RW', 'ST', 'LW',
                      'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY',
                      'ANY', 'ANY', 'ANY', 'ANY'],
            '4-4-2': ['GK', 'RB', 'CB', 'CB', 'LB', 'RM', 'CM', 'CM', 'LM', 'ST', 'ST',
                      'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY', 'ANY',
                      'ANY', 'ANY', 'ANY', 'ANY'],
        }
        selected_positions = team_positions.get(formation, None) or team_positions.get('4-4-2')
        self.update_credit()
        self.fifa_account.refresh_from_db()
        new_print(self.fifa_account, 'all_need_players = ', all_need_players)
        time.sleep(1)

        if self.fifa_account.use_special_squad and self.fifa_account.fifaaccountsquadgame_set.count() > 20:
            new_print(self.fifa_account, 'using special squad')
            club_players = self.get_bronze_club_players(
                filter_bronze=False, players_list=players_asset_list,
                include_players_list=self.special_squad_players_build,
                special_payload={"count": 190, "searchAltPositions": True,
                                 "sort": "desc", "sortBy": "ovr", "start": 0, "type": "player"},
                get_sbc_storage=False,
            )
        else:
            # if all_need_players < 16:
            #     need_all = False
            # else:
            #     need_all = True
            new_print(self.fifa_account, 'using normal squad')
            # if self.fifa_account.credit < 7000:
            if False: # contract not exists anymore
                club_players = self.get_bronze_club_players(
                    filter_bronze=False, players_list=players_asset_list, sort_by='contract',
                    special_payload={"count": 190,"searchAltPositions": True,
                                     "sort": "desc","sortBy": "ovr","start": 0,"type": "player"}
                )
            else:
                club_players = self.get_bronze_club_players(
                    filter_bronze=False, players_list=players_asset_list,
                    special_payload={"count": 190, "searchAltPositions": True,
                                     "sort": "desc", "sortBy": "ovr", "start": 0, "type": "player"},
                    get_sbc_storage=False,
                )
            if len(club_players) <= 22:
                all_need_players = 18
                new_print(self.fifa_account, 'can not full all substitute : ')
                self.send_message(
                    None, 123,
                    f'can not full all substitute , less than minimum players , current {len(club_players)} account {self.fifa_account}',
                    message_thread_id=ARZBAZI_REPORT_TOPIC_SQUAD_ERROR_THREAD_MESSAGE_ID,
                )
        new_print(self.fifa_account, 'len(club_players) = ', len(club_players))
        if all_need_players > len(club_players):
            new_print(self.fifa_account, 'club player is less than all need players')
            return False
        # # use position change if special squad not in position
        # position_modifier_used = False
        # if self.fifa_account.use_special_squad:
        #     for special_card in self.special_squad_players_build:
        #         player_special_cards = [d for d in club_players if d['assetId'] == special_card]
        #         player_position_asset = self.special_squad_players_build_with_position.get(str(special_card))
        #         if player_special_cards:
        #             if player_position_asset[1] not in player_special_cards[0]['possiblePositions']:
        #                 new_print(self.fifa_account, 'need position change')
        #                 if len(player_position_asset) > 2:
        #                     position_modifier_use_result = self.apply_position_modifier(
        #                         player_special_cards[0]['id'],
        #                         player_position_asset[2])
        #                     if position_modifier_use_result:
        #                         position_modifier_used = True
        #                 else:
        #                     new_print(self.fifa_account, f'player {player_position_asset} [2] not found')
        #                     self.send_message(
        #                         bot, 123, f'player {player_position_asset} [2] not found {self.fifa_account.user_name}')
        # if position_modifier_used and try_counter < 1:
        #     return self.active_squad_handler(formation=formation, use_contract=use_contract,
        #                                      try_counter=try_counter + 1)
        counter = 0
        while len(players_list) <= all_need_players:
            try:
                selected_player_data = club_players[counter]
            except:
                new_print(self.fifa_account, 'error 115 : ',
                          'club_players : ', len(club_players),
                          'counter : ', counter,
                          'traceback : ', traceback.format_exc())
                break
            filtered_players = list(filter(
                lambda person: selected_positions[len(players_list)] in person['possiblePositions'], club_players
            ))
            new_print(self.fifa_account,
                      f'need player filter : {selected_positions[len(players_list)]} and len filtered players : {len(filtered_players)}')
            if filtered_players:
                for item in filtered_players:
                    if (item['id'] not in players_list and
                            item['assetId'] not in players_asset_list and
                            not item['statsArray'][-1] != 0):
                        selected_player_data = item
                        break
            if (selected_player_data['id'] in players_list or
                    selected_player_data['assetId'] in players_asset_list):
                new_print(self.fifa_account, 'selected player already in selected players')
                counter += 1
                continue
            # bellow condition : in reservation players if all or last 3 be GK in change injury player middle game will get error
            elif (len(club_players) > (counter + 4) and
                  18 >= len(players_list) >= 14 and
                  selected_player_data['preferredPosition'] == 'GK'):
                new_print(self.fifa_account, 'selected player is GK')
                counter += 1
                continue
            elif (len(club_players) > (counter + 4) and
                  18 >= len(players_list) >= 11 and
                  selected_player_data['statsArray'][-1] != 0):
                new_print(self.fifa_account, 'selected player has red card')
                counter += 1
                continue
            elif len(players_list) > 17:
                for unused_item in club_players:
                    if (not (unused_item['id'] in players_list) and
                            not (unused_item['assetId'] in players_asset_list)):
                        selected_player_data = unused_item
                        break
            players_list.append(selected_player_data['id'])
            players_asset_list.append(selected_player_data['assetId'])
            players_list_full_data.append(selected_player_data)
            new_print(self.fifa_account, 'add player ', selected_player_data['id'], ' -- ',
                      selected_player_data['assetId'], ' to squad players list, need ',
                      selected_positions[len(players_list) - 1],
                      ' and player is ', selected_player_data['possiblePositions'],
                      ' current contract : ', selected_player_data['contract'],
                      ' data : ', get_player_data_by_asset_id(player_asset_id=selected_player_data['assetId']))
        counter_1 = 0
        for player_item_full_data in players_list_full_data:
            counter_1 += 1
            if player_item_full_data['contract'] < (self.fifa_account.allowed_play_game - self.fifa_account.account_played_games + 1) and use_contract:
                if counter_1 <= 11:
                    needed_contract = int(
                        (self.fifa_account.allowed_play_game - self.fifa_account.account_played_games - int(
                            player_item_full_data['contract'])) / 13) + 1
                else:
                    needed_contract = 1 if int(player_item_full_data['contract']) < 1 else 0
                new_print(
                    self.fifa_account,
                    f'player {player_item_full_data["assetId"]}'
                    f' has {player_item_full_data["contract"]}'
                    f' contract - {needed_contract}'
                )
                self.apply_contract(player_item_full_data['id'], apply_num=needed_contract)
            if player_item_full_data['injuryGames'] > 0:
                self.apply_healing(player_item_full_data['id'])
        # save special squad ready or not
        not_duplicate_players = [xx for xx in self.special_squad_players_build
                                 if xx not in players_asset_list[:11]]
        if not_duplicate_players:
            self.fifa_account.special_squad_ready_to_play = False
            self.fifa_account.save(update_fields=['special_squad_ready_to_play'])
        else:
            self.fifa_account.special_squad_ready_to_play = True
            self.fifa_account.save(update_fields=['special_squad_ready_to_play'])
        if self.fifa_account.use_special_squad:
            new_print(self.fifa_account, 'player asset list : ', players_asset_list,
                      ' special squad players build : ', self.special_squad_players_build)
            not_duplicate_players = [xx for xx in self.special_squad_players_build
                                     if xx not in players_asset_list[:11]]
            if not_duplicate_players:
                self.fifa_account.special_squad_ready_to_play = False
                self.fifa_account.save(update_fields=['special_squad_ready_to_play'])
            else:
                self.fifa_account.special_squad_ready_to_play = True
                self.fifa_account.save(update_fields=['special_squad_ready_to_play'])

            not_duplicate_players_2 = [xx for xx in self.special_squad_players_build
                                       if xx not in players_asset_list]
            for xxf in not_duplicate_players_2:
                player_card_item = PlayerCard.objects.exclude(rating=0).filter(asset_id=xxf).order_by('rare').first()
                if player_card_item:
                    try:
                        card_info = get_player_data_by_asset_id(player_asset_id=xxf)
                        # player_price, update_time, fp, futbin_min_price, futbin_max_price = self.get_player_price_from_futbin_web_app(
                        futbin_result = self.get_player_price_from_futbin_web_app(
                            player_name=player_card_item.name,
                            player_rate=player_card_item.rating,
                            player_known_as=card_info[1],
                            player_rare=player_card_item.rare,
                            player_f=card_info[2], player_l=card_info[3],
                            player_asset_id=player_card_item.asset_id
                        )
                        player_price = futbin_result.get('price')
                        if int(player_price) >= 150:
                            player_card_item.price = int(player_price)
                        else:
                            player_card_item.price = 250
                        player_card_item.save()

                    except:
                        new_print(self.fifa_account, 'error on update player card price : ', traceback.format_exc())
                    self.need_players_for_special_squad.append(player_card_item)
            new_print(self.fifa_account, 'for special squad need : ', self.need_players_for_special_squad)
        empty_squad = {
            "id": 0, "squadName": "", "formation": '', 'chemistry': 0,
            'manager': [{"id": 0, "dream": False}],
            'players': [{"index": 0, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 1, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 2, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 3, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 4, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 5, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 6, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 7, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 8, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 9, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 10, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 11, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 12, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 13, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 14, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 15, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 16, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 17, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 18, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 19, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 20, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 21, "kitNumber": 0, "itemData": {"id": 0, "dream": False}},
                        {"index": 22, "kitNumber": 0, "itemData": {"id": 0, "dream": False}}
            ]
        }
        update_Squad_name_payload = copy.deepcopy(empty_squad)
        update_Squad_name_payload.update({"squadName": "best squad", "formation":'f442'})
        new_print(self.fifa_account, 'main squad = ', update_Squad_name_payload)
        resp = self.se.put(f"{fifa_23_address}/squad/0",
                           json=update_Squad_name_payload,
                           headers=self.main_dic['header'])
        new_print(self.fifa_account, 'resp.content = ', resp.text[:100])
        time.sleep(2)
        payload = copy.deepcopy(empty_squad)
        payload.update({
            "squadName": "best squad", "chemistry": 33,
            "manager": [{"id": manager_club_id, "dream": False}],
            "formation": f"f{formation.replace('-', '')}",
        })
        self.send_main_squad(payload, players_list)
        if self.need_contracts == 0 and self.manager_need_contracts == 0:
            self.sbc_worker.main_squad = True
            self.sbc_worker.save()
            self.sbc_worker.refresh_from_db()
        # else:
        #     new_print(self.fifa_account, 'all need players still 18 . no need to set squad')
        return True

    def get_player_price_from_futbin_web_app(
            self, player_name, player_rate, player_known_as='', player_club=0, player_rare=0,
            player_f='', player_l='', player_asset_id=0, resource_id=None, print_log=True):
        new_print(self.fifa_account, 'futbin search : player_name : ', player_name, ' - rate ', player_rate,
                  ' - known as ', player_known_as, ' - player rare ', player_rare, ' - club ', player_club)
        if not player_name:
            new_print(self.fifa_account, 'can not find player info without name')
            text = f'can not find player info without name {self.fifa_account} , {str(timezone.now())} ' \
                   f'player name : {player_name} , player_rate : {player_rate}'
            self.send_message(
                bot, 123, text,
                message_thread_id=ARZBAZI_REPORT_TOPIC_UNHANDLED_ERRORS_THREAD_MESSAGE_ID)
            return {'price': 0, 'update_time': 0, 'update_time_stamp': 0, 'local_time_stamp': time.time(),
                    'first_price': 0, 'futbin_min_price': 0, 'futbin_max_price': 0,
                    'asset_id': 0, 'display_name': '', }
        # params = {
        #     'year': 24,
        #     'extra': 1,
        #     'v': 1,
        #     'term': player_name
        # }
        params = {
            'query': player_name,
            'year': 25,
            'evolutions': False,
        }
        result = self.use_cloud_scraper(link='https://www.futbin.com/players/search', params=params)
        time.sleep(1)
        list_ids = []
        if print_log:
            new_print(self.fifa_account, 'futbin search result 3 : ', result.status_code, ' -- ', result.text)
        if result.status_code == 403 or (isinstance(result.json(), dict) and result.json().get('error')):
            return {'price': 0, 'update_time': 'Never', 'update_time_stamp': 0, 'local_time_stamp': time.time(),
                    'first_price': 0, 'futbin_min_price': 0, 'futbin_max_price': 0,
                    'asset_id': 0}
        result_json = result.json()
        for item in result_json:
            query_rating = item.get('ratingSquare').get('rating')
            if query_rating != str(player_rate):
                continue
            query_rare_text = deep_get(item, 'playerImage.version')
            query_rare = None
            if query_rare_text:
                if query_rare_text == 'Normal':
                    query_rare = 0
                else:
                    query_rare = RareFlag.objects.filter(name__iexact=query_rare_text.lower()).first()
                    if not query_rare:
                        new_print(self.fifa_account, 'can not find rare flag', query_rare_text)
                    else:
                        query_rare = query_rare.rare_id
            if len(result_json) == 1:
                # todo : remove after 'and' from bellow . this is added beacuse futbin return rare as 1 for common and rare
                if query_rare and str(player_rare) != str(query_rare) and int(player_rare) not in [0, 1]:
                    new_print(self.fifa_account, 'doesnt match rare type 6 ', player_rare, ' -- ', query_rare)
                else:
                    list_ids.append(item.get('id'))
                continue
            # todo : fix bellow commented
            # image_name_list = [ii.get('image', '') for ii in result_json]
            # if all(jj == image_name_list[0] for jj in image_name_list):
            #     if str(player_rare) != str(item['rare_type']):
            #         new_print(self.fifa_account, 'doesnt match rare type 5')
            #     else:
            #         list_ids.append(item.get('id'))
            #     continue
            if unidecode.unidecode(item.get('name').lower()) == unidecode.unidecode(
                    player_known_as.lower()) or unidecode.unidecode(
                item.get('name').lower()) == unidecode.unidecode(player_known_as.lower()):
                if str(player_rare) != str(query_rare) and player_rare not in [0, 1]:
                    new_print(self.fifa_account, 'doesnt match rare type 1 , ', player_rare, ' -- ', query_rare)
                else:
                    list_ids.append(item.get('id'))
                continue
            if (unidecode.unidecode(item.get('name').lower()) == unidecode.unidecode(player_f.lower()) or
                    unidecode.unidecode(item.get('name').lower()) == unidecode.unidecode(player_l.lower())):
                if str(player_rare) != str(query_rare):
                    new_print(self.fifa_account, 'doesnt match rare type 2')
                else:
                    list_ids.append(item.get('id'))
                continue
            found = 1
            for i in unidecode.unidecode(player_name.lower()).split():
                if not (i in unidecode.unidecode(item.get('name').lower())):
                    found = 0
            if found:
                # todo : remove after 'and' from bellow . this is added beacuse futbin return rare as 1 for common and rare
                if str(player_rare) != str(query_rare) and int(player_rare) not in [0, 1]:
                    new_print(self.fifa_account, 'doesnt match rare type 3 ', player_rare, ' -- ', query_rare)
                    if not list_ids:
                        new_print(self.fifa_account, 'no other item found, add it and next step will check')
                        list_ids.append(item.get('id'))
                else:
                    list_ids.append(item.get('id'))
                continue
            # todo : fix commented bellow
            # search_png = re.search('players/(\d+).png', item.get('image'))
            # if search_png and search_png.group(1) == player_asset_id:
            #     if str(player_rare) != str(item['rare_type']):
            #         new_print(self.fifa_account, 'doesnt match rare type 4')
            #     else:
            #         list_ids.append(item.get('id'))
            #     continue
        if print_log:
            new_print(self.fifa_account, 'list ids = ', list_ids)
        if not list_ids:
            new_print(self.fifa_account, 'can not find player list ids empty', list_ids, player_name, '---')
            text = f'can not find player list ids empty {self.fifa_account} , {str(timezone.now())} ' \
                   f'list ids : {list_ids} player name : {player_name} , player_rate : {player_rate}'
            self.send_message(bot, 123, text)
        # must_check_club = False
        for id_item in list_ids:

            if print_log:
                new_print(self.fifa_account, 'get futbin link 1 : {}/player/{}/a'.format(futbin_address, id_item))
            player_card_result = self.use_cloud_scraper(link=f'{futbin_address}/player/{id_item}/a')
            if player_card_result.status_code == 404:
                return {'price': 0, 'update_time': 0, 'update_time_stamp': 0, 'local_time_stamp': time.time(),
                        'first_price': 0, 'futbin_min_price': 0,
                        'futbin_max_price': 0, 'asset_id': 0}
            soup = BeautifulSoup(player_card_result.text, "html.parser")
            player_card_wrapper = soup.find(class_='player-card-wrapper')
            player_futbin_id = player_card_wrapper['data-id']
            player_rating = soup.find(class_='playercard-25-rating').text
            display_name = player_card_wrapper.find('div', attrs={'title': True})['title']
            player_wrapper_image = player_card_wrapper.find('img', class_='playercard-25-base-img')
            if not player_wrapper_image:
                player_wrapper_image = player_card_wrapper.find('img', class_='playercard-25-special-img')
            try:
                rare_image_url = player_card_wrapper.find('img')['src']
                current_player_rare = int(re.search(
                    r'hd/(\d+)_', str(urllib.parse.unquote(rare_image_url))
                ).group(1))
            except:
                current_player_rare = 2
            if player_rare and int(current_player_rare) != int(player_rare):
                new_print(self.fifa_account, 'special rare does not match 7, continue , rare : ', player_rare,
                          ' current_player_rare : ', current_player_rare)
                continue
            # player_card_info = soup.find(id='Player-card')
            # try:
            #     current_player_rare = int(player_card_info['data-rare-type'])
            # except:
            #     current_player_rare = 2
            # if player_club:

            # if current_player_rare < 2:
            #     player_versions = soup.find(class_="player-versions")
            #     try:
            #         pversions = player_versions.find_all(class_="pversion")
            #         if pversions:
            #             for pversion in pversions:
            #                 a_elem = pversion.find('a')
            #                 new_print(self.fifa_account,a_elem['data-level'], a_elem['data-rare-type'])
            #                 if a_elem['data-level'] == 'gold' and int(a_elem['data-rare-type']) <= 1:
            #                     new_print(self.fifa_account,'####### another gold card founded')
            #                     must_check_club = True
            #         else:
            #             new_print(self.fifa_account,'player hasnt any other card')
            #     except:
            #         new_print(self.fifa_account,'player hasnt any other card')
            # print('here')
            # if must_check_club:
            club_elem = soup.find('th', text='Club ID')
            # new_print(self.fifa_account, 'this club = ', club_elem.findNext('td').text)
            if club_elem and club_elem.findNext('td').text == str(player_club):
                # new_print(self.fifa_account, 'club is OK', player_club)
                pass
                # new_print(self.fifa_account,)('doesnt match club name. ', player_club)
            elif player_club:
                # todo : check and fix two month later.
                if club_elem:
                    futbin_club_name = soup.find('th', text='Club').findNext('td').text
                    similar_club_names = [futbin_club_name.strip(), futbin_club_name.strip()+' ( women )']
                    club_similar_ids = [str(iin[0]) for iin in SBC_TARGET_CLUBS if iin[1] in similar_club_names]
                    if str(player_club) in club_similar_ids:
                        new_print(self.fifa_account, 'club name found in similar : ',
                                  ' futbin club name : ', futbin_club_name, ' similar : ', club_similar_ids,
                                  ' player club : ', player_club)
                    else:
                        new_print(self.fifa_account, 'club name not found in similar : ',
                                  ' futbin club name : ', futbin_club_name, ' similar : ', club_similar_ids,
                                  ' player club : ', player_club)
                        continue
                else:
                    new_print(self.fifa_account, 'doesnt match club name. but for now pass. ', player_club, ' != ', )
                    continue
                # pass
            # if player_card_result.text.find('>' + player_club + '<') == -1:
            #     new_print(self.fifa_account,'doesnt match club name. ', player_club)
            #     # print('doesnt match club name. ', player_club)
            #     continue
            # page_info = soup.find(id='page-info')


            player_resource_id = re.search(r'/players/(.+)\.png',
                                           urllib.parse.unquote(
                                               player_wrapper_image['src']))
            if player_resource_id:
                player_resource_id = player_resource_id.group(1)
                player_resource_id = ''.join([ii for ii in player_resource_id if ii.isdigit()])
            else:
                player_resource_id = 0
            # player_price_id = page_info.get('data-player-resource')
            # player_resource_id = page_info.get('data-player-resource')
            if not player_resource_id:
                new_print(self.fifa_account, 'cant get data player resource , ', player_resource_id)
                return {'price': 0, 'update_time': 0, 'update_time_stamp': 0, 'local_time_stamp': time.time(),
                        'first_price': 0, 'futbin_min_price': 0, 'futbin_max_price': 0,
                        'asset_id': 0, 'display_name': display_name}
            if resource_id and int(player_resource_id) != int(resource_id):
                new_print(self.fifa_account, 'resource id does not match 2 , ',
                          player_resource_id, ' -- ', resource_id)
                continue
            futbin_result = self.get_price_from_futbin_and_futwiz(
                player_futbin_id, page_source=player_card_result.text
            )
            # futbin_prices = self.use_cloud_scraper(
            #     link='https://www.futbin.com/24/playerPrices?player={}'.format(player_price_id)
            # ).json().get(str(player_price_id), {}).get('prices', {}).get('ps', [])
            # futbin_all_prices_list = []
            # if futbin_prices.get('updated') == 'Never':
            #     continue
            if not player_asset_id:
                player_asset_id = int(soup.find('th', text='ID').parent.find('td').text)
            if futbin_result.get('price'):
                output_data = futbin_result
                output_data.update({
                    'asset_id': player_asset_id, 'resource_id': 0,
                    'player_name': player_name, 'player_rating': player_rating, 'display_name': display_name,
                })
                return output_data
        return {'price': 0, 'update_time': 0, 'update_time_stamp': 0, 'local_time_stamp': time.time(),
                'first_price': 0, 'futbin_min_price': 0, 'futbin_max_price': 0,
                'asset_id': 0, 'display_name': '', }

    # replace get_player_price_from_futbin_web_app with bellow. they are same but return multiple
    # def get_player_data_from_futbin_with_name(self, player_name, player_rate, player_known_as='', player_club='',
    #                                           resource_id=None):
    #     new_print(self.fifa_account, 'player_name : ', player_name, player_rate, player_known_as)
    #     params = {
    #         'year': 24,
    #         'extra': 1,
    #         'v': 1,
    #         'term': player_name
    #     }
    #     scraper = cloudscraper.create_scraper(browser={
    #         'browser': 'firefox',
    #         'platform': 'linux',
    #         'mobile': False
    #     })
    #     result = scraper.get('https://www.futbin.com/search', params=params)
    #     time.sleep(1)
    #     list_ids = []
    #     new_print(self.fifa_account, 'futbin search result 2 : ', result.json())
    #     if isinstance(result.json(), dict) and result.json().get('error'):
    #         return {}
    #     for item in result.json():
    #         if item.get('rating') != str(player_rate) and not resource_id:
    #             continue
    #         if unidecode.unidecode(item.get('name').lower()) == unidecode.unidecode(
    #                 player_known_as.lower()) or unidecode.unidecode(
    #             item.get('full_name').lower()) == unidecode.unidecode(player_known_as.lower()):
    #             list_ids.append(item.get('id'))
    #             continue
    #         found = 1
    #         for i in unidecode.unidecode(player_name.lower()).split():
    #             if not (i in unidecode.unidecode(item.get('full_name').lower())):
    #                 found = 0
    #         if found:
    #             list_ids.append(item.get('id'))
    #             continue
    #     new_print(self.fifa_account, 'list ids = ', list_ids)
    #     must_check_club = False
    #     for id_item in list_ids:
    #         new_print(self.fifa_account, 'get futbin link 2 : https://www.futbin.com/24/player/{}/'.format(id_item))
    #         player_card_result = scraper.get('https://www.futbin.com/24/player/{}/'.format(id_item))
    #         time.sleep(1)
    #         soup = BeautifulSoup(player_card_result.text, "html.parser")
    #         player_card_info = soup.find(id='Player-card')
    #         try:
    #             current_player_rare = int(player_card_info['data-rare-type'])
    #         except:
    #             current_player_rare = 2
    #         if current_player_rare < 2:
    #             player_versions = soup.find(class_="player-versions")
    #             try:
    #                 pversions = player_versions.find_all(class_="pversion")
    #                 if pversions:
    #                     for pversion in pversions:
    #                         a_elem = pversion.find('a')
    #                         new_print(self.fifa_account, a_elem['data-level'], a_elem['data-rare-type'])
    #                         if a_elem['data-level'] == 'gold' and int(a_elem['data-rare-type']) <= 1:
    #                             new_print(self.fifa_account, '####### another gold card founded')
    #                             must_check_club = True
    #                 else:
    #                     new_print(self.fifa_account, 'player hasnt any other card')
    #             except:
    #                 new_print(self.fifa_account, 'player hasnt any other card')
    #         if must_check_club:
    #             if player_card_result.text.find('>' + player_club + '<') == -1:
    #                 new_print(self.fifa_account, 'doesnt match club name. ', player_club)
    #                 continue
    #         page_info = soup.find(id='page-info')
    #         player_resource_id = page_info['data-player-resource']
    #         player_asset_id = page_info['data-baseid']
    #         player_rating = soup.find(class_='pcdisplay-rat')
    #         if player_rating:
    #             player_rating = int(player_rating.text)
    #         else:
    #             player_rating = None
    #         if resource_id and int(player_resource_id) != int(resource_id):
    #             new_print(self.fifa_account, 'resource id does not match , ',
    #                       player_resource_id, ' -- ', resource_id)
    #             continue
    #         time.sleep(2)
    #         futbin_result = self.get_price_from_futbin_and_futwiz(player_resource_id)
    #
    #         # futbin_prices = scraper.get('https://www.futbin.com/24/playerPrices?player={}'.format(player_resource_id)
    #         #                             ).json().get(str(player_resource_id), {}).get('prices', {}).get('ps', [])
    #         # futbin_all_prices_list = []
    #         # if futbin_prices.get('updated') == 'Never':
    #         #     continue
    #         # if futbin_prices.get('LCPrice', "0") != "0":
    #         #     futbin_all_prices_list.append(futbin_prices.get('LCPrice', "0"))
    #         # if futbin_prices.get('LCPrice2', "0") != "0":
    #         #     futbin_all_prices_list.append(futbin_prices.get('LCPrice2', "0"))
    #         # if futbin_prices.get('LCPrice3', "0") != "0":
    #         #     futbin_all_prices_list.append(futbin_prices.get('LCPrice3', "0"))
    #         # if futbin_prices.get('LCPrice4', "0") != "0":
    #         #     futbin_all_prices_list.append(futbin_prices.get('LCPrice4', "0"))
    #         # if futbin_prices.get('LCPrice5', "0") != "0":
    #         #     futbin_all_prices_list.append(futbin_prices.get('LCPrice5', "0"))
    #         # if len(futbin_all_prices_list) == 0:
    #         #     futbin_all_prices_list = ["0"]
    #         # new_print(self.fifa_account, futbin_all_prices_list)
    #         # futbin_player_price = max(set(futbin_all_prices_list), key=futbin_all_prices_list.count)
    #         # if futbin_player_price:
    #         if futbin_result.get('price'):
    #             output_data = futbin_result
    #             output_data.update({
    #                 'asset_id': player_asset_id, 'resource_id': player_resource_id,
    #                 'player_name': player_name, 'player_rating': player_rating})
    #             return output_data
    #     return {}

    # replace get_player_price_from_futbin_web_app with bellow. they are same but return multiple
    def get_player_data_from_futbin_with_name(self, player_name, player_rate, player_known_as='', player_club='',
                                              resource_id=None, rare=None):
        new_print(self.fifa_account, 'player_name 2 : ', player_name, ' -- ',
                  player_rate, ' -- ', player_known_as, ' -- ', resource_id, ' -- ', rare)
        scraper = cloudscraper.create_scraper(browser={
            'browser': 'firefox',
            'platform': 'linux',
            'mobile': False
        })
        # params = {
        #     'year': 24,
        #     'extra': 1,
        #     'v': 1,
        #     'term': player_name
        # }
        # result = scraper.get('https://www.futbin.com/search', params=params)
        params = {
            'query': player_name,
            'year': 25,
            'evolutions': False,
        }
        result = scraper.get('https://www.futbin.com/players/search', params=params)
        time.sleep(1)
        list_ids = []
        new_print(self.fifa_account, 'futbin search result 2 : ',
                  ' url : ', result.url,
                  ' text : ', result.text, ' code : ', result.status_code)
        if result.status_code == 403 or (isinstance(result.json(), dict) and result.json().get('error')):
            new_print(self.fifa_account, 'futbin result status is 403 or has error', result.status_code)
            return {}
        for item in result.json():
            query_rating = item.get('ratingSquare').get('rating')
            # if query_rating != str(player_rate) and not resource_id:
            if query_rating != str(player_rate):
                continue
            query_rare_text = deep_get(item, 'playerImage.version')
            query_rare = None
            if query_rare_text:
                if query_rare_text == 'Normal':
                    query_rare = 0
                else:
                    query_rare = RareFlag.objects.filter(name__iexact=query_rare_text.lower()).first()
                    if not query_rare:
                        new_print(self.fifa_account, 'can not find rare flag', query_rare_text)
                    else:
                        query_rare = query_rare.rare_id
            if rare and query_rare and int(query_rare) != int(rare):
                new_print(self.fifa_account, 'rare does not match 9')
                continue
            if unidecode.unidecode(item.get('name').lower()) == unidecode.unidecode(
                    player_known_as.lower()) or unidecode.unidecode(
                item.get('name').lower()) == unidecode.unidecode(player_known_as.lower()):
                list_ids.append(item.get('id'))
                continue
            found = 1
            for i in unidecode.unidecode(player_name.lower()).split():
                if not (i in unidecode.unidecode(item.get('name').lower())):
                    found = 0
            if found:
                list_ids.append(item.get('id'))
                continue
        new_print(self.fifa_account, 'list ids 2 = ', list_ids)
        must_check_club = False
        for id_item in list_ids:
            new_print(self.fifa_account, 'get futbin link 2 : {}/player/{}/a'.format(futbin_address, id_item))
            futbin_link = f'{futbin_address}/player/{id_item}/a'
            player_card_result = scraper.get(futbin_link)
            time.sleep(1)
            soup = BeautifulSoup(player_card_result.text, "html.parser")
            player_card_wrapper = soup.find(class_='player-card-wrapper')
            try:
                player_image_url = player_card_wrapper.find('img')['src']
                current_player_rare = int(re.search(
                    r'hd/(\d+)_', str(urllib.parse.unquote(player_image_url))
                ).group(1))
            except:
                current_player_rare = 2
            if rare and int(current_player_rare) != int(rare):
                new_print(self.fifa_account, 'special rare does not match , continue , rare : ', rare,
                          ' current_player_rare : ', current_player_rare)
                continue
            else:
                if current_player_rare < 2:
                    # todo : fix bellow , in fc 25
                    player_versions = soup.find(class_="player-versions")
                    try:
                        pversions = player_versions.find_all(class_="pversion")
                        if pversions:
                            for pversion in pversions:
                                a_elem = pversion.find('a')
                                new_print(self.fifa_account, a_elem['data-level'], a_elem['data-rare-type'])
                                if a_elem['data-level'] == 'gold' and int(a_elem['data-rare-type']) <= 1:
                                    new_print(self.fifa_account, '####### another gold card founded')
                                    must_check_club = True
                        else:
                            new_print(self.fifa_account, 'player hasnt any other card')
                    except:
                        new_print(self.fifa_account, 'player hasnt any other card 2')
            if must_check_club:
                if player_card_result.text.find('>' + player_club + '<') == -1:
                    new_print(self.fifa_account, 'doesnt match club name. ', player_club)
                    continue
            # player_card_wrapper = soup.find(class_='player-card-wrapper')
            player_futbin_id = player_card_wrapper['data-id']
            player_rating = player_card_wrapper.find(class_='playercard-25-rating')
            display_name = player_card_wrapper.find('div', attrs={'title': True})['title']
            # first_card_futbin_id = soup.find(class_='player-card-preview')['data-id']
            player_asset_id = int(soup.find('th', text='ID').parent.find('td').text)
            if player_rating:
                player_rating = int(player_rating.text)
            else:
                player_rating = None
            player_wrapper_image = player_card_wrapper.find('img', class_='playercard-25-base-img')
            if not player_wrapper_image:
                player_wrapper_image = player_card_wrapper.find('img', class_='playercard-25-special-img')
            player_resource_id = re.search(r'/players/(.+)\.png',
                                           urllib.parse.unquote(
                                               player_wrapper_image['src']))
            if player_resource_id:
                player_resource_id = player_resource_id.group(1)
                player_resource_id = ''.join([ii for ii in player_resource_id if ii.isdigit()])
            else:
                player_resource_id = 0
            if resource_id and int(player_resource_id) != int(resource_id):
                new_print(self.fifa_account, 'resource id does not match , ',
                          player_resource_id, ' -- ', resource_id)
                continue
            time.sleep(2)
            futbin_result = self.get_price_from_futbin_and_futwiz(
                player_futbin_id, page_source=player_card_result.text
            )

            # futbin_prices = scraper.get('https://www.futbin.com/24/playerPrices?player={}'.format(player_resource_id)
            #                             ).json().get(str(player_resource_id), {}).get('prices', {}).get('ps', [])
            # futbin_all_prices_list = []
            # if futbin_prices.get('updated') == 'Never':
            #     continue
            # if futbin_prices.get('LCPrice', "0") != "0":
            #     futbin_all_prices_list.append(futbin_prices.get('LCPrice', "0"))
            # if futbin_prices.get('LCPrice2', "0") != "0":
            #     futbin_all_prices_list.append(futbin_prices.get('LCPrice2', "0"))
            # if futbin_prices.get('LCPrice3', "0") != "0":
            #     futbin_all_prices_list.append(futbin_prices.get('LCPrice3', "0"))
            # if futbin_prices.get('LCPrice4', "0") != "0":
            #     futbin_all_prices_list.append(futbin_prices.get('LCPrice4', "0"))
            # if futbin_prices.get('LCPrice5', "0") != "0":
            #     futbin_all_prices_list.append(futbin_prices.get('LCPrice5', "0"))
            # if len(futbin_all_prices_list) == 0:
            #     futbin_all_prices_list = ["0"]
            # new_print(self.fifa_account, futbin_all_prices_list)
            # futbin_player_price = max(set(futbin_all_prices_list), key=futbin_all_prices_list.count)
            # if futbin_player_price:
            if futbin_result.get('price'):
                output_data = futbin_result
                output_data.update({
                    'asset_id': player_asset_id, 'resource_id': player_resource_id,
                    'player_name': player_name, 'player_rating': player_rating,
                    'display_name': display_name, 'futbin_link': futbin_link,
                })
                return output_data
        return {}

    # def get_price_from_futbin_and_futwiz(self, player_asset_id, print_log=True, wait_on_error=1000):
    #     """
    #
    #     @param player_asset_id: player resource id . for base card price send asset_id , for other card resource_id
    #     @type player_asset_id:
    #     @param print_log:
    #     @type print_log:
    #     @return:
    #     @rtype:
    #     """
    #     resp = self.use_cloud_scraper('https://www.futbin.com/24/playerPrices?player=%s' % player_asset_id).text
    #     try:
    #         # json_resp = resp.json()
    #         json_resp = json.loads(resp)
    #     except:
    #         # new_print(self.fifa_account, resp)
    #         new_print(self.fifa_account, 'error 40 : ', traceback.format_exc(), ' ,   futbin result : ', resp)
    #         if resp.find('Your client does not have permission') != -1:
    #             text = 'proxy %s:%s is dead for futbin' % (self.main_dic.get('proxy_ip'), self.main_dic.get('proxy_port'))
    #             self.send_message(bot, 'critical', text)
    #
    #             proxy = FifaProxy.objects.filter(ip_address=self.main_dic['proxy_ip'],
    #                                              port=self.main_dic['proxy_port']).first()
    #             if proxy:
    #                 proxy.delete()
    #             last_run = timezone.localtime() - timedelta(hours=2)
    #             self.sbc_worker.last_run_time = last_run
    #             self.sbc_worker.save()
    #
    #             self.handle_end_bot(without_update_time=1)
    #             return {}
    #         if wait_on_error:
    #             time.sleep(wait_on_error)
    #
    #     futbin_prices = json_resp[str(player_asset_id)]['prices']['ps']
    #     futbin_all_prices_list = []
    #     first_price = 0
    #     futbin_min_price = futbin_max_price = 0
    #     try:
    #         futbin_min_price = futbin_prices.get('MinPrice', "0")
    #         futbin_min_price = int(futbin_min_price.replace(',', ''))
    #         futbin_max_price = futbin_prices.get('MaxPrice', "0")
    #         futbin_max_price = int(futbin_max_price.replace(',', ''))
    #     except:
    #         pass
    #     if futbin_prices.get('LCPrice', "0") != "0":
    #         first_price = futbin_prices.get('LCPrice', "0")
    #         futbin_all_prices_list.append(futbin_prices.get('LCPrice', "0"))
    #     if futbin_prices.get('LCPrice2', "0") != "0":
    #         futbin_all_prices_list.append(futbin_prices.get('LCPrice2', "0"))
    #     if futbin_prices.get('LCPrice3', "0") != "0":
    #         futbin_all_prices_list.append(futbin_prices.get('LCPrice3', "0"))
    #     if futbin_prices.get('LCPrice4', "0") != "0":
    #         futbin_all_prices_list.append(futbin_prices.get('LCPrice4', "0"))
    #     if futbin_prices.get('LCPrice5', "0") != "0":
    #         futbin_all_prices_list.append(futbin_prices.get('LCPrice5', "0"))
    #     if print_log:
    #         new_print(self.fifa_account, 'futbin_all_prices_list = ', futbin_all_prices_list)
    #     if len(futbin_all_prices_list) == 0:
    #         futbin_all_prices_list = ["0"]
    #     futbin_player_price = most_common(futbin_all_prices_list)
    #     # futbin_player_price = json_resp[str(player_asset_id)]['prices']['ps']['LCPrice']
    #     futbin_price_update_time = str(json_resp[str(player_asset_id)]['prices']['ps']['updated'])
    #     if print_log:
    #         new_print(self.fifa_account, 'futbin player price , min : ', futbin_min_price,
    #                   ' current buy now : ', futbin_player_price, ' update time : ', futbin_price_update_time)
    #     if futbin_player_price:
    #         price = futbin_player_price
    #         # if (futwiz_ps_price_update_time_elem.find('min') != -1) and (
    #         #         futbin_price_update_time.find('hour') != -1 or futbin_price_update_time.find('week') != -1 or futbin_price_update_time.find('Never') != -1):
    #         #     price = futwiz_ps_price_elem
    #         # elif (futwiz_ps_price_update_time_elem.find('hrs') != -1) and (futbin_price_update_time.find('week') != -1 or futbin_price_update_time.find('Never') != -1):
    #         #     price = futwiz_ps_price_elem
    #         price = int(str(price).replace(',', ''))
    #         first_price = int(str(first_price).replace(',', ''))
    #         # return price, futbin_price_update_time, first_price, futbin_min_price, futbin_max_price
    #         return {'price': price, 'update_time': futbin_price_update_time, 'first_price': first_price,
    #                 'futbin_min_price': futbin_min_price, 'futbin_max_price': futbin_max_price,
    #                 'asset_id': 0, 'display_name': ''}
    #     else:
    #         return {}

    def get_price_from_futbin_and_futwiz(self, player_asset_id, print_log=True, wait_on_error=1000, page_source=None):
        """

        @param player_asset_id: player futbin id .
        @type player_asset_id:
        @param print_log:
        @type print_log:
        @return:
        @rtype:
        """
        if page_source:
            resp = page_source
        else:
            resp = self.use_cloud_scraper(f'{futbin_address}/player/{player_asset_id}/a')
            if resp.status_code == 404:
                return {}
            if resp.status_code == 403:
                new_print(self.fifa_account,
                          f'futbin return error 403 on {futbin_address}/player/{player_asset_id}/a ,',
                          ' seems proxy expired.')
            resp = resp.text
            if resp.find('Your client does not have permission') != -1:
                new_print(self.fifa_account, 'error 40 : ', traceback.format_exc(), ' ,   futbin result : ', resp)
                if resp.find('Your client does not have permission') != -1:
                    text = 'proxy %s:%s is dead for futbin' % (self.main_dic.get('proxy_ip'), self.main_dic.get('proxy_port'))
                    self.send_message(bot, 'critical', text)

                    proxy = FifaProxy.objects.filter(ip_address=self.main_dic['proxy_ip'],
                                                     port=self.main_dic['proxy_port']).first()
                    if proxy:
                        proxy.delete()
                    last_run = timezone.localtime() - timedelta(hours=2)
                    self.sbc_worker.last_run_time = last_run
                    self.sbc_worker.save(update_fields=['last_run'])

                    self.handle_end_bot(without_update_time=1)
                    return {}
                if wait_on_error:
                    time.sleep(wait_on_error)
        soup = BeautifulSoup(resp, "html.parser")
        card_price_info = None
        for iie in soup.find_all(class_='price-box'):
            # if 'price-box' in iie['class'] and 'player-price-not-ps' in iie['class'] and 'hidden' not in iie['class']:
            if 'price-box' in iie['class'] and 'player-price-not-ps' in iie['class'] and 'price-box-original-player' in iie['class']:
                card_price_info = iie
                break
        futbin_all_prices_list = []
        futbin_min_price = futbin_max_price = 0
        try:
            pr_price = card_price_info.find(class_='price-pr').text.split(' ')
            futbin_min_price = pr_price[1]
            futbin_min_price = int(futbin_min_price.replace(',', ''))
            futbin_max_price = pr_price[3]
            futbin_max_price = int(futbin_max_price.replace(',', ''))
        except:
            pass
        first_price = card_price_info.find(class_='lowest-price-1').text
        for itii in card_price_info.findAll(class_='lowest-price'):
            futbin_all_prices_list.append(itii.text.replace(',', ''))
        if print_log:
            new_print(self.fifa_account, 'futbin_all_prices_list = ', futbin_all_prices_list)
        if len(futbin_all_prices_list) == 0:
            futbin_all_prices_list = ["0"]
        futbin_player_price = most_common(futbin_all_prices_list)
        # futbin_player_price = json_resp[str(player_asset_id)]['prices']['ps']['LCPrice']
        futbin_price_update_time = card_price_info.find(
            class_='prices-updated'
        ).text.replace('Price Updated: ', '')
        if print_log:
            new_print(self.fifa_account, 'futbin player price , min : ', futbin_min_price,
                      ' current buy now : ', futbin_player_price, ' update time : ', futbin_price_update_time)
        console_display_name = soup.find(class_='playercard-25-name text-ellipsis').text
        if futbin_player_price:
            price = futbin_player_price
            price = int(str(price).replace(',', ''))
            first_price = int(str(first_price).replace(',', ''))
            return {'price': price, 'update_time': futbin_price_update_time, 'first_price': first_price,
                    'futbin_price_list': futbin_all_prices_list,
                    'futbin_min_price': futbin_min_price, 'futbin_max_price': futbin_max_price,
                    'update_time_stamp': convert_futbin_time(futbin_price_update_time),
                    'local_time_stamp': time.time(),
                    'asset_id': 0, 'display_name': console_display_name}
        else:
            return {}

    def items_sell_get_list(self, asset_id, club_id, items_list, rare, rate, team_id, expired=False,
                            last_sale_price=None):
        trade_id_list = ''
        items_list.append([asset_id, club_id, trade_id_list, rare, rate, team_id, expired, last_sale_price])

    def sbc_low_credit_staff(self, ):
        new_print(self.fifa_account, ('sbc_low_credit_staff'))
        asset_id_list = []
        current_sbc_process = SBCProcess.objects.filter(worker=self.sbc_worker, is_done=False).first()
        if current_sbc_process:
            sbc_targets = SBCTarget.objects.filter(sbc_type=current_sbc_process.sbc_type)
            for target in sbc_targets:
                asset_id_list.append(target.asset_id)

        if not self.manual_loyal:
            sbc_id = self.get_loyal_sbc_id(1, 20)
            if sbc_id:
                sbc_targets = SBCTarget.objects.filter(sbc_type=SBCType.objects.filter(id=sbc_id).first())
                for target in sbc_targets:
                    asset_id_list.append(target.asset_id)
            sbc_id = self.get_loyal_sbc_id(4, 36)
            if sbc_id:
                sbc_targets = SBCTarget.objects.filter(sbc_type=SBCType.objects.filter(id=sbc_id).first())
                for target in sbc_targets:
                    asset_id_list.append(target.asset_id)
        else:
            sbc_targets = SBCTarget.objects.filter(sbc_type=SBCType.objects.filter(sbc_number=20, must_done=3).first())
            for target in sbc_targets:
                asset_id_list.append(target.asset_id)
            sbc_targets = SBCTarget.objects.filter(sbc_type=SBCType.objects.filter(sbc_number=36, must_done=3).first())
            for target in sbc_targets:
                asset_id_list.append(target.asset_id)

        new_print(self.fifa_account, 'asset_id_list = ', asset_id_list)
        need_reloop = self.send_to_pile_tradeable_club_players(asset_id_list=asset_id_list)
        if need_reloop:
            sell_items(self, self.sbc_worker, self.fifa_account)
            # self.update_credit()

    def preview_and_open_good_gold_pack(self, ):
        new_print(self.fifa_account, 'start preview gold pack')
        try:
            pack_id = 10301
            coins = 7500
            # self.update_credit()
            self.fifa_account.refresh_from_db()
            if not self.main_dic['no_good_pack'] and self.fifa_account.credit > coins:
                url = f'{fifa_23_address}/preview/pack/{pack_id}/items'
                resp = self.se.post(url, headers=self.main_dic['header'])
                save_account_request(
                    fifa_account=self.fifa_account,
                    link=url
                )
                try:
                    json_resp = resp.json()
                except:
                    time.sleep(2)
                    resp = self.se.get(url, headers=self.main_dic['header'])
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=url,
                    )
                    try:
                        json_resp = resp.json()
                    except:
                        new_print(self.fifa_account, 'pack id %s is not previewable' % pack_id)
                        self.main_dic['no_good_pack'] = 1
                        return
                items = json_resp['itemList']
                sum_item_prices = 0
                players_list = []
                for item in items:
                    if item['itemType'] == 'player':
                        item_id = item.get('id')
                        resource_id = item.get('resourceId')
                        asset_id = item.get('assetId')
                        rating = item.get('rating')
                        team_id = item.get('teamid')
                        rare_flag = item.get('rareflag')
                        card_info = get_player_data_by_asset_id(
                            player_asset_id=asset_id)

                        try:
                            player_cache_name = f'futbin_player_{str(resource_id)}'
                            futbin_data = self.players_log_cache.get(player_cache_name)
                            if futbin_data and futbin_data.get('local_time_stamp') > (time.time() - (ONE_HOUR_SECONDS * 12)):
                                new_print(
                                    self.fifa_account,
                                    'this item was selected from futbin less than 60 minute ago ',
                                    ' , so use old data again : ', futbin_data)
                                futbin_result = futbin_data
                            else:
                                # price, update_time, fp, fnp, fxp = self.get_player_price_from_futbin_web_app(
                                futbin_result = self.get_player_price_from_futbin_web_app(
                                    card_info[0],
                                    rating,
                                    card_info[1],
                                    player_club=team_id,
                                    player_rare=rare_flag,
                                    player_f=card_info[2], player_l=card_info[3],
                                    player_asset_id=asset_id
                                )
                                if futbin_result.get('update_time_stamp'):
                                    self.players_log_cache.set(player_cache_name, futbin_result, timeout=ONE_WEEK_SECONDS)
                            price = futbin_result.get('price')
                            players_list.append({'asset id': asset_id, 'price': price})
                        except:
                            new_print(self.fifa_account, 'error 90', traceback.format_exc())
                            price = 0
                        # price = self.search_price(
                        #     1000, item['assetId'], trade_mode=3, rare=item['rareflag'], futbin_price_only=True)
                        sum_item_prices += int(price)
                        time.sleep(2)
                new_print(self.fifa_account,
                          'sum_item_prices preview pack = ', sum_item_prices,
                          'items : ', players_list)

                if sum_item_prices >= 10000:
                    # text = 'Gold pack preview seems good for account %s. Try to open it.\
                    #  expected coins get > %s and total coin need for open it = %s' \
                    #        % (self.username, sum_item_prices, coins)
                    text = f'''Gold pack preview seems good for account {self.username}.
                     Try to open it.
                     expected coins get > {sum_item_prices} and total coin need for open it = {coins}
                    '''.replace('  ', '')
                    text += f'\nconsole = {self.fifa_account.console}' if self.fifa_account.console else ''
                    new_print(self.fifa_account, text)
                    self.send_message(bot, 123, text, message_thread_id=ARZBAZI_REPORT_TOPIC_LOGS_THREAD_MESSAGE_ID)
                    url = f'{fifa_23_address}/purchased/items'
                    payload = {"packId": pack_id, "currency": "COINS"}
                    self.se.post(url, headers=self.main_dic['header'], json=payload)
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=url,
                    )
                    time.sleep(2)
                    sell_items(self, self.sbc_worker, self.fifa_account, check_players_pick=False)
                else:
                    new_print(self.fifa_account, 'its not a good pack')
                    self.main_dic['no_good_pack'] = 1
            else:
                new_print(self.fifa_account, 'not open preview gold pack : ',
                          self.main_dic['no_good_pack'],
                          self.fifa_account.credit, coins)
        except:
            new_print(self.fifa_account, 'error 77 : ', traceback.format_exc())
            close_old_connections()

    # def update_sbc(self, sbc_id, account_sbc_id, last_update):
    #     new_print(self.fifa_account, 'updating sbc ... sbc_id = ', sbc_id)
    #
    #     # TODO : fix this
    #     # if os.name == 'nt':
    #     #     sbc_type = SBCType.objects.filter(id=sbc_id).first()
    #     #     update_time = timezone.localtime()
    #     #     sbc_type.update_time = update_time
    #     #     sbc_type.save()
    #     #     return 'ok'
    #     while True:
    #         try:
    #             sbc_type = SBCType.objects.filter(id=sbc_id).first()
    #             sbc_type.refresh_from_db()
    #             sbc_type.updating_price = 1
    #
    #             sbc_type.checker_account = self.fifa_account
    #             sbc_type.save()
    #             self.fifa_account.refresh_from_db()
    #             if not self.fifa_account.need_captcha:
    #                 updated = 0
    #                 if not last_update:
    #                     last_update = timezone.localtime() - timedelta(minutes=90)
    #                 if timezone.localtime() > last_update + timedelta(minutes=60):
    #                     resp = self.update_sbc_from_futbin(sbc_type)
    #                     if resp == 'updated':
    #                         updated = 1
    #                 sbc_targets = SBCTarget.objects.filter(sbc_type=sbc_type)
    #                 if self.running_platform in ['console', 'console_web', 'console_web_pc']:
    #                     # new_print(self.fifa_account,'console check sbc players ...')
    #                     # self.public_moves.console_open_ultimate()
    #                     pass
    #                 console_can_use = True
    #                 for target in sbc_targets:
    #                     if self.running_platform in ['console', 'console_web', 'console_web_pc']:
    #                         # error = self.console_search_price(target.player, force_manual=1,
    #                         #                                   search_type='buy_sbc_targets')
    #                         # if str(error) == 'sid':
    #                         #     error = self.console_search_price(target.player, force_manual=1,
    #                         #                                       search_type='buy_sbc_targets')
    #                         #     if str(error) == 'sid':
    #                         #         sbc_type.refresh_from_db()
    #                         #         sbc_type.console_cant_use = True
    #                         #         sbc_type.updating_price = 0
    #                         #         update_time = timezone.localtime() - timedelta(hours=6)
    #                         #         sbc_type.update_time = update_time
    #                         #         # sbc_type.checker_account = None
    #                         #         sbc_type.need_recheck = False
    #                         #         console_can_use = False
    #                         #         sbc_type.save()
    #                         pass
    #
    #                     else:
    #                         self.search_price(target.price, target.asset_id, trade_mode=2, position=target.position,
    #                                           accounts_sbc_id=account_sbc_id, change_pos=target.pos, buy=0,
    #                                           team=target.team)
    #
    #                 if self.running_platform in ['console', 'console_web', 'console_web_pc']:
    #                     # if console_can_use:
    #                     #     sbc_type.refresh_from_db()
    #                     #     sbc_type.console_can_use = console_can_use
    #                     #     sbc_type.save()
    #                     # new_print(self.fifa_account,'console end of check sbc players ...')
    #                     # self.console_close_ultimate()
    #                     pass
    #                 sbc_type.refresh_from_db()
    #
    #                 # cursor2.execute('select sbc_price, sbc_actual_price ,sbc_number from sbc where id = %s', (sbc_id,))
    #                 # sbc_data = cursor2.fetchone()
    #                 update_time = timezone.localtime()
    #                 if sbc_type.sbc_actual_price > sbc_type.sbc_price:
    #                     text = 'sbc price is more than define price , sbc_id = %s.\nchecker account = %s' % (
    #                         sbc_id, self.username)
    #                     new_print(self.fifa_account, 'text = ', text)
    #                     self.send_message(bot, 123, text)
    #                     if not updated:
    #
    #                         resp = self.update_sbc_from_futbin(sbc_type)
    #                         if resp == 'updated':
    #                             time.sleep(60)
    #                             update_time = timezone.localtime() - timedelta(minutes=30)
    #                 # elif sbc_type.sbc_actual_price < sbc_type.sbc_price - 2000:
    #                 #     sbc_type.sbc_price = sbc_type.sbc_actual_price + 2000
    #                 #     sbc_type.save()
    #                 sbc_type.refresh_from_db()
    #                 sbc_type.updating_price = 0
    #                 sbc_type.update_time = update_time
    #                 # sbc_type.checker_account = None
    #                 sbc_type.need_recheck = False
    #                 sbc_type.save()
    #                 if self.running_platform not in ['console', 'console_web', 'console_web_pc']:
    #                     new_print(self.fifa_account, '5 minutes wait after updating sbc')
    #                     time.sleep(300)
    #                 break
    #             else:
    #                 new_print(self.fifa_account, 'wait for captcha solving . 30 sec')
    #                 time.sleep(30)
    #
    #         except:
    #             new_print(self.fifa_account, 'error 76 : ', traceback.format_exc())
    #             self.get_new_sid()

    def check_if_completed_sbc(self, father_number, sbc_number, sbc_process):
        link = f'{fifa_23_address}/sbs/setId/{father_number}/challenges'
        new_print(self.fifa_account, 'checking for completed sbc , link = ', link)
        time.sleep(2)
        resp = self.se.get(link, headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=link,
        )
        new_print(self.fifa_account, 'challenge resp = ', resp, resp.text[:1000])
        if resp.status_code == 492:
            new_print(self.fifa_account, f'challenge with father {father_number} not exits')
            return -1
        if resp.status_code == 460:
            new_print(self.fifa_account, f'challenge with father {father_number} not exits')
            return -2
        json_resp = resp.json()
        challenges = json_resp['challenges']
        completed_challenge = 0
        for challenge in challenges:
            if sbc_number == challenge['challengeId']:
                if challenge['status'] == 'COMPLETED':
                    completed_challenge = 1
                elif challenge['status'] == 'IN_PROGRESS':
                    completed_challenge = 2
        return completed_challenge

    def send_to_pile_tradeable_club_players(self, asset_id_list=None):
        if not asset_id_list:
            asset_id_list = []
        set_sub_log(self.sbc_worker, 'sen to pile stete')
        new_print(self.fifa_account, 'send_to_pile_tradeable_club_players')
        need_reloop = 0
        club_players = self.get_gold_club_players(exclude_squad=True)
        for player in club_players:
            if not player['untradeable']:
                if player['assetId'] not in asset_id_list:
                    new_print(self.fifa_account, 'item send to tradepile')
                    data = '{"itemData":[{"id":%s,"pile":"trade"}]}' % \
                           (player['id'])
                    new_print(self.fifa_account, 'data =', data)
                    put_item_for_sale(self.se, self.main_dic['header'], data, self.server_key)
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=f'{fifa_23_address}/item/pile_trade',
                    )
                    time.sleep(1.5)
                    need_reloop = 1
        set_sub_log(self.sbc_worker, 'end of sending')
        return need_reloop

    def buy_pos_change_and_apply(self, first_pos, sec_pos, player_club_id):
        # TODO: change position is changed in fifa 23 and must fix
        new_print(self.fifa_account, 'really need buy change position???')
        return False

    def search_target_in_club(self, asset_id, pos, must_done, team, tradable_type=0, rare_target=0,
                              target_filter: SBCTargetFilter = None, exclude_players_list=None, min_rate=0,
                              get_pages=1, sort_by_desc='asc', exclude_squad=True, exclude_rare_flags=None,
                              need_more_than=0):
        player_club_id = 0
        player_asset_id = 0
        player_rate = 0
        player_last_sale_price = 0
        exclude_asset_id = []
        need_more_than_list = []
        if exclude_rare_flags is None:
            exclude_rare_flags = []
        if self.fifa_account.use_special_squad:
            exclude_asset_id = self.special_squad_players_build
        if exclude_players_list:
            exclude_asset_id = exclude_asset_id + exclude_players_list
        all_club_players_data = []
        for nnnt in range(get_pages):
            if tradable_type == 3:  # means sbc storage only
                break
            if target_filter:
                # example filter payload for target filter
                # {
                #     'count': 21, 'league': 13, 'level': "silver", 'nation': 52, 'playStyle': 250, 'position': "CM",
                #     'rarityIds': "1", 'sort': "asc", 'sortBy': "value", 'start': 0, 'team': 1943, 'type': "player"
                # }
                payload = {"type": "player", "start": 0, "count": 190, "sort": sort_by_desc, "sortBy": "ovr", }
                if target_filter.team:
                    payload.update({'team': target_filter.team})
                if target_filter.position:
                    payload.update({'position': target_filter.position})
                if target_filter.league:
                    payload.update({'league': target_filter.league})
                if target_filter.nation:
                    payload.update({'nation': target_filter.nation})
                if target_filter.rarity_ids:
                    payload.update({'rarityIds': target_filter.rarity_ids})
                if target_filter.chemistry_style:
                    payload.update({'playStyle': target_filter.chemistry_style})
                if target_filter.level:
                    payload.update({'level': target_filter.level})

                # exclude club players from sbc
                if self.fifa_account.use_special_squad:
                    exclude_resource_id_list = []
                    resp2 = self.se.get(f"{fifa_23_address}/squad/0",
                                        headers=self.main_dic['header'])
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=f"{fifa_23_address}/squad/0",
                    )
                    for club_player in resp2.json().get('players', []):
                        exclude_resource_id_list.append(club_player.get('itemData', {}).get('resourceId', 0))
                    payload.update({'excldef': ','.join([str(ntt) for ntt in exclude_resource_id_list])})

            else:
                payload = {"type": "player", "start": 0, "count": 190, "sort": sort_by_desc, "sortBy": "ovr",
                           "defId": str(asset_id), "team": team}
                # if rare_target > 1:
                #     payload = {"type": "player", "start": 0, "count": 100, "sort": "asc", "sortBy": "ovr",
                #                "defId": str(asset_id), "team": team}
                # else:
                #     payload = {"type": "player", "start": 0, "count": 100, "sort": "asc", "sortBy": "ovr",
                #                "defId": str(asset_id), "level": "gold", "team": team}
            payload.update({'start': 190 * nnnt})
            payload_minus_start = payload.copy()
            payload_minus_start.pop('start')
            if self.all_club_players_by_search.get(str(payload_minus_start)):
                all_club_players_data = self.all_club_players_by_search.get(str(payload_minus_start))
                break
            new_print(self.fifa_account, 'search target in club payload = ', payload,
                      ' need more ', need_more_than)
            resp = self.se.post(f'{fifa_23_address}/club', json=payload,
                                headers=self.main_dic['header'])
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/club'
            )
            json_resp = resp.json()
            time.sleep(1)
            result_list = json_resp['itemData']
            all_club_players_data += result_list
            if len(result_list) < 180:
                self.all_club_players_by_search[str(payload_minus_start)] = all_club_players_data
                break

        #  this condition created to don't use squad in sbc in new accounts
        if not self.club_asset_id:
            # exclude squad players at all
            new_print(self.fifa_account, f'exclude squad from search targets')
            resp2 = self.se.get(f"{fifa_23_address}/squad/0",
                                headers=self.main_dic['header'])
            save_account_request(
                fifa_account=self.fifa_account,
                link=f"{fifa_23_address}/squad/0",
            )
            for squad_player in resp2.json().get('players', []):
                self.club_asset_id.append(deep_get(squad_player, 'itemData.assetId', 0))
            time.sleep(2)
            resp3 = self.get_items().json()['itemData']
            for unass_item in resp3:
                self.unassigned_asset_id.append(unass_item['assetId'])
            resp4 = get_trade_pile(self.fifa_account, self.se, self.main_dic).json()['auctionInfo']
            for transfer_itm in resp4:
                self.transfer_list_asset_id.append(deep_get(transfer_itm, 'itemData.assetId', 0))
            #
        if self.sbc_storage_players is None:
            resp3 = get_storage_pile(self.fifa_account, self.se, self.main_dic['header'])
            storage_pile_items = resp3.json().get('itemData') or []
            if not storage_pile_items:
                new_print(self.fifa_account, 'storage error 2? , ', resp3.text[:1000])
            self.sbc_storage_players = storage_pile_items
        else:
            storage_pile_items = self.sbc_storage_players
        if target_filter:
            if target_filter.team:
                storage_pile_items = [ii for ii in storage_pile_items if (ii.get('teamid') or 0) == target_filter.team]
            if target_filter.position:
                storage_pile_items = [ii for ii in storage_pile_items if (ii.get('preferredPosition') or 0) == target_filter.position]
            if target_filter.league:
                storage_pile_items = [ii for ii in storage_pile_items if (ii.get('leagueId') or 0) == target_filter.league]
            if target_filter.nation:
                storage_pile_items = [ii for ii in storage_pile_items if (ii.get('nation') or 0) == target_filter.nation]
            if target_filter.rarity_ids:
                storage_pile_items = [ii for ii in storage_pile_items if str(ii.get('rareflag') or 0) == target_filter.rarity_ids]
            if target_filter.chemistry_style:
                storage_pile_items = []
            if target_filter.level:
                levels_dict = {'bronze': list(range(0, 65)),
                               'silver': list(range(65, 75)),
                               'gold': list(range(75, 100))}
                storage_pile_items = [ii for ii in storage_pile_items if
                                      (ii.get('rating') or 0) in levels_dict.get(target_filter.level)]
        all_club_players_data = storage_pile_items + all_club_players_data

        for result in all_club_players_data:
            if result['rating'] < min_rate:
                continue
            if target_filter and target_filter.max_rating and target_filter.max_rating <= result['rating']:
                continue
            # if (result['rating'] > 85 and result['untradeable'] is False) or (
            #         result['rating'] > 98 and result['untradeable'] is True):
            if (result['untradeable'] is False and result['rating'] >= 85):
                new_print(self.fifa_account, f'player_rate_1 , player rate {result["rating"]} and will not use in sbc , untradable : {result["untradeable"]}')
                continue
            elif result['untradeable'] is True:
                if (target_filter and target_filter.max_rating and target_filter.max_rating <= result['rating']):
                    new_print(self.fifa_account,
                              f'player_rate_2 , player rate {result["rating"]} and will not use in sbc , untradable : {result["untradeable"]}')
                    continue
                elif (target_filter and not target_filter.max_rating) and result['rating'] >= 85:
                    new_print(self.fifa_account,
                              f'player_rate_3 , player rate {result["rating"]} and will not use in sbc , untradable : {result["untradeable"]}')
                    continue
            if (result['untradeable'] is True and tradable_type == 2) or (
                    result['untradeable'] is False and tradable_type == 1):
                continue
            if result['assetId'] in exclude_asset_id:
                # new_print(self.fifa_account, 'item found in club but in excluded , asset : ', result['assetId'],
                #           ' exclude_asset_id : ', exclude_asset_id)
                continue
            if (result['assetId'] in self.club_asset_id and exclude_squad) and result['assetId'] not in self.unassigned_asset_id and result['assetId'] not in self.transfer_list_asset_id and result['assetId'] not in storage_pile_items:
                continue
            if (result['rareflag'] > 1 and (not rare_target)) or str(result['rareflag']) in exclude_rare_flags:
                continue
            if result.get('loans') or result.get('loansInfo'):
                continue
            # both = 0 , untradbale = 1, tradable = 2,
            if result['untradeable'] is False and result.get('marketDataMinPrice', 5000) > 3000:
                continue
            # if not result.get('loans'):
            #     if result['rareflag'] > 1 and (not rare_target):
            #         continue
                # if must_done == 1:
                #     if result['loyaltyBonus'] == 1:
                #         continue
            player_club_id = result['id']
            player_asset_id = result['assetId']
            player_rate = result['rating']
            player_last_sale_price = result.get('lastSalePrice', 0) or 0
            # if str(result['preferredPosition']) != str(pos):
            #     if self.running_platform in ['console', 'console_web', 'console_web_pc']:
            #         if not target_filter:
            #             # new_print(self.fifa_account, 'position is not the same ...')
            #             data = '{"itemData":[{"id":%s,"pile":"trade"}]}' % player_club_id
            #             # new_print(self.fifa_account, 'data =', data)
            #             new_print(self.fifa_account,
            #                       'position is not the same ... , ',
            #                       'data = ', data, ' , item send to transfer list')
            #             # put_item_for_sale(data)
            #             resp = put_item_for_sale(self.se, self.main_dic['header'], data, self.server_key)
            #             new_print(self.fifa_account, 'put for sale resp = ', resp.text)
            #             player_club_id = 0
            #             player_asset_id = 0
            #             player_rate = 0
            #             continue
            #         else:
            #             pass
            #             # new_print(self.fifa_account, 'no need to change position')
            #     else:
            #         if not target_filter:
            #             new_print(self.fifa_account, 'need to change club player position')
            #
            #             self.buy_pos_change_and_apply(result['preferredPosition'], pos, player_club_id)
            #         else:
            #             pass
            #             # new_print(self.fifa_account, 'no need to change position')
            if player_club_id and len(need_more_than_list) < need_more_than:
                need_more_than_list.append(player_club_id)
                player_club_id = 0
                player_asset_id = 0
                player_rate = 0
                continue
            new_print(self.fifa_account,
                      'item found from club , id : ', player_club_id, ' , asset id : ', result['assetId'],
                      ' untradebale : ', result['untradeable'], ' last sale price : ', result.get('lastSalePrice'),
                      ' rating : ', player_rate)
            if player_club_id:
                # return [player_club_id, player_asset_id, player_rate]
                return {'player_club_id': player_club_id, 'player_asset_id': player_asset_id,
                        'player_rate': player_rate, 'player_last_sale_price': player_last_sale_price}
        return {'player_club_id': player_club_id, 'player_asset_id': player_asset_id,
                        'player_rate': player_rate, 'player_last_sale_price': player_last_sale_price}

    def calculate_team_rate_avg(self, rate_list: list = None):
        if not rate_list:
            return 0
        sum_rate_list = sum(rate_list)
        div_sum_rate_list = sum_rate_list / len(rate_list)
        total_excess = 0
        for player_rate in rate_list:
            if player_rate > div_sum_rate_list:
                total_excess += player_rate - div_sum_rate_list
        final_rate = int(round(sum_rate_list + total_excess) / len(rate_list))
        return final_rate

    # def check_complete_challenge(self, father_number, sbc_number):
    #     link = f'{fifa_23_address}/sbs/setId/{father_number}/challenges'
    #     new_print(self.fifa_account, 'link = ', link)
    #     time.sleep(2)
    #     resp = self.se.get(link, headers=self.main_dic['header'])
    #     save_account_request(
    #         fifa_account=self.fifa_account,
    #         link=link,
    #     )
    #     new_print(self.fifa_account, 'challenge resp = ', resp.text[:100])
    #     json_resp = resp.json()
    #     challenges = json_resp['challenges']
    #     completed_challenge = 0
    #     for challenge in challenges:
    #         if sbc_number == challenge['challengeId']:
    #             if challenge['status'] == 'COMPLETED':
    #                 completed_challenge = 1
    #     return completed_challenge

    # def solve_loyal_sbcs(self, ):
    #
    #     need_reloop = 0
    #     completed_challenge = self.check_complete_challenge(8, 20)
    #     if (not completed_challenge) and (not self.sbc_worker.first_xi):
    #         # solve_first_xi()
    #         need_reloop = self.new_method_solve_loyal(1, 20)
    #         if need_reloop:
    #             return need_reloop
    #     else:
    #         self.main_dic['first_xi'] = 1
    #         self.sbc_worker.first_xi = True
    #         self.sbc_worker.save()
    #         self.sbc_worker.refresh_from_db()
    #     completed_challenge = self.check_complete_challenge(10, 36)
    #     if (not completed_challenge) and (not self.sbc_worker.puzzle_master):
    #
    #         need_reloop = self.new_method_solve_loyal(4, 36)
    #         if need_reloop:
    #             return need_reloop
    #     else:
    #         self.main_dic['puzzle_master'] = 1
    #         self.sbc_worker.puzzle_master = True
    #         self.sbc_worker.save()
    #         self.sbc_worker.refresh_from_db()
    #     return need_reloop

    # def new_method_solve_loyal(self, loyal_need, sbc_number):
    #     need_reloop = 0
    #     sbc_id = self.get_loyal_sbc_id(loyal_need, sbc_number)
    #
    #     if not sbc_id:
    #         text = 'There is no sbc solution with least loyal players for sbc_number = %s %s ' % (
    #             sbc_number, self.username)
    #         self.send_message(bot, 123, text)
    #         if sbc_number == 18:
    #             self.sbc_worker.first_xi = True
    #             self.sbc_worker.save()
    #             self.sbc_worker.refresh_from_db()
    #         elif sbc_number == 36:
    #             self.sbc_worker.puzzle_master = True
    #             self.sbc_worker.save()
    #             self.sbc_worker.refresh_from_db()
    #
    #     if sbc_id:
    #         need_reloop = 1
    #         sbc_type = SBCType.objects.filter(id=sbc_id).first()
    #         SBCProcess.objects.create(worker=self.sbc_worker, sbc_type=sbc_type, sbc_number=sbc_type.sbc_number)
    #         self.open_sbc(sbc_number)
    #     return need_reloop

    def get_loyal_sbc_id(self, loyal_need, sbc_number):
        sbc_id = 0
        club_players = self.get_gold_club_players(rare=1, exclude_squad=True)
        club_players = self.get_loyal_players_from_players_list(club_players)
        sbcs = SBCType.objects.filter(sbc_number=sbc_number, must_done=2, submit_sbc=1)
        for sbc in sbcs:
            loyal_counter = 0
            sbc_targets = SBCTarget.objects.filter(sbc_type=sbc)
            for player in club_players:
                for target in sbc_targets:
                    # if (str(target[0]) == str(player['assetId'])) and (str(player['preferredPosition']) == str(target[1])):
                    if str(target.asset_id) == str(player['assetId']) and str(target.team) == str(player['teamid']):
                        loyal_counter += 1
            if loyal_counter >= loyal_need:
                sbc_id = sbc.id
                break
        return sbc_id

    # def solve_first_xi(self, ):
    #     new_print(self.fifa_account, 'in solve first xi')
    #     need_list = ['GK', 'RB', 'CB', 'CB', 'LB', 'CDM', 'RM', 'CM', 'CM', 'LM', 'ST']
    #     players_dic = {}
    #     first_player_id = ''
    #     first = 0
    #     change_list = []
    #     block_list = []
    #     # nation = 54
    #     default_nation = 18
    #     nation = default_nation
    #     main_counter = 0
    #     while True:
    #         try:
    #             last_change_list = change_list
    #             new_print(self.fifa_account, 'last_change_list = ', last_change_list)
    #             change_list = []
    #             start_again = 0
    #             main_counter += 1
    #             new_print(self.fifa_account, 'main counter = ', main_counter)
    #             end = 1
    #             # club_players = get_club_players_by_nation(nation)
    #             club_players = self.get_gold_club_players(exclude_squad=True)
    #             players = self.get_loyal_players_from_club_players(club_players, need_list)
    #
    #             new_print(self.fifa_account, 'block_list = ', block_list)
    #             for player in players:
    #                 if not first or player['rareflag'] > 0:
    #                     if player['leagueId'] not in self.get_league_id_list(players_dic):
    #                         if player['id'] not in block_list:
    #                             if nation:
    #                                 if nation != player['nation']:
    #                                     continue
    #                             players_dic[need_list.index(player['preferredPosition'])] = {
    #                                 'player_id': player['id'], 'asset_id': player['assetId'],
    #                                 'league_id': player['leagueId'], 'price': 0,
    #                                 'pos': player['preferredPosition'], 'loyal': 1,
    #                                 'real_pos': player['preferredPosition']
    #                             }
    #                             first_player_id = player['id']
    #                             new_print(self.fifa_account, 'selected player_id = ', player['id'])
    #                             if player['rareflag'] < 1:
    #                                 first = 1
    #                             nation = player['nation']
    #             if self.get_count_loyal_players(players_dic) < 1:
    #                 text = 'cant find any good loyal player %s' % self.username
    #                 self.send_message(bot, 123, text)
    #                 time.sleep(300)
    #
    #             # need_list = need_list[::-1]
    #             # need_counter = len(need_list)
    #             need_counter = -1
    #             for need in need_list:
    #                 need_counter += 1
    #                 # accept_list = similar_positions.get(need,[need])
    #                 accept_list = [need]
    #                 # if need == 'CM':
    #                 #     accept_list = [need, 'CAM']
    #                 # accept_list = [need, 'CDM']
    #                 if not players_dic.get(need_counter):
    #                     new_print(self.fifa_account, 'must find', need)
    #                     end = 0
    #                     unrare_part = '&rarityIds=1'
    #                     if need == 'RM' or need == 'RB':
    #                         unrare_part = ''
    #                     max_sp_counter = len(accept_list)
    #
    #                     sp_counter = 0
    #                     for accept in accept_list:
    #                         similar_pos = accept
    #                         sp_counter += 1
    #                         max_price = 2000
    #                         found = 0
    #                         while True:
    #
    #                             link = f'{fifa_23_address}/transfermarket?num=21&start=0&type=player&pos=%s&lev=gold&nat=%s&maxb=%s%s' % (
    #                                 similar_pos, nation, max_price, unrare_part)
    #                             resp = self.search_player(0, 0, '', link=link)
    #                             json_resp = resp.json()
    #                             auction_info = json_resp['auctionInfo']
    #                             for player in auction_info:
    #                                 if player['itemData']['leagueId'] not in self.get_league_id_list(players_dic):
    #                                     players_dic[need_counter] = {
    #                                         'player_id': '', 'asset_id': player['itemData']['assetId'],
    #                                         'league_id': player['itemData']['leagueId'], 'price': 1300,
    #                                         'pos': player['itemData']['preferredPosition'], 'loyal': 0,
    #                                         'real_pos': need
    #                                     }
    #                                     found = 1
    #                                     break
    #                             if found:
    #                                 break
    #
    #                             if max_price > 2600:
    #                                 if sp_counter < max_sp_counter:
    #                                     break
    #                                 else:
    #                                     if similar_pos == accept_list[0]:
    #                                         pass
    #                                     else:
    #                                         similar_pos = accept_list[0]
    #                                         continue
    #                             max_price = get_next_price_grade(max_price)
    #                             if max_price > 2700 and len(auction_info) > 10:
    #                                 for key in players_dic.keys():
    #                                     for auction in auction_info:
    #                                         # if (players_dic[key]['pos'] not in last_change_list) and (players_dic[key]['pos'] not in change_list):
    #                                         if players_dic[key]['pos'] not in last_change_list:
    #                                             if (players_dic[key]['league_id'] == auction['itemData']['leagueId'] and
    #                                                     players_dic[key]['pos'] !=
    #                                                     auction['itemData']['preferredPosition']):
    #                                                 if players_dic[key]['loyal'] and self.get_count_loyal_players(
    #                                                         players_dic) < 2:
    #                                                     pass
    #
    #                                                 else:
    #                                                     change_list.append(auction['itemData']['preferredPosition'])
    #                                                     new_print(self.fifa_account, 'change_list = ', change_list)
    #                                                     new_print(self.fifa_account,
    #                                                               'will change a player current = %s replace with %s' % (
    #                                                                   need, players_dic[key]['pos']))
    #                                                     del players_dic[key]
    #                                                     players_dic[need_counter] = \
    #                                                         {'player_id': '',
    #                                                          'asset_id': auction['itemData']['assetId'],
    #                                                          'league_id': auction['itemData']['leagueId'],
    #                                                          'price': 1300,
    #                                                          'pos': auction['itemData']['preferredPosition'],
    #                                                          'loyal': 0,
    #                                                          'real_pos': need}
    #
    #                                                     found = 1
    #                                                     break
    #                                                     # text = 'cant find a good list with this algorithm %s'%username
    #                                                     # send_message(bot,123,text)
    #                                                     # time.sleep(300)
    #                                     if found or start_again:
    #                                         break
    #                                 if not found:
    #                                     new_print(self.fifa_account, first_player_id)
    #                                     block_list.append(first_player_id)
    #                                     players_dic = {}
    #                                     change_list = []
    #                                     first = 0
    #                                     nation = default_nation
    #                                     start_again = 1
    #                                     new_print(self.fifa_account, 'First player is a bad one .I will start again')
    #                                     break
    #                             elif max_price > 2700 and len(auction_info) < 5:
    #                                 new_print(self.fifa_account, first_player_id)
    #                                 block_list.append(first_player_id)
    #                                 players_dic = {}
    #                                 change_list = []
    #                                 first = 0
    #                                 nation = default_nation
    #                                 start_again = 1
    #                                 new_print(self.fifa_account, 'There is no player at all. I will start again')
    #                                 break
    #                             if found or start_again:
    #                                 break
    #                         if found or start_again:
    #                             break
    #                 if start_again:
    #                     break
    #
    #                 new_print(self.fifa_account, 'players_dic = ', players_dic)
    #
    #             if end:
    #                 new_print(self.fifa_account, '*************************')
    #                 new_print(self.fifa_account, 'found a good solution for first xi')
    #                 new_print(self.fifa_account, 'players_dic = ', players_dic)
    #                 # for key in players_dic.keys():
    #                 #     if not players_dic[key]['player_id']:
    #                 #         price = search_price(players_dic[key]['price'], players_dic[key]['asset_id'],pos=players_dic[key]['real_pos'],
    #                 #                              trade_mode=3)
    #                 #         print 'price = ', price
    #                 #         try:
    #                 #             price = int(price)
    #                 #             player_id = search_player_and_bid(players_dic[key]['asset_id'],
    #                 #                                               (price), 1, trade_mode=2, max_bid_price=0,
    #                 #                                               pos=players_dic[key]['real_pos'])
    #                 #             players_dic[key]['player_id'] = player_id
    #                 #         except:
    #                 #             new_print(self.fifa_account,traceback.format_exc())
    #                 #
    #                 # final_check = 1
    #                 # for key in players_dic.keys():
    #                 #     if not players_dic[key]['player_id']:
    #                 #         final_check = 0
    #                 # if final_check:
    #                 #     players_list = []
    #                 #     for key in players_dic.keys():
    #                 #         players_list.append([players_dic[key]['player_id'],key])
    #                 #     send_squad_solution_and_open_pack(0, sbc_number=20, players=players_list,submit=0)
    #
    #
    #
    #         except:
    #             new_print(self.fifa_account, 'error 74 : ', traceback.format_exc())
    #             self.get_new_sid()

    # def get_count_loyal_players(self, players_dic):
    #     loyal_sum = 0
    #     for key in players_dic.keys():
    #         if players_dic[key]['loyal']:
    #             loyal_sum += 1
    #     return loyal_sum

    # def get_league_id_list(self, players_dic):
    #     league_list = []
    #     for key in players_dic.keys():
    #         league_list.append(players_dic[key]['league_id'])
    #     return league_list

    def get_loyal_players_from_players_list(self, club_players):
        players = []
        for player in club_players:
            if player['loyaltyBonus'] == 1:
                players.append(player)
        return players

    # def get_loyal_players_from_club_players(self, club_players, need_list):
    #     players = []
    #     for player in club_players:
    #         if player['loyaltyBonus'] == 1:
    #             if player['preferredPosition'] in need_list:
    #                 players.append(player)
    #
    #     return players

    # def get_club_players_by_nation(self, nation):
    #     temp_list = []
    #     payload = {"type": "player", "start": 0, "count": 51, "sort": "desc", "sortBy": "value", "level": "gold",
    #                "nation": nation}
    #     resp = self.se.post(f'{fifa_23_address}/club', json=payload,
    #                         headers=self.main_dic['header'])
    #     save_account_request(
    #         fifa_account=self.fifa_account,
    #         link=f'{fifa_23_address}/club',
    #     )
    #     json_resp = resp.json()
    #     result_list = json_resp['itemData']
    #     for result in result_list:
    #         if not result.get('loans'):
    #             temp_list.append(result)
    #     club_players = temp_list
    #     return club_players

    def get_gold_club_players(self, rare=0, exclude_squad=False):
        temp_list = []
        exclude_resource_id_list = []
        payload = {"type": "player", "start": 0, "count": 100, "sort": "desc", "sortBy": "value", "level": "gold"}
        if exclude_squad:
            resp2 = self.se.get(f"{fifa_23_address}/squad/0",
                                headers=self.main_dic['header'])
            for club_player in resp2.json().get('players'):
                exclude_resource_id_list.append(club_player.get('itemData', {}).get('resourceId', 0))
            payload.update({'excldef': ','.join([str(ntt) for ntt in exclude_resource_id_list])})
        new_print(self.fifa_account, 'get gold club players payload : ', payload)
        resp = self.se.post(f'{fifa_23_address}/club', json=payload,
                            headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/club',
        )
        json_resp = resp.json()
        result_list = json_resp['itemData']
        for result in result_list:
            if not result.get('loans') and not result.get('loansInfo'):
                if rare:
                    if result['rareflag'] > rare:
                        continue
                temp_list.append(result)
        club_players = temp_list
        return club_players

    # def check_item(self, item, contract=True, injury=True):
    #     ok = True
    #     if item['contract'] < 1 and contract:
    #         ok = False
    #     if item['injuryGames'] > 0 and injury:
    #         ok = False
    #     return ok

    def get_full_club_players(self, get_pages=5):
        payload = {"type": "player", "start": 0, "count": 190, "sort": "desc", "sortBy": "value"}
        temp_list = []
        red_card_players = []
        new_print(self.fifa_account, 'get club players , payload : ', payload)
        for nnnt in range(get_pages):
            payload.update({'start': 190 * nnnt})
            resp = self.se.post(f'{fifa_23_address}/club', json=payload, headers=self.main_dic['header'])
            time.sleep(2)
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/club'
            )
            json_resp = resp.json()
            result_list = json_resp['itemData']
            if len(result_list) <= 0:
                break
            for result in result_list:
                if result['statsArray'][-1] != 0:
                    red_card_players.append(result)
                temp_list.append(result)
        return {'club_players': temp_list, 'red_card_players': red_card_players}

    def get_active_squad_players(self):
        active_squad_response = self.se.get(
            f"{fifa_23_address}/squad/active", headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f"{fifa_23_address}/squad/active",
        )
        active_squad_response_json = active_squad_response.json()
        temp_squad = []
        for item in (active_squad_response_json.get('players') or []):
            temp_squad.append(item['itemData'])
        return {'squad_players': temp_squad}

    def get_sbc_storage_players(self):
        resp3 = get_storage_pile(self.fifa_account, self.se, self.main_dic['header'])
        storage_pile_items = resp3.json().get('itemData') or []
        return {'sbc_storage_players': storage_pile_items}

    def get_filtered_club_players(
            self, asset_id: int = None, tradable_type=0, sort_by='rating', exclude_squad=False,
            include_resource_list=None, exclude_resource_list=None,
            search_filter: dict = None, exclude_rare_flags=None, max_rating=100, min_rating=0,
            get_sbc_storage=True, save_some_items=0):
        new_print(self.fifa_account, 'get filtered club players ', asset_id, '--',
                  tradable_type, ' -- ', ' exclude_squad ', exclude_squad,
                  ' exclude_resource_list ', exclude_resource_list, ' search_filter', search_filter,
                  ' first 5 exclude_rare_flags ', str(exclude_rare_flags)[:20],
                  ' rating ', min_rating, ' -- ', max_rating,
                  ' get_sbc_storage ', get_sbc_storage, ' save_some_items ', save_some_items
                  )
        if exclude_rare_flags is None:
            exclude_rare_flags = []
        if exclude_resource_list is None:
            exclude_resource_list = []
        if search_filter is None:
            search_filter = {}
        if not self.club_players_information:
            self.club_players_information.update({
                'club_players': [],
                'squad_players': [],
                'sbc_storage_players': [],
            })
            self.club_players_information.update(self.get_full_club_players(get_pages=20))
            self.club_players_information.update(self.get_active_squad_players())
            self.club_players_information.update(self.get_sbc_storage_players())
            with open(os.path.join(BASE_DIR, 'example_players.json'), 'w') as json_file:
                json_file.write(json.dumps(self.club_players_information, indent=4))
        full_players_list = self.club_players_information['club_players']
        if tradable_type == 3:
            full_players_list = []
        if get_sbc_storage:
            full_players_list = self.club_players_information['sbc_storage_players'] + full_players_list
        squad_players_id_set = {ii['id'] for ii in self.club_players_information['squad_players']}
        resul_players_list = []
        seen_resource_ids = set()

        for item in full_players_list:
            if exclude_squad and item['id'] in squad_players_id_set:
                continue
            if item.get('academyAttributes'):  # this means player evolved . dont use it
                continue
            if asset_id and asset_id != item['assetId']:
                continue
            resource_id = item['resourceId']
            if resource_id in seen_resource_ids:
                continue
            seen_resource_ids.add(resource_id)
            if resource_id in exclude_resource_list:
                continue
            if item.get('loans') or item.get('loansInfo'):
                continue
            if str(item['rareflag']) in exclude_rare_flags:
                continue
            rating = int(item['rating'])
            if rating >= max_rating or rating <= min_rating:
                continue
            if item['untradeable'] is False and rating >= 85:
                continue
            if (item['untradeable'] is True and tradable_type == 2) or \
                    (item['untradeable'] is False and tradable_type == 1):
                continue
            resul_players_list.append(item)
        resul_players_list = list(sorted(resul_players_list, key=lambda item_1: item_1['rating']))

        if search_filter:
            position = search_filter.get('position')
            league = search_filter.get('league')
            nation = search_filter.get('nation')
            team = search_filter.get('team')
            rarity = search_filter.get('rarityIds')
            play_style = search_filter.get('playStyle')
            level_key = search_filter.get('level')

            level_ranges = {
                'bronze': range(0, 65),
                'silver': range(65, 75),
                'gold': range(75, 100),
            }
            level_range = level_ranges.get(level_key) if level_key else None
            resul_players_list = [
                iie for iie in resul_players_list
                if (not level_range or int(iie.get('rating') or 0) in level_range)
                   and (not position or iie.get('preferredPosition') in [position, 'any'])
                   and (not league or str(iie.get('league')) == str(league))
                   and (not nation or str(iie.get('nation')) == str(nation))
                   and (not team or str(iie.get('teamid')) == str(team))
                   and (not rarity or str(iie.get('rareflag')) == str(rarity))
                   and (not play_style or str(iie.get('playStyle')) == str(play_style))
            ]

        if save_some_items:
            color_groups = defaultdict(deque)

            for player_card in resul_players_list:
                player_card['rating_color'] = (
                    'bronze' if int(player_card['rating']) < 65 else
                    'silver' if 65 <= int(player_card['rating']) <= 74 else
                    'gold'
                )
                color_groups[player_card['rating_color']].append(player_card)

            updated_players = []
            for group in color_groups.values():
                for _ in range(min(save_some_items, len(group))):
                    group.popleft()
                updated_players.extend(group)
            resul_players_list = updated_players
        return resul_players_list

    def remove_from_club_players_information(self, item_id):
        if not self.club_players_information:
            return {'status': False, 'error': 'club players empty'}
        item_found = None
        if not item_found:
            club_items = self.club_players_information.get('club_players')
            for index, item in enumerate(club_items):
                if item["id"] == item_id:
                    item_found = club_items.pop(index)
                    break
        if not item_found:
            storage_items = self.club_players_information.get('sbc_storage_players')
            for index, item in enumerate(storage_items):
                if item["id"] == item_id:
                    item_found = storage_items.pop(index)
                    break
        return {'status': item_found is not None, 'item_data': item_found}

    def add_to_club_players_information(self, item_info, data_part_name='club_players'):
        if not self.club_players_information:
            return {'status': False, 'error': 'club players empty'}
        if data_part_name == 'club_players':
            self.club_players_information['club_players'].append(item_info)
            return {'status': True, 'item_info': item_info}
        elif data_part_name == 'sbc_storage_players':
            self.club_players_information['sbc_storage_players'].append(item_info)
            return {'status': True, 'item_info': item_info}
        else:
            return {'status': False, 'error': 'bad data part name'}

    def convert_target_filter_to_payload(self, target_filter: SBCTargetFilter):
        payload = {}
        if target_filter.team:
            payload.update({'team': target_filter.team})
        if target_filter.position:
            payload.update({'position': target_filter.position})
        if target_filter.league:
            payload.update({'league': target_filter.league})
        if target_filter.nation:
            payload.update({'nation': target_filter.nation})
        if target_filter.rarity_ids:
            payload.update({'rarityIds': target_filter.rarity_ids})
        if target_filter.chemistry_style:
            payload.update({'playStyle': target_filter.chemistry_style})
        if target_filter.level:
            payload.update({'level': target_filter.level})
        return payload

    def get_bronze_club_players(self, rare=0, filter_bronze=False, players_list=[], tradeable=False, sort_by='rating',
                                exclude_squad=False, include_players_list=None, get_pages=1,
                                special_payload: dict = None, exclude_rare_flags=None, max_rating=100, min_rating=0,
                                get_sbc_storage=True, save_some_items=0):
        new_print(self.fifa_account, 'get bronze club players ', filter_bronze,
                  ' -- trade ', tradeable, ' -- sort ', sort_by, ' -- exclude squad ', exclude_squad,
                  ' -- max rate ', max_rating, ' -- min rating ', min_rating, ' -- get sbc sotrage ', get_sbc_storage)
        if include_players_list is None:
            include_players_list = []
        if exclude_rare_flags is None:
            exclude_rare_flags = []
        temp_list = []
        exclude_resource_id_list = []
        club_asset_id = []
        payload = {"type": "player", "start": 0, "count": 190, "sort": "desc", "sortBy": "value"}
        if filter_bronze:
            payload.update({"level": "bronze"})
        if special_payload:
            payload = special_payload
        if exclude_squad:
            resp2 = self.se.get(f"{fifa_23_address}/squad/0",
                                headers=self.main_dic['header'])
            save_account_request(
                fifa_account=self.fifa_account,
                link=f"{fifa_23_address}/squad/0",
            )
            for club_player in resp2.json().get('players', []):
                exclude_resource_id_list.append(club_player.get('itemData', {}).get('resourceId', 0))
                club_asset_id.append(deep_get(club_player, 'itemData.assetId', 0))
            payload.update({'excldef': ','.join([str(ntt) for ntt in exclude_resource_id_list])})
        if get_sbc_storage:
            if self.sbc_storage_players is None:
                resp3 = get_storage_pile(self.fifa_account, self.se, self.main_dic['header'])
                storage_pile_items = resp3.json().get('itemData') or []
                if not storage_pile_items:
                    new_print(self.fifa_account, 'storage error? , ', resp3.text[:1000])
                self.sbc_storage_players = storage_pile_items
            else:
                storage_pile_items = self.sbc_storage_players
        else:
            storage_pile_items = []
        red_card_players = []
        for nnnt in range(get_pages):
            payload.update({'start': 190 * nnnt})
            resp = self.se.post(f'{fifa_23_address}/club', json=payload,
                                headers=self.main_dic['header'])
            time.sleep(2)
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/club'
            )
            json_resp = resp.json()
            result_list = json_resp['itemData']
            if nnnt == 0:
                result_list = storage_pile_items + result_list
            if len(result_list) <= 0:
                break
            for result in result_list:
                # print('item : ', result)
                if result['resourceId'] in [iin['resourceId'] for iin in temp_list]:
                    # this code make sure no duplicate item goes to templist
                    continue
                if result.get('loans') or result.get('loansInfo'): # loans changed to loansInfo
                    continue
                if result.get('endTime'):
                    continue
                if str(result['rareflag']) in exclude_rare_flags:
                    continue
                if int(result['rating']) >= max_rating or int(result['rating']) <= min_rating:
                    continue
                # if rare:
                #     if result['rareflag'] > rare:
                #         continue
                # if self.check_item(result):
                #     temp_list.append(result)
                if tradeable and result['untradeable'] == True:
                    continue
                if result['assetId'] in players_list:
                    continue
                if result['statsArray'][-1] != 0:
                    red_card_players.append(result)
                    continue
                if exclude_squad and result['assetId'] in club_asset_id:
                    continue
                temp_list.append(result)
        # club_players = temp_list
        if sort_by == 'contract':
            # oder players by contract
            club_players = list(sorted(temp_list, key=lambda item: item['contract'], reverse=True))
        else:
            # order players by rating
            club_players = list(sorted(temp_list, key=lambda item: item['rating'], reverse=True))
        new_print(self.fifa_account, 'normal cards : ', len(temp_list), ' red cards : ', len(red_card_players))
        club_players = club_players + red_card_players
        if include_players_list:
            red_card_players_2 = []
            temp_list_2 = []
            payload.update({'defId': ','.join([str(ntt) for ntt in include_players_list])})
            resp_2 = self.se.post(f'{fifa_23_address}/club', json=payload,
                                  headers=self.main_dic['header'])
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/club',
            )
            json_resp_2 = resp_2.json()
            new_print(self.fifa_account, 'include players result = ', json_resp_2['itemData'][:100])
            for result_2 in json_resp_2['itemData']:
                if not result_2.get('loans') and not result_2.get('loansInfo') and not result_2.get('endTime'):

                    if result_2['assetId'] in players_list:
                        continue
                    if result_2['statsArray'][-1] != 0:
                        red_card_players_2.append(result_2)
                        continue
                    temp_list_2.append(result_2)
            temp_list_2 = temp_list_2 + red_card_players_2
            club_players = temp_list_2 + club_players
        if save_some_items:
            for player_card in club_players:
                player_card['rating_color'] = (
                    'bronze' if player_card['rating'] < 65 else
                    'silver' if 65 <= player_card['rating'] <= 74 else
                    'gold'
                )
            color_groups = defaultdict(list)
            for player_card_0 in club_players:
                color_groups[player_card_0['rating_color']].append(player_card_0)
            updated_players = []
            for player_card_2 in club_players:
                if color_groups[player_card_2['rating_color']]:
                    if len(color_groups[player_card_2['rating_color']]) > save_some_items:
                        updated_players.append(player_card_2)
                    color_groups[player_card_2['rating_color']].pop(0)
            club_players = updated_players
        return club_players

    def get_club_consumables(self, resource_id=None):
        temp_list = []
        resp = self.se.get(f'{fifa_23_address}/club/consumables/development',
                           headers=self.main_dic['header'])
        pin_events_creator(
            fifa_account=self.fifa_account,
            se=self.se, persona_id=self.fifa_account.persona_id, nucleus_id=self.fifa_account.nucleus_id,
            source="Hub - Home", sid=self.sid, counter=self.get_pin_events_counter())
        json_resp = resp.json()
        result_list = json_resp['itemData']
        for result in result_list:
            # if tradeable and result['untradeableCount'] == result['count']:
            #     continue
            if resource_id and resource_id != result['resourceId']:
                continue
            temp_list.append(result)
        return temp_list

    def save_account_items(self, force_update=False):
        new_print(self.fifa_account, 'save account all items')
        current_items, created = FifaAccountCurrentItems.objects.get_or_create(
                fifa_account=self.fifa_account
        )
        if current_items.update_time > timezone.localtime() - timezone.timedelta(hours=3) and force_update is False and not created:
            new_print(self.fifa_account, 'items already saved in 3 hour')
            return 'already saved'
        club_players = self.get_bronze_club_players(get_pages=20)
        unassigned_items_json_2 = self.get_items().json()
        unassigned_items_2 = unassigned_items_json_2['itemData']
        trade_pile_json_2 = get_trade_pile(self.fifa_account, self.se, self.main_dic).json()
        trade_pile_items_2 = trade_pile_json_2['auctionInfo']
        trade_pile_items_data = [nnnt['itemData'] for nnnt in trade_pile_items_2]
        duplicate_transfer_list_ids_2 = [tll['itemId'] for tll in trade_pile_json_2.get('duplicateItemIdList', [])]
        sbc_storage_data = get_storage_pile(self.fifa_account, self.se, self.main_dic['header']).json()
        sbc_storage_items = sbc_storage_data.get('itemData') or []
        all_players_data = club_players + trade_pile_items_data + unassigned_items_2
        all_players_data = [iin for iin in all_players_data if iin.get('itemType') == 'player']
        bronze_common_tradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) == 0 and 0 <= int(mmmt['rating']) <= 64
                                              and mmmt['untradeable'] is False]
        bronze_rare_tradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) == 1 and 0 <= int(mmmt['rating']) <= 64
                                              and mmmt['untradeable'] is False]
        silver_common_tradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) == 0 and 65 <= int(mmmt['rating']) <= 74
                                              and mmmt['untradeable'] is False]
        silver_rare_tradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) == 1 and 65 <= int(mmmt['rating']) <= 74
                                              and mmmt['untradeable'] is False]
        gold_common_tradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) == 0 and 75 <= int(mmmt['rating']) <= 100
                                              and mmmt['untradeable'] is False]
        gold_rare_tradeable_club_players = [mmmt for mmmt in all_players_data if
                                            int(mmmt['rareflag']) == 1 and 75 <= int(mmmt['rating']) <= 100 and
                                            mmmt['untradeable'] is False]
        gold_rare_special_tradeable_club_players = [mmmt for mmmt in all_players_data if
                                            int(mmmt['rareflag']) > 1 and 75 <= int(mmmt['rating']) <= 100 and
                                            mmmt['untradeable'] is False]
        bronze_common_untradeable_club_players = [mmmt for mmmt in all_players_data if
                                                int(mmmt['rareflag']) == 0 and 0 <= int(mmmt['rating']) <= 64
                                                and mmmt['untradeable'] is True]
        bronze_rare_untradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) == 1 and 0 <= int(mmmt['rating']) <= 64
                                              and mmmt['untradeable'] is True]
        silver_common_untradeable_club_players = [mmmt for mmmt in all_players_data if
                                                int(mmmt['rareflag']) == 0 and 65 <= int(mmmt['rating']) <= 74
                                                and mmmt['untradeable'] is True]
        silver_rare_untradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) == 1 and 65 <= int(mmmt['rating']) <= 74
                                              and mmmt['untradeable'] is True]
        gold_common_untradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) == 0 and 75 <= int(mmmt['rating']) <= 100
                                              and mmmt['untradeable'] is True]
        gold_rare_untradeable_club_players = [mmmt for mmmt in all_players_data if
                                            int(mmmt['rareflag']) == 1 and 75 <= int(mmmt['rating']) <= 100 and
                                            mmmt['untradeable'] is True]
        gold_rare_special_untradeable_club_players = [mmmt for mmmt in all_players_data if
                                              int(mmmt['rareflag']) > 1 and 75 <= int(mmmt['rating']) <= 100 and
                                              mmmt['untradeable'] is True]
        rating_items = {}
        for nntr in all_players_data:
            item_rating = str(nntr['rating'])
            rating_items.setdefault(item_rating, 0)
            rating_items[item_rating] += 1

        current_items.sbc_storage_count = len(sbc_storage_items)

        current_items.club_bronze0_tradable_items = len(bronze_common_tradeable_club_players)
        current_items.club_bronze1_tradable_items = len(bronze_rare_tradeable_club_players)
        current_items.club_silver0_tradable_items = len(silver_common_tradeable_club_players)
        current_items.club_silver1_tradable_items = len(silver_rare_tradeable_club_players)
        current_items.club_gold0_tradable_items = len(gold_common_tradeable_club_players)
        current_items.club_gold1_tradable_items = len(gold_rare_tradeable_club_players)
        current_items.club_gold1_special_tradable_items = len(gold_rare_special_tradeable_club_players)
        current_items.club_bronze0_untradable_items = len(bronze_common_untradeable_club_players)
        current_items.club_bronze1_untradable_items = len(bronze_rare_untradeable_club_players)
        current_items.club_silver0_untradable_items = len(silver_common_untradeable_club_players)
        current_items.club_silver1_untradable_items = len(silver_rare_untradeable_club_players)
        current_items.club_gold0_untradable_items = len(gold_common_untradeable_club_players)
        current_items.club_gold1_untradable_items = len(gold_rare_untradeable_club_players)
        current_items.club_gold1_special_untradable_items = len(gold_rare_special_untradeable_club_players)
        current_items.unassigned_item_count = len(unassigned_items_2)
        current_items.transfer_list_items_count = len(trade_pile_items_2)
        current_items.transfer_list_duplicate_items_count = len(duplicate_transfer_list_ids_2)
        current_items.update_time = timezone.localtime()

        current_items.rating_80_items = rating_items.get('80', 0)
        current_items.rating_81_items = rating_items.get('81', 0)
        current_items.rating_82_items = rating_items.get('82', 0)
        current_items.rating_83_items = rating_items.get('83', 0)
        current_items.rating_84_items = rating_items.get('84', 0)
        current_items.rating_85_items = rating_items.get('85', 0)
        current_items.rating_86_items = rating_items.get('86', 0)
        current_items.rating_87_items = rating_items.get('87', 0)
        current_items.rating_88_items = rating_items.get('88', 0)
        current_items.rating_89_items = rating_items.get('89', 0)
        current_items.rating_90_items = rating_items.get('90', 0)
        current_items.rating_91_items = rating_items.get('91', 0)
        current_items.rating_92_items = rating_items.get('92', 0)
        current_items.rating_93_items = rating_items.get('93', 0)
        current_items.rating_94_items = rating_items.get('94', 0)
        current_items.rating_95_items = rating_items.get('95', 0)
        current_items.rating_96_items = rating_items.get('96', 0)
        current_items.rating_97_items = rating_items.get('97', 0)
        current_items.rating_98_items = rating_items.get('98', 0)
        current_items.rating_99_items = rating_items.get('99', 0)
        current_items.rating_100_items = rating_items.get('100', 0)

        current_items.save()
        new_print(self.fifa_account, 'save account items data : ', current_items.__dict__)


    def send_main_squad(self, payload, players):
        new_print(self.fifa_account, 'players = ', players)
        count = 0
        for player in players:
            payload['players'][count]['itemData']['id'] = player
            count += 1
        new_print(self.fifa_account, 'send main squad 2 = ', payload)
        resp = self.se.put(f"{fifa_23_address}/squad/0", json=payload,
                           headers=self.main_dic['header'])
        new_print(self.fifa_account, 'send main squad resp = ', resp.text)
        time.sleep(2)
        # set main squad active
        resp2 = self.se.get(f"{fifa_23_address}/squad/0",
                            headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f"{fifa_23_address}/squad/0",
        )
        new_print(self.fifa_account, 'send main squad resp2 = ', resp2.text)
        if not resp2.json().get('valid'):
            new_print(self.fifa_account, 'send squad not valid , check it')
            self.send_message(bot, 123, f'send squad not valid , check it {self.fifa_account}',
                              message_thread_id=ARZBAZI_REPORT_TOPIC_ERRORS_THREAD_MESSAGE_ID)
        try:
            valid_squad_players = resp2.json()['players']
            players_rate = [int(player_item['itemData']['rating']) for player_item in valid_squad_players[:11]]
            average_rate = int(sum(players_rate) / len(players_rate))
            self.fifa_account.refresh_from_db()
            self.fifa_account.main_squad_rate = average_rate
            self.fifa_account.save(update_fields=['main_squad_rate'])
        except:
            new_print(self.fifa_account, 'error on give rating : ', traceback.format_exc())
        time.sleep(2)
        # resp = self.se.put(f"{fifa_23_address}/squad/0", data=payload,
        #                    headers=self.main_dic['header'])
        # new_print(self.fifa_account,'resp.content = ', (resp.content)[:100])
        # time.sleep(2)

    # def json_file_check(self, player, player_asset_id, need_first_name=False):
    #     temp_f_name = player['f'].lower()
    #     temp_l_name = player['l'].lower()
    #     try:
    #         temp_c_name = player['c'].lower()
    #     except:
    #         temp_c_name = ''
    #     temp_id_name = player['id']
    #     player_name = ''
    #     if str(temp_id_name) == str(player_asset_id):
    #         if temp_c_name:
    #             if need_first_name:
    #                 player_name = temp_f_name + ' ' + temp_c_name
    #             else:
    #                 player_name = temp_c_name
    #         else:
    #             player_name = temp_f_name + ' ' + temp_l_name
    #         # contains = 0
    #         # for each_part in player_name.split():
    #         #     if temp_f_name.find(each_part) != -1:
    #         #         contains = 1
    #         # if not contains:
    #         #     player_name = temp_f_name + ' ' + player_name
    #     return player_name
    #
    # def get_player_fifa_name_by_id(self, player_asset_id='', need_first_name=False):
    #     players_file = open(os.path.join(BASE_DIR, 'utils/players.json'), encoding='utf-8')
    #     players_data = players_file.read()
    #     players_file.close()
    #     players_data = json.loads(players_data)
    #     player_name = ''
    #     for player in players_data['LegendsPlayers']:
    #         player_name = self.json_file_check(player, player_asset_id, need_first_name=need_first_name)
    #         if player_name:
    #             return player_name
    #
    #     if not player_name:
    #         for player in players_data['Players']:
    #             player_name = self.json_file_check(player, player_asset_id, need_first_name=need_first_name)
    #             if player_name:
    #                 return player_name
    #     # print result_list
    #     return player_name

    def check_account_web_app(self, ):
        time.sleep(2)
        resp = self.se.get(f'{fifa_23_address}/watchlist',
                           headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/watchlist',
        )
        new_print(self.fifa_account, 'check account_healthy resp = ', resp.text)
        json_resp = resp.json()
        credit = json_resp['credits']
        # self.fifa_account.refresh_from_db()
        self.fifa_account.credit = credit
        self.fifa_account.save(update_fields=['credit'])
        self.fifa_account.refresh_from_db()

    def update_credit(self, credit=0):
        if not credit:
            resp = self.se.get(f'{fifa_23_address}/user/credits',
                               headers=self.main_dic['header'])
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/user/credits'
            )
            new_print(self.fifa_account, 'update credit resp = ', resp.text[:100])
            time.sleep(2)
            json_resp = resp.json()
            credit = json_resp['credits']
        # self.fifa_account.refresh_from_db()
        self.fifa_account.credit = credit
        self.fifa_account.save(update_fields=['credit'])
        self.fifa_account.refresh_from_db()

    def get_plus_credit(self):
        resp = get_trade_pile_2(self.fifa_account, self.se, self.get_ea_options_header(), self.main_dic['header'])
        json_resp = resp.json()
        credit = json_resp['credits']
        trades = json_resp['auctionInfo']
        sum_buy_now = 0
        for trade in trades:
            if trade['tradeState'] in ['active', 'expired']:
                sum_buy_now += trade['startingBid']
            if trade.get('tradeState', None) is None:
                credit += trade.get('itemData', {}).get('lastSalePrice', 0)
        sum_buy_now = sum_buy_now - ((sum_buy_now * 5) / 100)
        credit = credit + sum_buy_now
        return credit

    def open_sbc(self, sbc_number):
        self.se.options(
            f'{fifa_23_address}/sbs/challenge/{sbc_number}',
            headers=self.get_ea_options_header(method='POST'))
        resp = self.se.post(
            f'{fifa_23_address}/sbs/challenge/{sbc_number}',
            headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/sbs/challenge/%s',
        )
        return resp

    # def find_nth(self, haystack, needle, n):
    #     start = haystack.find(needle)
    #     while start >= 0 and n > 1:
    #         start = haystack.find(needle, start + len(needle))
    #         n -= 1
    #     return start

    def send_squad_solution_and_open_pack(self, accounts_sbc_id, sbc_number=0, players=None, submit=1):
        sbc_process = SBCProcess.objects.filter(id=accounts_sbc_id).last()
        completed_in_30_minute = SBCProcess.objects.filter(
            worker=self.sbc_worker,
            create_time__gt=timezone.localtime() - timezone.timedelta(minutes=30),
            sbc_type=sbc_process.sbc_type
        ).exclude(id=sbc_process.id)
        if completed_in_30_minute.count() > 0:
            new_print(self.fifa_account, 'this sbc completed in last 30 minute so sleep 30 second before send it again')
            time.sleep(30)
        if not sbc_number:
            sbc_number = sbc_process.sbc_type.sbc_number

        if not players:
            players_list = SBCProcessTarget.objects.filter(sbc_process=sbc_process)
            players = []
            for player in players_list:
                players.append({'position': player.position, 'club_id': player.club_id})


        payload = {"players": [{"index": 0, "itemData": {"id": 0, "dream": False}},
                               {"index": 1, "itemData": {"id": 0, "dream": False}},
                               {"index": 2, "itemData": {"id": 0, "dream": False}},
                               {"index": 3, "itemData": {"id": 0, "dream": False}},
                               {"index": 4, "itemData": {"id": 0, "dream": False}},
                               {"index": 5, "itemData": {"id": 0, "dream": False}},
                               {"index": 6, "itemData": {"id": 0, "dream": False}},
                               {"index": 7, "itemData": {"id": 0, "dream": False}},
                               {"index": 8, "itemData": {"id": 0, "dream": False}},
                               {"index": 9, "itemData": {"id": 0, "dream": False}},
                               {"index": 10, "itemData": {"id": 0, "dream": False}},
                               {"index": 11, "itemData": {"id": 0, "dream": False}},
                               {"index": 12, "itemData": {"id": 0, "dream": False}},
                               {"index": 13, "itemData": {"id": 0, "dream": False}},
                               {"index": 14, "itemData": {"id": 0, "dream": False}},
                               {"index": 15, "itemData": {"id": 0, "dream": False}},
                               {"index": 16, "itemData": {"id": 0, "dream": False}},
                               {"index": 17, "itemData": {"id": 0, "dream": False}},
                               {"index": 18, "itemData": {"id": 0, "dream": False}},
                               {"index": 19, "itemData": {"id": 0, "dream": False}},
                               {"index": 20, "itemData": {"id": 0, "dream": False}},
                               {"index": 21, "itemData": {"id": 0, "dream": False}},
                               {"index": 22, "itemData": {"id": 0, "dream": False}}]}
        for player in players:
            payload['players'][player['position']]['itemData']['id'] = player['club_id']
        new_print(self.fifa_account, 'squad_example = ', payload)
        json_resp = self.submit_squad_func(
            payload, sbc_number, submit=submit, accounts_sbc_id=accounts_sbc_id,
            pass_on_error=sbc_process.sbc_type.can_pass_on_error
        )
        if str(json_resp) == 'need_recheck_players':
            new_print(self.fifa_account, 'need_recheck_players')
            SBCProcessTarget.objects.filter(sbc_process=sbc_process).delete()
            # if sbc_number == 36 or sbc_number == 18:
            #     sbc_process.is_done = True
            #     sbc_process.save()
            self.fifa_account.refresh_from_db()
            if self.fifa_account.credit < 5000:
                new_print(self.fifa_account, 'sbc not ok, and low credit')
                self.sbc_low_credit_staff()
            else:
                new_print(self.fifa_account, 'sbc not ok, but not low credit, credit : ', self.fifa_account.credit,
                          ' sleep 300 sec')
                self.send_message(bot, 123, f'sbc not ok, but not low credit, credit \n {self.fifa_account} '
                                            f'\n console : {self.fifa_account.console}, sbc number : {sbc_number}',
                                  message_thread_id=ARZBAZI_REPORT_TOPIC_SBC_ERRORS_THREAD_MESSAGE_ID
                                  )
                time.sleep(300)
            return 0
        elif str(json_resp) == 'need_check_sbc_solution':
            new_print(self.fifa_account, 'need_check_sbc_solution')
            SBCProcessTarget.objects.filter(sbc_process=sbc_process).delete()
            return str(json_resp)
        else:
            if submit:
                try:
                    packs = json_resp['challengeId']
                    new_print(self.fifa_account, 'packs = ', json_resp)
                    if sbc_process.sbc_type.repeatable == 'immediately':
                        sbc_process.sbcprocesstarget_set.all().delete()
                        # sbc_process.refresh_from_db()
                        sbc_process.is_done = True
                        sbc_process.save(update_fields=['is_done'])
                except:
                    time.sleep(1)
                    json_resp = self.submit_squad_func(
                        payload, sbc_number, accounts_sbc_id=accounts_sbc_id,
                        pass_on_error=sbc_process.sbc_type.can_pass_on_error
                    )
                    if str(json_resp) == 'need_recheck_players':
                        new_print(self.fifa_account, 'need_recheck_players')
                        SBCProcessTarget.objects.filter(sbc_process=sbc_process).delete()
                        # if sbc_number == 36 or sbc_number == 18:
                        #     sbc_process.refresh_from_db()
                        #     sbc_process.is_done = True
                        #     sbc_process.save()
                        self.sbc_low_credit_staff()
                        return 0
                    elif str(json_resp) == 'need_check_sbc_solution':
                        new_print(self.fifa_account, 'need_check_sbc_solution')
                        SBCProcessTarget.objects.filter(sbc_process=sbc_process).delete()
                        return str(json_resp)
                try:
                    packs = json_resp.get('grantedChallengeAwards')
                    new_print(self.fifa_account, 'packs 2 = ', packs)
                    # sbc_process.refresh_from_db()
                    if packs:
                        sbc_process.is_done = True
                        sbc_process.save(update_fields=['is_done'])
                        new_print(self.fifa_account, 'sbc completed')
                    # if self.running_platform in ['console_web', 'console_web_pc']:
                    #     new_print(self.fifa_account, 'sbc compelete but open packs in other worker')
                    # else:
                    #     for pack in packs:
                    #         pack_id = pack['value']
                    #         open_pack_resp = self.open_pack(pack_id)
                    #         if (pack.get('untradeable', True) is False or pack.get('isUntradeable', True) is False):
                    #             pack_items = []
                    #             try:
                    #                 pack_items = open_pack_resp.json()['itemList']
                    #             except:
                    #                 new_print(self.fifa_account, 'open pack in sbc solver, pack id : ', pack_id,
                    #                           ' opened : ', open_pack_resp.text, '\nerror: ', traceback.format_exc())
                    #             pack_price = self.calculate_pack_price(pack_items=pack_items)
                    #         else:
                    #             pack_price = 0
                    #         ItemPack.objects.create(
                    #             fifa_account=self.fifa_account,
                    #             pack_id=pack_id,
                    #             open_price=0,
                    #             pack_value=pack_price,
                    #         )
                    #         if accounts_sbc_id:
                    #             try:
                    #                 json_resp = open_pack_resp.json()
                    #                 item_list = json_resp['itemIdList']
                    #                 sbc_process.is_done = True
                    #                 sbc_process.save()
                    #                 new_print(self.fifa_account, 'sbc completed')
                    #             except:
                    #                 new_print(self.fifa_account, 'error 72 : ', traceback.format_exc())
                    #                 new_print(self.fifa_account,
                    #                           'sbc is ok but can not open the pack. try again in next loop')
                except:
                    pass

        return 'successful'

    def submit_squad_func(self, payload, sbc_number, submit=1, accounts_sbc_id=0, try_counter=0, pass_on_error=False):
        options_header = self.get_ea_options_header(method='PUT')
        link = f'{fifa_23_address}/sbs/challenge/{sbc_number}/squad'
        self.se.options(link, headers=options_header)
        res = self.se.put(link, json=payload, headers=self.main_dic['header'])
        new_print(self.fifa_account, 'link = ', link, '    , resp = ', res, '  , resp_text = ', res.text)
        # new_print(self.fifa_account, )
        # new_print(self.fifa_account, res.text)
        if ('expired session' in res.text or res.status_code == 403) and try_counter < 3:
            new_print(self.fifa_account, 'session expired , try again after new login, sleep 120 sec')
            time.sleep(100)
            self.get_new_sid()
            time.sleep(2)
            self.open_sbc(sbc_number)
            time.sleep(10)
            return self.submit_squad_func(
                payload, sbc_number, submit=submit, accounts_sbc_id=accounts_sbc_id, try_counter=try_counter+1,
                pass_on_error=pass_on_error)
        if res.status_code == 500:
            time.sleep(20)
            new_print(self.fifa_account, 'ea servers error , try again')
            self.se.options(link, headers=options_header)
            res = self.se.put(link, json=payload, headers=self.main_dic['header'])
            new_print(self.fifa_account, 'try data : link = ', link, '    , resp = ', res, '  , resp_text = ', res.text)
        if res.status_code == 475:
            new_print(self.fifa_account, 'need_recheck_players res.status_code = ', res.status_code,
                      ' payload ', payload)
            return 'need_recheck_players'
        if res.status_code == 404:
            self.open_sbc(sbc_number)
            time.sleep(2)
            res = self.se.put(
                link, json=payload, headers=self.main_dic['header'])
        if res.status_code == 495:
            self.sbc_worker.error_description = "need login logout"
            self.sbc_worker.has_error = 1
            self.sbc_worker.save()

            self.handle_end_bot()
            time.sleep(50)
            return
        time.sleep(2)
        if submit:
            # submit_success = False
            for nnnt in [0, 1]:
                submit_url = f'{fifa_23_address}/sbs/challenge/{sbc_number}?skipUserSquadValidation=true&chemistryProfilesVersion={self.chemistry_profile_version}'
                self.se.options(submit_url, headers=options_header)
                resp = self.se.put(submit_url, headers=self.main_dic['header'])
                new_print(self.fifa_account, 'submit squad , url : ', submit_url,
                          'resp text : ', resp.text[:100], ' status code : ', resp)
                # new_print(self.fifa_account, resp.text[:100])
                # print 'header = ',self.main_dic['header']
                if resp.text:
                    # submit_success = True
                    break
                else:
                    time.sleep(10)
                if resp.status_code == 403:
                    new_print(self.fifa_account, 'status 403 in submit sbc , 120 sec sleep before login and try again')
                    time.sleep(30)
                    self.get_new_sid()
                    time.sleep(20)
                    # break
                # if submit_success:
                #     break
            try:
                json_resp = resp.json()
            except:
                # if sbc_number == 1:
                #     self.sbc_worker.error_description = "need login logout"
                #     self.sbc_worker.has_error = 1
                #     self.sbc_worker.save()
                #
                #     text = 'need to login logout for account %s' % self.username
                #     self.send_message(bot, 'critical', text)
                #
                #     self.handle_end_bot()
                #     time.sleep(60)
                #     return

                # send = 1
                # if sbc_number == 3:
                #     send = 0
                #     self.main_dic['third_sbc_problem'] += 1
                #     if self.main_dic['third_sbc_problem'] == 2:
                #         self.get_new_sid()
                #     if self.main_dic['third_sbc_problem'] == 3:
                #         send = 1
                bad_player = 0
                # if send:
                if True:
                    new_print(self.fifa_account, 'need to check sbc solution', sbc_number)
                    self.send_message(bot, 123, f'need to check sbc solution {sbc_number} , {self.fifa_account}',
                                      message_thread_id=ARZBAZI_REPORT_TOPIC_SBC_ERRORS_THREAD_MESSAGE_ID)
                    if pass_on_error:
                        time.sleep(10)
                        return 'need_check_sbc_solution'
                    else:
                        # if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                        #     time.sleep(300)
                        # else:
                        #     time.sleep(300)
                        time.sleep(300)
                        self.sbc_worker.refresh_from_db()
                        self.sbc_worker.must_done = True
                        self.sbc_worker.save()
                        raise Exception('need to check sbc solution')
                    # bad_player = self.fix_accounts_sbc_players(sbc_number)
                    # if self.main_dic['last_sbc_failed'] == sbc_number:
                    #     text = 'problem in submit sbc, sbc number = %s %s' % (sbc_number, self.username)
                    #     self.send_message(bot, 123, text)
                    #
                    #     if accounts_sbc_id:
                    #         return 'need_recheck_players'
                    # else:
                    #     self.main_dic['last_sbc_failed'] = sbc_number

                # if sbc_number != 3 and not bad_player:
                #     self.get_new_sid()
                return
            return json_resp
        else:
            # time.sleep(300)
            pass

    def fix_accounts_sbc_players(self, sbc_number):
        new_print(self.fifa_account, 'need to check sbc solution', sbc_number)
        self.send_message(bot, 123, f'need to check sbc solution {sbc_number} , {self.fifa_account}',
                          message_thread_id=ARZBAZI_REPORT_TOPIC_SBC_ERRORS_THREAD_MESSAGE_ID)
        if self.running_platform in ['console', 'console_web', 'console_web_pc']:
            time.sleep(300)
        else:
            time.sleep(3000)
        self.sbc_worker.refresh_from_db()
        self.sbc_worker.must_done = True
        self.sbc_worker.save()
        raise Exception('need to check sbc solution')

        club_players = self.get_gold_club_players(exclude_squad=True)
        current_sbc_process = SBCProcess.objects.filter(worker=self.sbc_worker, is_done=False).last()

        sbc_targets = SBCTarget.objects.filter(sbc_type=current_sbc_process.sbc_type)
        sbc_club_players = SBCProcessTarget.objects.filter(sbc_process=current_sbc_process)
        bad_player = 0
        for sbc_club_player in sbc_club_players:
            need_this = 0
            for club_player in club_players:
                if club_player['id'] == sbc_club_player.club_id:
                    for sbc_target in sbc_targets:
                        if club_player['assetId'] == sbc_target.asset_id and str(club_player['teamid']) == str(
                                sbc_target.team):
                            need_this = 1
                            bad_player = 1
                            break
                if need_this:
                    break
            if not need_this:
                new_print(self.fifa_account, 'no need this one item send to tradepile')
                try:
                    data = '{"itemData":[{"id":%s,"pile":"trade"}]}' % sbc_club_player.club_id
                    new_print(self.fifa_account, 'data =', data)
                    put_item_for_sale(self.se, self.main_dic['header'], data, self.server_key)
                    save_account_request(
                        fifa_account=self.fifa_account,
                        link=f'{fifa_23_address}/item/pile_trade',
                    )
                    time.sleep(1.5)
                except:
                    pass
                sbc_club_player.delete()
        return bad_player

    def open_pack(self, pack_id, currency=0):
        # payload = "{\"currency\":%s,\"packId\":%s,\"usePreOrder\":\"true\"}" % (currency, pack_id)
        if currency == 0:
            payload = {"packId": pack_id, 'usePreOrder': True}
        else:
            payload = {"currency": currency, "packId": pack_id}
        self.se.options(
            f'{fifa_23_address}/purchased/items',
            headers=self.get_ea_options_header(method='POST'))
        resp = self.se.post(
            f'{fifa_23_address}/purchased/items',
            json=payload, headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/purchased/items_open_packs',
        )
        return resp

    def open_packs_method(self):
        resp = self.se.get(
            f'{fifa_23_address}/store/purchaseGroup/cardpack?ppInfo=true',
            headers=self.main_dic['header'])
        save_account_request(
            fifa_account=self.fifa_account,
            link=f'{fifa_23_address}/store/purchaseGroup/cardpack?ppInfo=true',
        )
        json_resp = resp.json()
        packs = json_resp['purchase']
        pack_coins_can_open = 0
        if self.fifa_account.credit > 1000:
            pack_coins_can_open = 50 - self.coins_used_pack_open
        set_sbc_status(self.sbc_worker, 'open packs', update_time=False)
        new_print(self.fifa_account,
                  'packs count : ',
                  len([iiee for iiee in packs if (iiee.get('coins') or 0) <= self.coins_used_pack_open]))
        for pack in packs:
            # if (pack['coins'] == 0 or pack['coins'] <= pack_coins_can_open) and (
            #         self.running_platform not in ['console_web', 'console_web_pc']
            #         or (
            #         pack['untradeable'] is True and
            #         self.running_platform in ['console_web', 'console_web_pc']
            #         )):
            if (pack['coins'] == 0 or pack['coins'] <= pack_coins_can_open):
                len_trade_pile = len(self.sell_items_result.get('trade_pile_auction', []))
                new_print(self.fifa_account, 'trade pile : ', len_trade_pile,
                          ' pack id : ', pack['id'])
                if len_trade_pile > OPEN_PACKS_MAX_TRADE_PILE and pack.get('untradeable', True) is False:
                    new_print(self.fifa_account, 'trade pile more than allowed 2. continue')
                    continue
                self.coins_used_pack_open += int(pack['coins'])
                new_print(self.fifa_account, 'pack id', pack['id'], 'will open , coins need : ',
                          pack['coins'], ' all pack coins : ', self.coins_used_pack_open,
                          ' untradable : ', pack['untradeable'])
                for iiie in [1, 2]:
                    if pack['coins'] == 0:
                        open_pack_resp = self.open_pack(pack['id'])
                    else:
                        open_pack_resp = self.open_pack(pack['id'], currency='COINS')
                    if open_pack_resp.status_code == 471:  # means unopened pack exists
                        sell_items(self, self.sbc_worker, self.fifa_account,
                                   check_transfer_list=False, check_players_pick=False)
                    else:
                        break
                pack_items = []
                duplicate_pack_items = []
                try:
                    pack_items = open_pack_resp.json()['itemList']
                    duplicate_pack_items = open_pack_resp.json().get('duplicateItemIdList') or []
                except:
                    new_print(self.fifa_account,
                              'open pack in sbc solver, pack id : ', pack['id'],
                              ' opened : ', open_pack_resp.text,
                              ' status coode : ', open_pack_resp.status_code,
                              ' error: ', traceback.format_exc())
                if pack['untradeable'] is False:
                    if pack_items:
                        need_sell_items = True
                    pack_price = self.calculate_pack_price(pack_items=pack_items)
                else:
                    pack_price = 0
                ItemPack.objects.create(
                    fifa_account=self.fifa_account,
                    pack_id=pack['id'],
                    open_price=0,
                    pack_value=pack_price,
                )
                time.sleep(2)
                if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                    if pack['untradeable']:
                        # move items to club
                        sales_data = {'itemData': [
                            {'id': iee['id'], 'pile': 'club'} for iee in pack_items if
                            iee.get('itemType') not in ['misc']
                        ]}
                        move_to_club_result = put_item_for_sale(
                            self.se, self.main_dic['header'], json.dumps(sales_data), 0)
                        new_print(self.fifa_account, 'move opened pack to club result ',
                                  move_to_club_result.text)
                        save_account_request(
                            fifa_account=self.fifa_account,
                            link=f'{fifa_23_address}/item/multiple_pile_club',
                        )
                        time.sleep(1)
                        try:
                            moved_items = [iiie for iiie in move_to_club_result.json()['itemData'] if
                                           iiie.get('pile') == 'club' and iiie.get('success')]
                            for moved_item in moved_items:
                                moved_item = next(
                                    (item_22 for item_22 in pack_items if item_22.get('id') == moved_item.get('id')),
                                    None)
                                if moved_item and moved_item.get('itemType') == 'player':
                                    add_item_status = self.add_to_club_players_information(item_info=moved_item)
                        except:
                            new_print(self.fifa_account, 'error on add item to cached club items , ',
                                      traceback.format_exc())
                        # move duplicate items to sbc storage
                        if duplicate_pack_items:
                            sales_data_2 = {'itemData': [
                                {'id': iee['itemId'], 'pile': 'storage'} for iee in duplicate_pack_items
                            ]}
                            move_to_storage_result = put_item_for_sale(
                                self.se, self.main_dic['header'], json.dumps(sales_data_2), 0)
                            new_print(self.fifa_account, 'move opened pack to storage result ',
                                      move_to_storage_result.text)
                            save_account_request(
                                fifa_account=self.fifa_account,
                                link=f'{fifa_23_address}/item/multiple_pile_storage',
                            )
                            time.sleep(1)
                            try:
                                moved_items_2 = [iiie for iiie in move_to_storage_result.json()['itemData'] if
                                                 iiie.get('pile') == 'storage' and iiie.get('success')]
                                for moved_item_2 in moved_items_2:
                                    moved_item_2 = next((item_22 for item_22 in pack_items if
                                                         item_22.get('id') == moved_item_2.get('id')), None)
                                    if moved_item_2 and moved_item_2.get('itemType') == 'player':
                                        add_item_status = self.add_to_club_players_information(
                                            item_info=moved_item_2, data_part_name='sbc_storage_players')
                            except:
                                new_print(self.fifa_account, 'error on add item to cached club items , ',
                                          traceback.format_exc())
                            need_to_delete_items = [
                                dd_item['id'] for dd_item in move_to_storage_result.json()['itemData']
                                if dd_item.get('reason') == 'Destination Full']

                            if need_to_delete_items:
                                remove_multiple_items = self.se.post(
                                    f'https://{fifa_host}/ut/delete/game/fc25/item',
                                    json={'itemId': [ieee for ieee in need_to_delete_items][:30]},
                                    # maximum 34 items can be deleted
                                    headers=self.main_dic['header'])
                                new_print(self.fifa_account,
                                          'remove multiple duplicate items : ',
                                          remove_multiple_items.text)
                                save_account_request(
                                    fifa_account=self.fifa_account,
                                    link=f'{fifa_23_address}/item/multiple_quick_sell',
                                )
                                time.sleep(1)
                        # sell_items(self, self.sbc_worker, self.fifa_account,
                        #            check_transfer_list=False, check_players_pick=False)
                    else:
                        self.sell_items_result = sell_items(
                            self, self.sbc_worker, self.fifa_account, check_players_pick=False)
                else:
                    self.sell_items_result = sell_items(
                        self, self.sbc_worker, self.fifa_account, check_players_pick=False)

            if self.sbc_worker.must_done:
                new_print(self.fifa_account, 'sbc worker ', self.sbc_worker, ' must done')
                try:
                    self.handle_end_bot()
                    return 'must done'
                except:
                    new_print(self.fifa_account, 'error 58 : ', traceback.format_exc())
                new_print(self.fifa_account, 'bot is done and must return something in main branch')
                return 'its done'

    def save_unopened_packs_data(self):
        new_print(self.fifa_account, 'save unopened packs data')
        AccountPackData.objects.filter(fifa_account=self.fifa_account).delete()
        resp = self.se.get(
            f'{fifa_23_address}/store/purchaseGroup/cardpack?ppInfo=true',
            headers=self.main_dic['header'])
        try:
            packs_data_list = []
            for pack in resp.json()['purchase']:
                pack_object = AccountPackData(
                    fifa_account=self.fifa_account,
                    pack_id=pack.get('id'),
                    pack_type=pack.get('type'),
                    description=pack.get('description'),
                    coins=pack.get('coins'),
                    untradeable=pack.get('untradeable'),
                )
                packs_data_list.append(pack_object)
            AccountPackData.objects.bulk_create(packs_data_list)
            low_credit_list = [item for item in resp.json()['purchase'] if item.get("coins", 0) < 100]
            new_print(self.fifa_account, 'saving packs data , packs count : ', len(packs_data_list),
                      ' low credit coin : ', len(low_credit_list))
        except:
            new_print(self.fifa_account, 'try to save packs but got error : ', traceback.format_exc())

    def calculate_pack_price(self, pack_items=None):
        new_print(self.fifa_account, 'start calculate pack')
        pack_price = 0
        not_players_resource_list = []
        players_price_list = []
        if pack_items is None:
            pack_items = pack_items
        for item in pack_items:
            if item.get('untradeable', True) is False:
                # time.sleep(random.randint(1, 3))
                if item.get('itemType') == 'player':
                    item_id = item.get('id')
                    resource_id = item.get('resourceId')
                    asset_id = item.get('assetId')
                    rating = item.get('rating')
                    team_id = item.get('teamid')
                    rare_flag = item.get('rareflag')
                    discard_value = item.get('discardValue', 0)
                    # todo  : fix bellow , always return 0
                    # ea codes not send market_min_price at open pack. ea get unassign items again and set min price.
                    market_data_min_price = item.get('marketDataMinPrice', 0)
                    if rating > 74:
                        card_type_first_name = 'gold'
                    elif rating > 64:
                        card_type_first_name = 'silver'
                    else:
                        card_type_first_name = 'bronze'
                    card_type_name = card_type_first_name + f'{int(int(rare_flag) >= 1)}'
                    # if card_type_name in ['bronze0', 'bronze1', 'silver0', 'silver1']:
                    # if False:
                    #     new_print(self.fifa_account, 'bronze and silver card found , marekt min price : ',
                    #               market_data_min_price, ' untradeable : ', item.get('untradeable'))
                    #     last_trade_quality = ConsoleTradeOneQuality.objects.filter(
                    #         create_time__gt=timezone.localtime() - timezone.timedelta(hours=3),
                    #         name=card_type_name).last()
                    #     if last_trade_quality and last_trade_quality.bid_price > 0:
                    #         price = last_trade_quality.sell_price
                    #     else:
                    #         price = market_data_min_price
                    #     pack_price += int(price)
                    #
                    # else:
                    if True:
                        card_info = get_player_data_by_asset_id(
                            player_asset_id=asset_id)
                        new_print(self.fifa_account, 'calculate pack  : asset id = ', asset_id, 'rate = ',
                                  rating, 'card info = ', card_info)
                        try:
                            # price, update_time, fp, fnp, fxp = self.get_player_price_from_futbin_web_app(
                            player_cache_name = f'futbin_player_{str(resource_id)}'
                            futbin_data = self.players_log_cache.get(player_cache_name)
                            if futbin_data and futbin_data.get('local_time_stamp') > (time.time() - (ONE_DAY_SECONDS * 3)):
                                new_print(
                                    self.fifa_account,
                                    'this item was selected from futbin less than 3 days ago ',
                                    ' , so use old data again : ', futbin_data)
                                futbin_result = futbin_data
                            else:
                                futbin_result = self.get_player_price_from_futbin_web_app(
                                    card_info[0],
                                    rating,
                                    card_info[1],
                                    player_club=team_id,
                                    player_rare=rare_flag,
                                    player_f=card_info[2], player_l=card_info[3],
                                    player_asset_id=asset_id
                                )
                                if futbin_result.get('update_time_stamp'):
                                    self.players_log_cache.set(player_cache_name, futbin_result, timeout=ONE_WEEK_SECONDS)
                            price = futbin_result.get('price')
                            time.sleep(1)
                            if int(price) <= 200:
                                pack_price += int(discard_value)
                                players_price_list.append(discard_value)
                            else:
                                pack_price += int(price)
                                players_price_list.append(price)
                        except:
                            new_print(self.fifa_account, 'get price from futbin error :  ', traceback.format_exc())
                            try:
                                resp = self.get_price_limit(item_id)
                                time.sleep(1)
                                js_resp = resp.json()
                                new_print(self.fifa_account, 'item price limits = ', js_resp)
                                min_price = js_resp[0]['minPrice']
                                pack_price += min_price
                                players_price_list.append(min_price)
                            except:
                                new_print(self.fifa_account, 'can not get player price , error :  ',
                                          traceback.format_exc())
                else:
                    not_players_resource_list.append(item.get('resourceId', 0))
        new_print(self.fifa_account,
                  'calculate pack : item is not player , resource ids : ', not_players_resource_list,
                  ' pack price : ', pack_price, ' players price list : ', players_price_list)

        return pack_price

    # def control_sid(self, ):
    #     while True:
    #         if self.main_dic['begin_new_sid'] > self.main_dic['end_new_sid']:
    #             if self.main_dic['begin_new_sid'] + timedelta(minutes=5) < timezone.localtime():
    #                 new_print(self.fifa_account, 'getting new sid was too long')
    #                 self.handle_end_bot()
    #                 return
    #
    #         time.sleep(10)

    def console_transfer_list_sell_items(self, need_get_new_sid=True):
        try:
            self.public_moves.go_to_state('ps4_main', 'transfer_list')
            # self.public_moves.search_transfer_list_item(self.all_sbc_completed)
            self.public_moves.transfer_list_utils.search_transfer_list_item(self, False)
        except:
            new_print(self.fifa_account, 'error in transfer list', traceback.format_exc())
            self.console_close_ultimate(need_get_new_sid=need_get_new_sid)
            return 'sid'

    # def console_check_for_ban(self):
    #     self.public_moves.console_open_ultimate()
    #     not_ban = self.public_moves.go_to_state('ps4_main', 'transfer_market', special_order='check_for_ban')
    #     self.console_close_ultimate()
    #     return not_ban

    def console_search_price(self, player: PlayerCard, force_manual=0, search_type='', change_grade=999999):
        try:
            self.public_moves.go_to_state('ps4_main', 'transfer_market')

            # price, updated_time, first_price, futbin_min_price, futbin_max_price = self.get_price_from_futbin_and_futwiz(
            #     player.asset_id)
            futbin_result = self.get_price_from_futbin_and_futwiz(player.futbin_resource_id)
            price = futbin_result.get('price') or 0
            updated_time = futbin_result.get('update_time')
            # first_price = futbin_result.get('first_price')
            # futbin_min_price = futbin_result.get('futbin_min_price')
            # futbin_max_price = futbin_result.get('futbin_max_price')
            if price == 0:
                price = player.price
            else:
                price = get_previous_price_grade(price)

            local_price = self.compare_futbin_price_with_local_data(player, price, updated_time)
            if local_price:
                price = local_price
            if (not price) or force_manual:
                if not price:
                    new_print(self.fifa_account, 'no price found , set default 1000')
                    price = 1000

                min_check = max_check = 0
                first_time = 1
                change_grade_counter = 0
                while True:
                    if change_grade_counter >= change_grade:
                        return 'too many change grade'
                    change_grade_counter += 1
                    if not self.public_moves.search_player(
                            player.name, player.rating, player.asset_id,
                            max_buy_now=price,
                            special=player.special_name, reset_data=first_time,
                            search_start_min_price=get_round_price(price*.9),
                            wait_for_fix_name=False
                    ):
                        return 'search not result'

                    has_result = self.public_moves.has_search_result()
                    if has_result:
                        result_count = self.public_moves.transfer_list_utils.get_live_search_count()
                        # todo : remove send photo after bug found
                        # telegram_send_photo(self.fifa_account, os.path.join(BASE_DIR, 'screen_shot_tmp.jpg'),
                        #                     caption=f'account {self.fifa_account} searching discharge mode3 result',
                        #                     message_thread_id=ARZBAZI_REPORT_TOPIC_LOGS_THREAD_MESSAGE_ID)
                        
                        self.public_moves.ps4_buttons.circle()
                    else:
                        result_count = 0
                        self.public_moves.ps4_buttons.cross()
                        time.sleep(1)
                    self.public_moves.wait_for_images([
                        os.path.join(BASE_DIR, f'utils/{self.fifa_account.platform}_controls/transfer_market.png'),
                        os.path.join(BASE_DIR, f'utils/{self.fifa_account.platform}_controls/search_players.png'),
                        os.path.join(BASE_DIR, f'utils/{self.fifa_account.platform}_controls/transfer_market_no_search_result.png'),
                    ])
                    first_time = 0
                    new_print(self.fifa_account, 'result count =', result_count)
                    # if has_result:
                    #     break
                    if result_count < 5:
                        if max_check:
                            break
                        price = get_next_price_grade(price)
                        min_check = 1
                    else:
                        break
                        # if min_check:
                        #     price = get_previous_price_grade(price)
                        #     break
                        # price = get_previous_price_grade(price)
                        # max_check = 1

            player.price = price
            player.update_time = timezone.localtime()
            player.save(update_fields=['price', 'update_time'])
            new_print(self.fifa_account, 'player_price 3 = ', price)
            if search_type == 'buy_sbc_targets':
                SBCTarget.objects.filter(player=player).update(price=price)

                sbc_process = SBCProcess.objects.filter(worker=self.sbc_worker, is_done=False).first()
                sum_sbc_price = SBCTarget.objects.filter(sbc_type=sbc_process.sbc_type).aggregate(
                    sum_price=Sum('price')).get('sum_price')
                new_print(self.fifa_account, 'sum actual price =', sum_sbc_price)
                sbc_process.sbc_type.refresh_from_db()
                sbc_process.sbc_type.sbc_actual_price = sum_sbc_price
                sbc_process.sbc_type.save()
            return price
        except:
            new_print(self.fifa_account, 'error 71 : ', traceback.format_exc())
            self.console_close_ultimate()
            return 'sid'

    def console_close_ultimate(self, need_get_new_sid=True, state='home_main'):
        new_print(self.fifa_account, 'closing ultimate in console')
        self.public_moves.go_to_state('ultimate_team', state)
        self.fifa_account.refresh_from_db()
        self.fifa_account.can_kill_by_mother = False
        self.fifa_account.save(update_fields=['can_kill_by_mother'])
        if need_get_new_sid:
            self.get_new_sid()

    def set_this_staff_to_pass_logout_login(self):
        proxy = self.fifa_account.proxy
        # todo: remove bellow after test 2018
        console = self.fifa_account.console
        if console and (
                console.name in list(range(0, 9000))
                # console.name in list(range(2000, 2018)) +
                #     list(range(5091, 5121)) + list(range(5067, 5079)) + list(range(5043, 5055)) +
                #     list(range(5211, 5223)) + list(range(5139, 5151)) + list(range(5163, 5175)) +
                #     list(range(5187, 5199)) +
                #     list(range(1, 7)) + list(range(13, 19)) + list(range(25, 31)) + list(range(36, 43)) +
                #     list(range(48, 55)) + list(range(66, 73)) + list(range(78, 85)) + list(range(90, 97)) +
                #     list(range(2051, 2058)) + list(range(2063, 2071))
        ):
            proxy = None

        if proxy:
            self.main_dic['proxy_ip'] = proxy.ip_address
            self.main_dic['proxy_port'] = proxy.port
            self.main_dic['proxy_user'] = proxy.user_name
            self.main_dic['proxy_pass'] = proxy.password
        self.main_dic['futbin_cookies'] = ''
        self.main_dic['pin_enevts_header'] = {'Content-Type': 'application/json',
                                              'Origin': 'https://www.ea.com',
                                              'Referer': 'https://www.ea.com/',
                                              'User-Agent': user_agent,
                                              'Accept': '*/*',
                                              'Accept-Encoding': 'gzip, deflate, br',
                                              'Accept-Language': 'en-US,en;q=0.5',
                                              'Connection': 'keep-alive',
                                              'Host': fifa_host,
                                              'x-ea-game-id': fut_web_number,
                                              'x-ea-game-id-type': 'easku',
                                              'x-ea-taxv': '1.1'
                                              }
        self.main_dic['pin_enevts_option_header'] = {
            'Access-Control-Request-Headers': 'content-type,x-ea-game-id,x-ea-game-id-type,x-ea-taxv',
            'Access-Control-Request-Method': 'POST',
            'Origin': 'https://www.ea.com',
            'Referer': 'https://www.ea.com/',
            'User-Agent': user_agent
        }
        self.main_dic['options_header'] = self.get_ea_options_header()

    def sbc_solver_core(self):
        # if not self.sbc_worker.status:
        set_main_log(self.sbc_worker, 'preparing sbc solver core ...')
        set_sub_log(self.sbc_worker, 'updating credit and claim rewards ')
        set_sbc_status(self.sbc_worker, 'preparing sbc solver ...')
        new_print(self.fifa_account, 'sbc solver core started')
        try:
            # if self.running_platform not in ['console_web', 'console_web_pc']:
            #     self.update_credit()
            self.update_credit()
            if self.sbc_worker.start_coin == 0:
                self.sbc_worker.start_coin = self.get_plus_credit()
                self.sbc_worker.save(update_fields=['start_coin'])
                self.sbc_worker.refresh_from_db()
        except:
            pass

        if self.running_platform not in ['console', 'console_web', 'console_web_pc']:
            problem_counter = 0
            while True:
                problem_counter += 1
                if problem_counter > 3:
                    text = 'account have some issues %s' % self.username
                    self.send_message(bot, 'critical', text)
                    self.sbc_worker.has_error = 1
                    self.sbc_worker.error_description = "account problem"
                    self.sbc_worker.save(update_fields=['has_error', 'error_description'])

                    self.handle_end_bot()
                    time.sleep(50)
                    return 'account have some issues'
                if self.running_platform in ['web']:
                    trade_access_1 = get_trade_access_from_usermassinfo(self.se)
                    if trade_access_1 and int(trade_access_1) != 2:
                        self.sbc_worker.error_description = "account not yet access"
                        self.sbc_worker.has_error = 1
                        self.sbc_worker.save(update_fields=['has_error', 'error_description'])
                        self.handle_end_bot()
                        return 'account not yet access'
                try:
                    self.check_account_web_app()
                    break
                except:
                    time.sleep(5)
                    new_print(self.fifa_account, 'error 60 : ', traceback.format_exc())
                    self.get_new_sid()

        # if self.running_platform == 'console':
        #     new_print(self.fifa_account,'check for console ban')
        #     console_not_ban = self.console_check_for_ban()
        #     new_print(self.fifa_account,'console not ban result =  ',console_not_ban)
        #     if not console_not_ban:
        #         self.fifa_account.refresh_from_db()
        #         self.fifa_account.delete_club_number = 10
        #         self.fifa_account.save()
        #         self.sbc_worker.error_description = "account is ban in console"
        #         self.sbc_worker.has_error = True
        #         self.sbc_worker.save()
        #         return 'console is ban'

        try:
            resp = self.se.post(
                f'{fifa_23_address}/sqbt/user/prize',
                headers=self.main_dic['header'])
            save_account_request(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/sqbt/user/prize',
            )
            new_print(self.fifa_account, 'sqbt content = ', resp.text)
        except:
            pass
        # if self.running_platform not in ['console_web', 'console_web_pc']:
        try:
            if self.running_platform in ['console_web_pc']:
                clim_count_in_24_hour = -1
            else:
                clim_count_in_24_hour = FifaAccountRequest.objects.using('logs_pgbouncer').filter(
                    fifa_account=self.fifa_account,
                    link=f'{fifa_23_address}/scmp/campaign?type=active',
                    create_time__gt=timezone.localtime() - timezone.timedelta(hours=24)
                ).count()
            if clim_count_in_24_hour < 1:
                pin_events_creator(
                    fifa_account=self.fifa_account,
                    se=self.se, persona_id=self.fifa_account.persona_id, nucleus_id=self.fifa_account.nucleus_id,
                    source="Objectives - Season Progress", sid=self.sid,
                    counter=self.get_pin_events_counter())
                clim_lvlup_objectives_milestones(self.fifa_account, self.se, self.main_dic['header'], self.fcas_sid)
                time.sleep(2)
                sell_items(self, self.sbc_worker, self.fifa_account)
                time.sleep(2)
                self.read_fut_web_live_msg()
            else:
                new_print(self.fifa_account, f'climed in 24 hour {clim_count_in_24_hour}')


        except:
            new_print(self.fifa_account, 'error 132 : ', traceback.format_exc())
            close_old_connections()

        starting_loop = timezone.localtime()
        cant_solve_sbc_type_id = []
        solved_sbc_type_id = []
        self.club_asset_id = []
        try:
            already_solved = SBCProcess.objects.filter(
                create_time__gt=timezone.localtime() - timezone.timedelta(days=10),
                worker__fifa_account=self.fifa_account,
                sbc_type__repeatable='',
                is_done=True, has_error=False
            ).distinct('sbc_type__id').values_list('sbc_type__id', flat=True)
            cant_solve_sbc_type_id += list(already_solved)
            new_print(self.fifa_account, 'this sbc type ids already solved , ',
                      list(already_solved), ' so dont try again')
        except:
            new_print(self.fifa_account, 'cant get already solve sbcs , ', traceback.format_exc())
            close_old_connections()
        # try to move items from sbc storage to club
        # try:
        #     resp3 = get_storage_pile(self.fifa_account, self.se, self.main_dic['header'])
        #     storage_pile_items = resp3.json().get('itemData') or []
        #     storage_pile_duplicate_items = (iie_['itemId'] for iie_ in (resp3.json().get('duplicateItemIdList') or []))
        #     for storage_item in storage_pile_items:
        #         if storage_item['id'] not in storage_pile_duplicate_items:
        #             data = {"itemData": [{"id": storage_item['id'], "pile": "club"}]}
        #             move_result = put_item_for_sale(
        #                 self.se, self.main_dic['header'], json.dumps(data))
        #             save_account_request(
        #                 fifa_account=self.fifa_account,
        #                 link=f'{fifa_23_address}/item/pile_club',
        #             )
        #             new_print(self.fifa_account, 'move item from storage to club : ', move_result, move_result.text)
        #             time.sleep(1)
        # except:
        #     new_print(self.fifa_account, 'error on move storage items to club')
        if self.running_platform in ['console_web_pc'] or FifaAccountRequest.objects.using('logs_pgbouncer').filter(
                fifa_account=self.fifa_account,
                link=f'{fifa_23_address}/preview/pack/10301/items',
                create_time__gt=timezone.localtime() - timezone.timedelta(hours=24)
        ).count() < 1:
            self.preview_and_open_good_gold_pack()
        else:
            new_print(self.fifa_account, 'preview gold pack was checked in 24 hour , so dont try every run')
        self.save_unopened_packs_data()
        need_open_packs = True
        need_sell_items = True
        need_check_max_requests = True
        self.sell_items_result = {}
        all_request_1_hours = FifaAccountRequest.objects.using('logs_pgbouncer').filter(
            create_time__gt=timezone.localtime() - timezone.timedelta(hours=1)
        ).count()
        if all_request_1_hours > (1000*1000):
            new_print(self.fifa_account, 'max request per one hour arrived ',
                      ' all one hours ', all_request_1_hours)
            self.sbc_worker.has_error = True
            self.sbc_worker.error_description = 'max request one hour'
            self.sbc_worker.save(update_fields=['has_error', 'error_description'])
            self.handle_end_bot(without_update_time=1)
            return 'max request one hour'
        while True:
            try:
                close_old_connections()
                # self.all_club_players_by_search = {}
                self.transfer_list_asset_id = []
                self.unassigned_asset_id = []
                self.sbc_worker.refresh_from_db()
                # self.sbc_storage_players = None
                if starting_loop < timezone.localtime() - timezone.timedelta(hours=12):
                    self.send_message(
                        bot, -1001208022772, f'{self.username} is more than 12 hour is in sbc solver loop. fix it')
                    break
                new_print(self.fifa_account, 'sbc solver core loop start ... , worker id : ', self.sbc_worker.id)
                if self.sbc_worker.must_done:
                    new_print(self.fifa_account, 'sbc worker ', self.sbc_worker, ' must done')
                    try:
                        self.handle_end_bot()
                        return 'must done'
                    except:
                        new_print(self.fifa_account, 'error 58 : ', traceback.format_exc())
                    new_print(self.fifa_account, 'bot is done and must return something in main branch')
                    return 'its done'
                sid_control = 1
                self.fifa_account.refresh_from_db()
                if self.fifa_account.need_captcha:
                    new_print(self.fifa_account, 'wait for captcha solving . 30 sec')
                    time.sleep(30)
                    continue
                # sell_first_items()
                # if self.running_platform not in ['console_web', 'console_web_pc']:
                #     # it's actuly not make bug but j_bayat want don't update credit for charts
                #     self.update_credit()
                # self.update_credit()
                # self.check_first_sbcs()
                if need_check_max_requests:
                    new_print(self.fifa_account, 'checking max requests')
                    need_check_max_requests = False
                    request_24_hours = FifaAccountRequest.objects.using('logs_pgbouncer').filter(
                            fifa_account_id=self.fifa_account.id,
                            create_time__gt=timezone.localtime() - timezone.timedelta(hours=24)
                        ).count()
                    request_12_hours = FifaAccountRequest.objects.using('logs_pgbouncer').filter(
                        fifa_account_id=self.fifa_account.id,
                        create_time__gt=timezone.localtime() - timezone.timedelta(hours=12)
                    ).count()
                    if request_24_hours > 800 or request_12_hours > 500:
                        new_print(self.fifa_account, 'max request per 24 hour arrived ',
                                  ' 24 hours ', request_24_hours, '12 hours ', request_12_hours)
                        self.sbc_worker.has_error = True
                        self.sbc_worker.error_description = 'max request 24 hour'
                        self.sbc_worker.save(update_fields=['has_error', 'error_description'])
                        self.handle_end_bot(without_update_time=1)
                        return 'max request 24 hour'
                time.sleep(2)
                if need_sell_items:
                    need_sell_items = False
                    self.main_dic['bid_controller_count'] = 0
                    self.sell_items_result = sell_items(
                        self, self.sbc_worker, self.fifa_account,
                        update_trade_pile=True, check_players_pick=False)

                # opening packs
                if need_open_packs:
                    need_open_packs = False
                    open_packs_result = self.open_packs_method()
                    if open_packs_result:
                        new_print(self.fifa_account, 'open packs result : , ', open_packs_result)
                        return open_packs_result
                    
                if not self.chemistry_profile_version:
                    get_result = get_chemistryProfilesVersion(self.fifa_account, self.se, self.main_dic['header'])
                    if get_result.get('status_bool'):
                        self.chemistry_profile_version = get_result.get('version')
                    else:
                        new_print(self.fifa_account, 'cant get profile version : ', get_result)
                        self.chemistry_profile_version = 0

                new = 0
                set_sub_log(self.sbc_worker, 'checking for existed sbc or select a new one')
                # completed_in_12_hour = SBCProcess.objects.filter(
                #     worker=self.sbc_worker, is_done=1,
                #     create_time__gt=timezone.localtime() - timezone.timedelta(hours=12)
                # ).values_list('sbc_type__id', flat=True)
                sbc_process = SBCProcess.objects.filter(worker=self.sbc_worker, is_done=False).exclude(
                    sbc_type__id__in=cant_solve_sbc_type_id
                # ).exclude(
                #     sbc_type__id__in=completed_in_12_hour
                ).last()
                if sbc_process:
                    new_print(self.fifa_account, 'process already exists : ', sbc_process,
                              ' sbc type : ', sbc_process.sbc_type)
                    sbc_process.sbc_type.refresh_from_db()
                    if sbc_process.sbc_type and not sbc_process.sbc_type.must_done:
                        new_print(self.fifa_account, 'sbc type must done is ',
                                  sbc_process.sbc_type.must_done,
                                  ' sbc type : ', sbc_process.sbc_type)
                        # sbc_process.is_done = True
                        sbc_process.has_error = True
                        sbc_process.status = 'not active anymore'
                        sbc_process.save(update_fields=['is_done', 'has_error', 'status'])
                        cant_solve_sbc_type_id.append(sbc_process.sbc_type.id)
                        SBCProcessTarget.objects.filter(sbc_process=sbc_process).delete()
                        continue
                    sbc = sbc_process.sbc_type
                    set_sbc_status(self.sbc_worker, 'sbc id = ' + str(sbc.id), update_time=False)
                    # self.sbc_worker.refresh_from_db()
                    # self.sbc_worker.status = 'sbc id = ' + str(sbc.id)
                    # self.sbc_worker.save()
                    # temp_accounts_sbc_id = sbc[1]

                    father_number = sbc_process.sbc_type.father_number
                    sbc_number = sbc_process.sbc_type.sbc_number
                    time.sleep(2)
                    completed_challenge = self.check_if_completed_sbc(
                        father_number, sbc_number, sbc_process)
                    if completed_challenge == 1:
                        new_print(self.fifa_account, 'this challenge already complete : ',
                                  father_number, sbc_number, ' - ', sbc_process.sbc_type)
                        time.sleep(2)
                        # sbc_process.refresh_from_db()
                        sbc_process.is_done = True
                        sbc_process.status = 'already complete'
                        sbc_process.save(update_fields=['is_done'])
                        SBCProcessTarget.objects.filter(sbc_process=sbc_process).delete()
                        continue
                    elif completed_challenge in [-1, -2]:
                        new_print(self.fifa_account,
                                  'challenge has error 1 , code : ', completed_challenge,
                                  sbc.sbc_number)
                        # sbc_process.refresh_from_db()
                        sbc_process.has_error = True
                        sbc_process.save(update_fields=['has_error'])
                        cant_solve_sbc_type_id.append(sbc.id)
                        self.send_message(bot, 123,
                                          f'challenge has error : {sbc.sbc_number}'
                                          f' account : {self.fifa_account}')
                        continue
                else:
                    sbc_type_max_try_q = Q()
                    for sbc_id_ee, count_ee in dict(Counter(solved_sbc_type_id)).items():
                        sbc_type_max_try_q |= Q(id=sbc_id_ee, max_try_repeats_per_worker__lte=count_ee)
                    already_done_qs = SBCProcess.objects.filter(
                        worker=self.sbc_worker,
                        sbc_type__repeatable='',
                    ).values_list('sbc_type__id', flat=True)
                    if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                        sbc = SBCType.objects.filter(
                            must_done=1, console_can_use=True,
                        ).exclude(
                            Q(id__in=Subquery(already_done_qs))
                        # ).exclude(id__in=completed_in_12_hour
                        ).exclude(
                            id__in=cant_solve_sbc_type_id
                        ).exclude(
                            sbc_type_max_try_q,
                        ).order_by('priority', 'id').first()
                    else:
                        sbc = SBCType.objects.filter(
                            must_done=1,
                        ).exclude(
                            Q(id__in=Subquery(already_done_qs))
                        # ).exclude(id__in=completed_in_12_hour
                        ).exclude(
                            id__in=cant_solve_sbc_type_id
                        ).exclude(
                            sbc_type_max_try_q,
                        ).order_by('priority', 'id').first()
                    # if self.manual_loyal and sbc and self.running_platform not in [
                    # 'console', 'console_web', 'console_web_pc']:
                    #     if sbc.id > 400:
                    #         if (not self.sbc_worker.first_xi) or (not self.sbc_worker.puzzle_master):
                    #             sbc = SBCType.objects.none()
                    # if (not sbc) and self.manual_loyal:
                    #     sbc = SBCType.objects.filter(must_done=3).exclude(
                    #         id__in=SBCProcess.objects.filter(
                    #             worker=self.sbc_worker,
                    #             sbc_type__repeatable='',
                    #         ).values_list(
                    #             'sbc_type__id', flat=True)
                    #     ).exclude(
                    #         id__in=cant_solve_sbc_type_id
                    #     ).order_by('priority').first()

                    self.fifa_account.refresh_from_db()
                    credit = self.fifa_account.credit
                    if sbc:
                        new_print(self.fifa_account, 'performing sbc id = ', sbc.id, ' , sbc name : ', sbc.name)
                        sbc_process = SBCProcess.objects.create(worker=self.sbc_worker, sbc_type=sbc,
                                                                sbc_number=sbc.sbc_number)
                        self.sbc_worker.refresh_from_db()
                        set_main_log(self.sbc_worker, f'performing sbc id = {sbc.id}')
                        set_sub_log(self.sbc_worker, 'check if its solved')
                        set_sbc_status(self.sbc_worker, f'sbc id = {sbc.id}')
                        # self.sbc_worker.status = 'sbc id = ' + str(sbc.id)
                        #
                        # self.sbc_worker.status_change_time = timezone.localtime()
                        # self.sbc_worker.description = ''
                        # self.sbc_worker.description_editor = None
                        # self.sbc_worker.save()
                        completed_challenge = self.check_if_completed_sbc(
                            sbc.father_number, sbc.sbc_number, sbc_process.id)

                        if completed_challenge == 1:
                            new_print(self.fifa_account,
                                      'this challenge already completed 2 , ',
                                      sbc.sbc_number)
                            # sbc_process.refresh_from_db()
                            sbc_process.is_done = True
                            sbc_process.status = 'already complete'
                            sbc_process.save(update_fields=['is_done'])
                            cant_solve_sbc_type_id.append(sbc.id)
                            continue
                        elif completed_challenge in [-1, -2]:
                            new_print(self.fifa_account,
                                      'challenge has error 1 , code : ', completed_challenge,
                                      sbc.sbc_number)
                            # sbc_process.refresh_from_db()
                            sbc_process.has_error = True
                            sbc_process.status = 'challenge not exists'
                            sbc_process.save(update_fields=['has_error'])
                            cant_solve_sbc_type_id.append(sbc.id)
                            self.send_message(bot, 123,
                                              f'challenge has error : {sbc.sbc_number}'
                                              f' account : {self.fifa_account}')
                            continue
                        if completed_challenge != 2:
                            self.open_sbc(sbc.sbc_number)

                        # if (sbc.sbc_number == 18 or sbc.sbc_number == 36) and self.manual_loyal:
                        #     time.sleep(2)
                        #     resp = self.se.get(
                        #         f'{fifa_23_address}/sbs/challenge/{sbc.sbc_number}/squad',
                        #         headers=self.main_dic['header'])
                        #     save_account_request(
                        #         fifa_account=self.fifa_account,
                        #         link=f'{fifa_23_address}/sbs/challenge/%s/squad',
                        #     )
                        #     squad_resp = resp.json()
                        #     squad_players = squad_resp['squad']['players']
                        #     squad_club_ids = []
                        #     for player in squad_players:
                        #         if player['itemData']['id']:
                        #             squad_club_ids.append(player['itemData']['id'])
                        #     new_print(self.fifa_account, 'len(squad_club_ids)', len(squad_club_ids))
                        #     if len(squad_club_ids) == 11:
                        #         new_print(self.fifa_account,
                        #                   'sbc solution already submitted. wont try a new one sbc number ='
                        #                   , sbc.sbc_number)
                        #         sbc_process.is_done = True
                        #         sbc_process.save()
                        #         continue

                        new_print(self.fifa_account, 'check for credit and other required conditions')
                        set_sub_log(self.sbc_worker, 'check for credit and other required conditions')
                        # if self.running_platform not in ['console_web', 'console_web_pc']:
                        #     self.update_credit()
                        # self.update_credit()
                        # self.fifa_account.refresh_from_db()
                        # credit = self.fifa_account.credit
                        sbc_targets_2 = SBCTarget.objects.filter(sbc_type=sbc).order_by('id').select_related('target_filter')
                        sbc_targets_price = sum([item.target_filter.buy_now_price if item.target_filter else item.price for item in sbc_targets_2])
                        if SBCSolvationModel.objects.filter(sbc_type=sbc).first():
                            sbc_targets_price = sbc.sbc_price
                        # sbc_estimate_price = sbc_targets_price + 2000
                        sbc_estimate_price = get_round_price(int(sbc_targets_price + (sbc_targets_price / 50)))
                        # if credit < sbc.sbc_actual_price + 2000 and not sbc.can_pass:
                        if (credit < sbc_estimate_price and
                                not sbc.can_pass and
                                self.running_platform not in ['console_web_pc']):
                            inject_coin = 12000
                            if sbc.sbc_actual_price > 12000:
                                # inject_coin = sbc.sbc_actual_price + 2000
                                inject_coin = get_round_price(int(sbc.sbc_actual_price + (sbc.sbc_actual_price / 50)))
                            if self.running_platform in ['console_web_pc']:
                                new_print(
                                    self.fifa_account,
                                    'need more coin for solving sbc 1 but this type of worker dont use coin',
                                    'need coin : ', sbc_estimate_price
                                )
                                cant_solve_sbc_type_id.append(sbc.id)
                                continue
                            if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                                new_print(self.fifa_account, 'need more coin for solving sbc 1 : ', inject_coin,
                                          ' sbc_targets_price : ', sbc_targets_price,
                                          ' sbc_estimate_price ', sbc_estimate_price,
                                          ' credit : ', self.fifa_account.credit)
                                return 'no credit'
                                # self.inject_coin(credit, inject_coin)
                                # self.update_credit()
                                # continue
                            new_print(self.fifa_account, 'not enough credit.w8 5 minutes.')
                            self.main_dic['no_credit'] += 1
                            new_print(self.fifa_account, "self.main_dic['no_credit'] = ",
                                      self.main_dic['no_credit'])
                            if self.main_dic['no_credit'] == 13:
                                self.get_new_sid()
                            elif self.main_dic['no_credit'] == 14:
                                self.sbc_low_credit_staff()

                            elif self.main_dic['no_credit'] > 26:
                                text = 'not enough credit for account %s . Before sbc. credit = %s , sbc_credit = %s' % (
                                    self.username, credit, sbc.sbc_actual_price)
                                self.send_message(bot, 123, text)
                                self.sbc_worker.error_description = "no credit"
                                self.sbc_worker.has_error = 1
                                self.sbc_worker.save(update_fields=['error_description', 'has_error'])

                                self.handle_end_bot()
                                time.sleep(30)
                                return "no credit"
                            time.sleep(300)
                            continue

                    new = 1
                if sbc:
                    must_done = sbc.must_done
                    set_sub_log(self.sbc_worker, 'getting all need to buy targets for solving sbc from web')
                    sbc_targets = SBCTarget.objects.filter(sbc_type=sbc).order_by('id')
                    need_pass_sbc_process = False
                    if sbc.team_min_rate:
                        players_min_rate = sbc.team_min_rate - 7
                    else:
                        players_min_rate = 0
                    # if sbc.team_min_rate >= 84:
                    #     players_min_rate = sbc.team_min_rate - 4
                    builder_count = 0
                    process_asset_id_list = []
                    process_players_rate_list = []
                    needed_credit = 0
                    need_to_buy_players = []
                    need_to_buy_players_2 = []
                    solved_in_model_two = False
                    cant_solved_in_model_two_reason = None
                    solvation_model = SBCSolvationModel.objects.filter(sbc_type=sbc).first()
                    # todo : main server can't handle many process , so dont solve on server for now
                    # if sbc.solvation_type == 2 and os.name != 'nt':
                    #     new_print(self.fifa_account, 'cant solve sbc for now, fix server first')
                    #     cant_solve_sbc_type_id.append(sbc.id)
                    #     continue
                    if solvation_model and sbc.solvation_type in [0, 2]:
                        add_counter = 0
                        if solvation_model.excluded_rarity_ids:
                            exclude_rare_flags = list(solvation_model.excluded_rarity_ids.all().values_list(
                                                'rare_id', flat=True))
                        else:
                            exclude_rare_flags = []
                        if (not self.all_club_players_by_get_bronze or
                                len(self.all_club_players_by_get_bronze) <= 30):
                            new_print(self.fifa_account,
                                      'len club players less than 30 or is not exists , ',
                                      len(self.all_club_players_by_get_bronze))
                            # self.all_club_players_by_get_bronze = self.get_bronze_club_players(get_pages=6)
                            self.all_club_players_by_get_bronze = self.get_filtered_club_players(
                                tradable_type=solvation_model.tradable_type)
                            time.sleep(3)
                        if len(self.all_club_players_by_get_bronze) > 30 or not self.fifa_account.run_squad_battle:
                            if sbc.can_pass:
                                need_more_than = 5
                            else:
                                need_more_than = 0
                            account_club_items = self.get_filtered_club_players(
                                max_rating=solvation_model.max_rating_players,
                                min_rating=solvation_model.min_rating_players,
                                tradable_type=solvation_model.tradable_type,
                                exclude_rare_flags=exclude_rare_flags,
                                save_some_items=need_more_than
                            )
                            # account_club_items = self.get_bronze_club_players(
                            #     get_pages=6, exclude_squad=False,
                            #     max_rating=solvation_model.max_rating_players,
                            #     min_rating=solvation_model.min_rating_players,
                            #     exclude_rare_flags=exclude_rare_flags,
                            #     save_some_items=need_more_than
                            # )
                            self.all_club_players_by_get_bronze = account_club_items
                        else:
                            new_print(self.fifa_account, 'club low items , dont use items ', len(self.all_club_players_by_get_bronze))
                            account_club_items = []
                        for item in account_club_items:
                            item['teamid'] = int(self.teams_dict_data.get(int(item['teamid'])).get('similar_team_ids')[0])
                        for iii in range(2):
                            try:
                                need_to_buy_players_2 = []
                                last_solved_players = SBCSolvationModelPlayers.objects.filter(
                                    sbc_worker=self.sbc_worker, sbc_type=sbc)
                                solved_list = []
                                players_targets = []
                                if last_solved_players:
                                    new_print(self.fifa_account,
                                              'this challange already solved , but need some players')
                                    add_counter = int(last_solved_players.last().add_counter)
                                    if add_counter > 2:
                                        new_print(self.fifa_account, 'cant solve in two buy try , break it')
                                        break
                                    solved_list.append([
                                        "Name", "Rating", "Rarity", "PreferredPosition", "Nation", "League", "Team",
                                        "LastSalePrice", "DiscardValue", "Untradeable", "Loans", "DefinitionId",
                                        "IsDuplicate", "IsInActive11", "AlternatePositions", "ExternalPrice",
                                        "IsExists", 'IndexComposition'])
                                    for solved_player in last_solved_players:
                                        player_found_1 = False
                                        club_similar_ids = self.teams_dict_data.get(int(solved_player.team)).get('similar_team_ids')
                                        # player_team_name = self.clubs_dict.get(solved_player.team)
                                        # similar_club_names = [player_team_name,
                                        #                       player_team_name + ' ( women )']
                                        # club_similar_ids = [int(iin[0]) for iin in SBC_TARGET_CLUBS if
                                        #                     iin[1] in similar_club_names]
                                        for club_item in account_club_items:
                                            if (int(club_item.get('assetId')) == solved_player.asset_id and
                                                int(club_item.get('rareflag')) == solved_player.rare and
                                                int(club_item.get('rating')) == solved_player.rating and
                                                int(club_item.get('nation')) == solved_player.nation and
                                                int(club_item.get('leagueId')) == solved_player.league and
                                                int(club_item.get('teamid')) in club_similar_ids
                                            ):
                                                solved_list.append([
                                                    solved_player.asset_id,
                                                    solved_player.rating,
                                                    str(solved_player.rare),
                                                    solved_player.position,
                                                    str(solved_player.nation),
                                                    str(solved_player.league),
                                                    str(solved_player.team),
                                                    club_item.get('lastSalePrice') or 0,
                                                    0, False, False,
                                                    club_item.get('id'),
                                                    False, False,
                                                    ','.join(club_item.get('possiblePositions')),
                                                    club_item.get('lastSalePrice') or 0,
                                                    1,
                                                    solved_player.index_composition,
                                                ])
                                                player_found_1 = True
                                                break
                                        if player_found_1 is False:
                                            new_print(self.fifa_account,
                                                      'player not found in club , ', vars(solved_player),
                                                      ' similar clubs : ', club_similar_ids)

                                solvation = SolvationCore()
                                solvation.set_conditions(solvation_model)
                                solvation.fifa_account = self.fifa_account
                                if len(solved_list) - 1 == solvation_model.num_players:
                                    new_print(self.fifa_account, 'already solved and bought players success')
                                    exists_items = pd.DataFrame(solved_list)
                                    exists_items.rename(columns=exists_items.iloc[0], inplace=True)
                                    exists_items.drop(exists_items.index[0], inplace=True)
                                    exists_items = solvation.preprocess_data_3(exists_items)
                                    df_out = exists_items.copy()
                                    # df_out.insert(5, 'Is_Pos', df_out.pop('Is_Pos'))
                                    players_targets = df_out.to_dict('records')
                                    formation = solvation.formation_dict_2.get(solvation_model.formation).copy()
                                    players_targets = sorted(players_targets, key=lambda d: d['IndexComposition'],
                                                             reverse=True)
                                    need_buy_player = 0 in [ie['IsExists'] for ie in players_targets]
                                    new_print(self.fifa_account, 'players targets 2 : ', players_targets)
                                    SBCProcessTarget.objects.filter(sbc_process=sbc_process).delete()
                                    last_solved_players.delete()
                                elif iii == 0 or solvation_model.buy_player:
                                    new_print(self.fifa_account,
                                              'not solved before or some players not exists , loop num : ', iii)
                                    last_solved_players.delete()
                                    exists_items = pd.DataFrame(convert_club_players_to_solvation_format(account_club_items))
                                    exists_items.rename(columns=exists_items.iloc[0], inplace=True)
                                    exists_items.drop(exists_items.index[0], inplace=True)
                                    # print('rows and columns', exists_items.shape)
                                    # todo: uncomment bellow
                                    if iii > 0:
                                        if self.running_platform in ['console_web', 'console_web_pc']:
                                            new_print(self.fifa_account,
                                                      'need to solve with futbin solvation? this worker cant buy item , ',
                                                      'loop num : ', iii)
                                            break
                                        # futbin players
                                        # futbin_players = pd.read_csv('futbin_input.csv', delimiter='|', index_col=False)
                                        # futbin_players['Rarity'] = futbin_players['Rarity'].astype("string")
                                        # futbin_players['Nation'] = futbin_players['Nation'].astype("string")
                                        # futbin_players['League'] = futbin_players['League'].astype("string")
                                        # futbin_players['Team'] = futbin_players['Team'].astype("string")
                                        # filtered_futbin = futbin_players.loc[
                                        #     (futbin_players['Rating'] >= solvation_model.squad_rating - 2) & (
                                        #                 futbin_players['Rating'] <= solvation_model.squad_rating + 2)]

                                        # player cards
                                        # players_cards = []
                                        # if solvation_model.squad_rating ==0:
                                        #     bronze_common_cards = PlayerCard.objects.exclude(nation=0).filter(
                                        #         price__gt=0, rating__lt=65, rare=0).order_by('price')[:100]
                                        #     bronze_rare_cards = PlayerCard.objects.exclude(nation=0).filter(
                                        #         price__gt=0, rating__lt=65, rare__gt=0).order_by('price')[:100]
                                        #     silver_common_cards = PlayerCard.objects.exclude(nation=0).filter(
                                        #         price__gt=0, rating__lt=75, rating__gte=65, rare=0).order_by('price')[:100]
                                        #     silver_rare_cards = PlayerCard.objects.exclude(nation=0).filter(
                                        #         price__gt=0, rating__lt=75, rating__gte=65, rare__gt=0).order_by('price')[:100]
                                        #     gold_common_cards = PlayerCard.objects.exclude(nation=0).filter(
                                        #         price__gt=0, rating__gte=75).order_by('price')[:100]
                                        #     gold_rare_cards = PlayerCard.objects.exclude(nation=0).filter(
                                        #         price__gt=0, rating__gte=75).order_by('price')[:100]
                                        #     players_data = pd.DataFrame(
                                        #         convert_player_cards_to_solvation_format(
                                        #             bronze_common_cards | bronze_rare_cards |
                                        #             silver_common_cards | silver_rare_cards |
                                        #             gold_common_cards | gold_rare_cards
                                        #         ))
                                        # else:
                                        #     special_rates_cards = PlayerCard.objects.exclude(nation=0).filter(
                                        #         price__gt=0, rating__gte=solvation_model.squad_rating - 2,
                                        #         rating__lte=solvation_model.squad_rating + 2).order_by('price')[:500]
                                        #     players_data = pd.DataFrame(
                                        #         convert_player_cards_to_solvation_format(
                                        #             special_rates_cards
                                        #         ))
                                        # players_data.rename(columns=players_data.iloc[0], inplace=True)
                                        # players_data.drop(players_data.index[0], inplace=True)

                                        # players from first three solvation futbin
                                        futbin_players_data = get_newest_solvations_players(self, sbc, solvation_model)
                                        players_data = pd.DataFrame(convert_players_to_solvation_format(futbin_players_data))
                                        players_data.rename(columns=players_data.iloc[0], inplace=True)
                                        players_data.drop(players_data.index[0], inplace=True)
                                        # merge futbin players to club players
                                        merged_data = pd.merge(exists_items, players_data, how='outer')
                                        merged_data = merged_data.drop_duplicates(
                                            subset=['Name', 'Rating'], keep='first')
                                        data_frame = merged_data
                                        solvation.MINIMIZE_OBJECTIVE = 'cost'
                                    else:
                                        data_frame = exists_items

                                    # print('shape : ', data_frame.shape)
                                    # data_frame_2 = data_frame.copy()
                                    # data_frame_2.to_excel("test.xlsx", index=False)
                                    data_frame = solvation.preprocess_data_3(data_frame)
                                    new_print(self.fifa_account,
                                              'solving started . players shape : ', data_frame.shape)
                                    if os.name == 'nt':
                                        players_targets = []
                                        for iiii in range(600):
                                            existed_model_worker = SBCSolvationModelWorker.objects.filter(
                                                fifa_account__console__name__in=CONSOLE_NAME_LIST,
                                                is_complete=False, has_error=False,
                                                create_time__gte=timezone.localtime() - timezone.timedelta(minutes=10)
                                            ).last()
                                            if existed_model_worker:
                                                if iiii % 10 == 0:
                                                    new_print(self.fifa_account, 'already one not completed worker exists')
                                                time.sleep(10)
                                                continue
                                            else:
                                                new_print(self.fifa_account, 'no other worker exists , solving started')
                                                break
                                        new_model_worker = SBCSolvationModelWorker.objects.create(
                                            fifa_account=self.fifa_account,
                                            solvation_model=solvation_model,
                                            is_complete=False,
                                        )
                                        try:
                                            final_players = solvation.solver(data_frame)
                                            close_old_connections()
                                            new_model_worker.refresh_from_db()
                                            new_model_worker.is_complete = True
                                            new_model_worker.save(update_fields=['is_complete'])
                                            cant_solved_in_model_two_reason = solvation.solve_status_short_text
                                        except Exception as solver_except:
                                            new_model_worker.has_error = True
                                            new_model_worker.save(update_fields=['has_error'])
                                            raise solver_except
                                        if final_players:
                                            df_out = data_frame.iloc[final_players].copy()
                                            df_out.insert(5, 'Is_Pos', df_out.pop('Is_Pos'))
                                            players_targets = df_out.to_dict('records')
                                    else:
                                        from sbc.tasks import get_solvation
                                        players_targets = []
                                        solvation_model_dict = model_to_dict(solvation_model)
                                        solvation_model_dict.pop('excluded_rarity_ids', [])
                                        solvation_model_dict.pop('sbc_type', 0)
                                        solvation_model_dict.update({
                                            'required_positions': ','.join(list(str(ii) for ii in solvation_model.sbc_type.sbctarget_set.values_list('position', flat=True)))})
                                        solvation_result = get_solvation.delay(
                                            solvation_model_dict=json.dumps(solvation_model_dict),
                                            json_players_data=data_frame.to_json(orient='records'),
                                            fifa_account_id=self.fifa_account.id
                                        )
                                        time.sleep(1)
                                        with allow_join_result():
                                            solvation_result = solvation_result.get()
                                            new_print(self.fifa_account, 'solvation result : ', solvation_result)
                                        # todo : bellow code work but no need to use. bellow is created for run in consoles
                                        # solvation_resp = requests.post(
                                        #     'http://142.132.177.244:8000/sbc/sbc/solvation-view/',
                                        #     json={
                                        #         'solvation_model_id': solvation_model.id,
                                        #         'json_players_data': data_frame.to_json(orient='records'),
                                        #         'fifa_account_id': self.fifa_account.id,
                                        #     },
                                        #     timeout=600,
                                        # )
                                        # try:
                                        #     solvation_result = solvation_resp.json()
                                        # except:
                                        #     with open('solvation_error.html', 'w') as result_file:
                                        #         result_file.write(solvation_resp.text)
                                        #     solvation_result = {}
                                        final_players = solvation_result.get('final_players')
                                        if final_players:
                                            players_targets = solvation_result.get('players_targets')
                                    # final_players = True
                                    if players_targets:
                                        # formation = solvation.formation_dict_2.get(solvation.FORMATION).copy()
                                        formation = solvation.formation_dict_2.get(solvation_model.formation).copy()
                                        if len(players_targets) < 11:
                                            correct_positions = list(sbc_targets.values_list('position', flat=True))
                                            for ind, ee in enumerate(formation):
                                                if ind not in correct_positions:
                                                    formation[ind] = 0
                                        players_targets = sorted(players_targets, key=lambda d: d['Is_Pos'], reverse=True)
                                        need_buy_player = 0 in [ie['IsExists'] for ie in players_targets]
                                        new_print(self.fifa_account,
                                                  'players targets : ', players_targets,
                                                  ' formation : ', formation)
                                        SBCProcessTarget.objects.filter(sbc_process=sbc_process).delete()
                                if players_targets:
                                    for item_1 in players_targets:
                                        if int(item_1.get('Cost')) > 0 and not item_1.get('IsExists'):
                                            needed_credit += int(item_1.get('Cost'))
                                        if item_1.get('IndexComposition'):
                                            item_index = item_1.get('IndexComposition')
                                            formation[item_index] = int(item_1.get('Name'))
                                        elif item_1.get('Is_Pos') and (solvation.CHEMISTRY or solvation.CHEM_PER_PLAYER):
                                            item_index = formation.index(item_1.get('Position'))
                                            formation[item_index] = int(item_1.get('Name'))
                                        else:
                                            item_index = formation.index(
                                                [ii for ii in formation if isinstance(ii, str)][0])
                                            formation[item_index] = int(item_1.get('Name'))
                                        if int(item_1.get('DefinitionId')) == 0:
                                            needed_player_card = PlayerCard.objects.filter(
                                                    asset_id=int(item_1.get('Name')),
                                                    rating=int(item_1.get('Rating')),
                                                    rare=int(item_1.get('Rarity'))).first()
                                            if not needed_player_card:
                                                p_info = get_player_data_by_asset_id(item_1.get('Name'))
                                                u_name = unidecode.unidecode(p_info[0].lower())
                                                needed_player_card = PlayerCard.objects.create(
                                                    name=p_info[0],
                                                    unicode_name=u_name,
                                                    asset_id=int(item_1.get('Name')),
                                                    rating=int(item_1.get('Rating')),
                                                    rare=int(item_1.get('Rarity'))
                                                )
                                            need_to_buy_players_2.append({
                                                'player_card': needed_player_card,
                                                'price': int(item_1.get('Cost'))})
                                            SBCSolvationModelPlayers.objects.create(
                                                sbc_type=sbc,
                                                sbc_worker=self.sbc_worker,
                                                index_composition=item_index,
                                                asset_id=int(item_1.get('Name')),
                                                rating=int(item_1.get('Rating')),
                                                rare=int(item_1.get('Rarity')),
                                                team=int(item_1.get('Club')),
                                                nation=int(item_1.get('Country')),
                                                league=int(item_1.get('League')),
                                                add_counter=add_counter+1
                                            )
                                        elif need_buy_player:
                                            SBCSolvationModelPlayers.objects.create(
                                                sbc_type=sbc,
                                                sbc_worker=self.sbc_worker,
                                                index_composition=item_index,
                                                asset_id=int(item_1.get('Name')),
                                                rating=int(item_1.get('Rating')),
                                                rare=int(item_1.get('Rarity')),
                                                team=int(item_1.get('Club')),
                                                nation=int(item_1.get('Country')),
                                                league=int(item_1.get('League')),
                                                add_counter=add_counter+1
                                            )
                                        elif not need_buy_player:
                                            SBCProcessTarget.objects.create(
                                                sbc_process=sbc_process, club_id=item_1.get('DefinitionId'),
                                                position=item_index, asset_id=item_1.get('Name'),
                                                rating=item_1.get('Rating'), last_sale_price=item_1.get('LastSalePrice'))
                                    solved_in_model_two = True
                                    new_print(self.fifa_account, f'solved with solvation model {sbc.id}')
                                    break
                                else:
                                    new_print(self.fifa_account,
                                              'cant solve with auto solvation , try counter : ', add_counter,
                                              ' buy players allowed : ', solvation_model.buy_player)
                            except:
                                new_print(self.fifa_account, 'can not solve , error: ',
                                          str(traceback.format_exc())[:10000])
                        if sbc.solvation_type == 2 and solved_in_model_two is False:
                            self.send_message(
                                bot, 123, f'cant solve sbc with auto sbc solvation\n'
                                          f'{self.fifa_account}\nsbc : {sbc}\ntry counter : {add_counter}\ncant solve reason {cant_solved_in_model_two_reason}',
                                message_thread_id=ARZBAZI_REPORT_TOPIC_SBC_THREAD_MESSAGE_ID,
                            )
                            new_print(self.fifa_account,
                                      'can not solve with new model and solver type is : ', sbc.solvation_type,
                                      ' pass this sbc')
                            need_pass_sbc_process = True
                            cant_solve_sbc_type_id.append(sbc.id)
                    if solved_in_model_two is False and sbc.solvation_type in [0, 1]:
                        while True:
                            self.sbc_worker.refresh_from_db()
                            if self.sbc_worker.must_done or self.sbc_worker.has_error:
                                new_print(self.fifa_account, 'worker has error or must done')
                                return 'has error or must done'
                            if not sbc_targets:
                                new_print(self.fifa_account, 'no target found for this sbc w8 20 secs')
                                time.sleep(20)
                                sid_control = 0
                                break
                            need_to_buy_players = []
                            needed_credit = 0
                            sbc.refresh_from_db()
                            for target in sbc_targets:
                                # time.sleep(1)
                                if sbc.team_min_rate and len(process_players_rate_list) >= len(sbc_targets):
                                    # current_team_rate = sum(process_players_rate_list) /
                                    # len(process_players_rate_list)
                                    current_team_rate = self.calculate_team_rate_avg(process_players_rate_list)
                                    if (sbc.team_min_rate and current_team_rate >= sbc.team_min_rate and
                                            builder_count > 0):
                                        new_print(self.fifa_account,
                                                  f'current team rate is {current_team_rate} equal or greater than min team {sbc.team_min_rate}'
                                                  f'team rate : {process_players_rate_list}')
                                        break
                                if sbc.sbc_actual_price > sbc.sbc_price + 4000:
                                    new_print(self.fifa_account, 'must recheck players price')
                                    self.send_message(bot, 123,
                                                      f'must recheck sbc actual price and sbc prce : sbc id : {sbc.id}')
                                    sid_control = 0
                                    time.sleep(120)
                                    raise Exception('Must recheck players price')

                                process_target_exist = SBCProcessTarget.objects.filter(
                                    sbc_process=sbc_process, position=target.position).first()
                                new_print(self.fifa_account, 'process target exits : ', process_target_exist,
                                          ' builder count : ', builder_count)
                                if len(process_players_rate_list) > 20:
                                    new_print(self.fifa_account,
                                              'how process list can goes more than 11. its bug. break')
                                    break
                                if builder_count > 100:
                                    new_print(self.fifa_account,
                                              'how builder count more than 100? its bug. break')
                                    break
                                if builder_count > 0 and process_target_exist:
                                    process_target_exist.delete()
                                    process_target_exist = None
                                    process_players_rate_list = process_players_rate_list[1:]
                                    process_asset_id_list = process_asset_id_list[1:]
                                if not process_target_exist:
                                    # if must_done == 2:
                                    new_print(self.fifa_account,
                                              'process target not exists , asset_id = ', target.asset_id,
                                              target.target_filter)
                                    exclude_squad_players = True
                                    # set this condition to solve 4 first challange
                                    # if sbc.can_pass:
                                    #     exclude_squad_players = False
                                    if target.use_squad_players:
                                        exclude_squad_players = False
                                    player_min_rate = players_min_rate
                                    rare_target = target.rare
                                    exclude_rare_flags = []
                                    exclude_rare_flags = [str(ii) for ii in range(0, 300) if str(ii) != target.rare]
                                    if target.target_filter:
                                        if (target.target_filter.nation or target.target_filter.team or
                                                target.target_filter.league):
                                            player_min_rate = 0
                                        elif target.target_filter.min_rating:
                                            player_min_rate = target.target_filter.min_rating
                                        if target.target_filter.excluded_rarity_ids:
                                            exclude_rare_flags = target.target_filter.excluded_rarity_ids.all().values_list(
                                                'rare_id', flat=True)
                                        else:
                                            exclude_rare_flags = []
                                        if target.target_filter.rarity_ids:
                                            rare_target = target.target_filter.rarity_ids
                                            target_filter_rarity_id = target.target_filter.rarity_ids
                                            exclude_rare_flags = [str(ii) for ii in range(0, 300) if str(ii) != target_filter_rarity_id]
                                        elif target.target_filter.use_special_players:
                                            rare_target = 1
                                            exclude_rare_flags = [0] + exclude_rare_flags
                                        else:
                                            rare_target = None
                                            exclude_rare_flags = [str(ii) for ii in range(2, 300)]
                                    if (sbc.can_pass and target.target_filter and
                                            not target.target_filter.nation and not target.target_filter.league and
                                        not target.target_filter.team and not target.target_filter.rarity_ids
                                    ):
                                        need_more_than = 5
                                    else:
                                        need_more_than = 0
                                    if target.target_filter:
                                        search_filter = self.convert_target_filter_to_payload(target.target_filter)
                                    else:
                                        search_filter = {}
                                    filtered_players = self.get_filtered_club_players(
                                        asset_id=target.asset_id if not target.target_filter else None,
                                        tradable_type=target.tradable_type,
                                        search_filter=search_filter,
                                        exclude_rare_flags=exclude_rare_flags,
                                        min_rating=player_min_rate,
                                        exclude_squad=exclude_squad_players,
                                        save_some_items=need_more_than,
                                    )
                                    search_in_club_result = {}
                                    # new_print(self.fifa_account, 'filtered players : ', filtered_players)
                                    if filtered_players:
                                        for itee in filtered_players:
                                            if int(itee.get('assetId')) not in process_asset_id_list:
                                                search_in_club_result = itee
                                                break
                                    # search_in_club_result = self.search_target_in_club(
                                    #     target.asset_id, target.pos, must_done, target.team,
                                    #     tradable_type=target.tradable_type,
                                    #     rare_target=rare_target, target_filter=target.target_filter,
                                    #     exclude_players_list=process_asset_id_list,
                                    #     min_rate=player_min_rate, get_pages=10, exclude_squad=exclude_squad_players,
                                    #     exclude_rare_flags=exclude_rare_flags,
                                    #     need_more_than=need_more_than
                                    # )
                                    player_club_id = int(search_in_club_result.get('id') or 0)
                                    player_asset_id = int(search_in_club_result.get('assetId') or 0)
                                    p_rate = int(search_in_club_result.get('rating') or 0)
                                    player_last_sale_price = int(search_in_club_result.get('lastSalePrice') or 0)
                                    process_asset_id_list.append(player_asset_id)
                                    process_players_rate_list.append(p_rate)
                                    if player_club_id:
                                        SBCProcessTarget.objects.create(
                                            sbc_process=sbc_process, club_id=player_club_id,
                                            position=target.position, asset_id=player_asset_id,
                                            rating=p_rate, last_sale_price=player_last_sale_price)
                                        new_print(self.fifa_account, 'player exist in club , ',
                                                  ' search result : ', search_in_club_result,
                                                  ' len(club players) : ', len(self.club_players_information.get('club_players')))
                                        continue
                                    if player_club_id == 0 and sbc_process.sbc_type.can_pass:
                                        new_print(self.fifa_account, 'need player that not exists but can pass')
                                        need_pass_sbc_process = True
                                        cant_solve_sbc_type_id.append(sbc.id)
                                        break

                                    need_to_buy_players.append(target)
                                    if target.target_filter:
                                        needed_credit += target.target_filter.buy_now_price
                                    else:
                                        needed_credit += target.price
                                else:
                                    new_print(self.fifa_account, 'sbc process target already exists , process: ',
                                              process_target_exist, ', target : ', target)
                                    process_asset_id_list.append(process_target_exist.asset_id)
                                    process_players_rate_list.append(process_target_exist.rating)
                            current_team_rate = self.calculate_team_rate_avg(process_players_rate_list)
                            if sbc.team_min_rate and current_team_rate < sbc.team_min_rate:
                                new_print(self.fifa_account,
                                          f'current team rate {current_team_rate} is lower than min team {sbc.team_min_rate}'
                                          f'team rate : {process_players_rate_list} , '
                                          f'players_min_rate : {players_min_rate} , '
                                          f'need_pass_sbc_process : {need_pass_sbc_process}')
                                if not need_pass_sbc_process:
                                    players_min_rate += 1
                                    builder_count += 1
                                    continue
                            new_print(self.fifa_account, 'team rate : ', current_team_rate,
                                      'players rate : ', process_players_rate_list)
                            time.sleep(0.5)
                            if not sid_control:
                                break
                            if need_pass_sbc_process:
                                break
                            break
                    # if self.running_platform not in ['console_web', 'console_web_pc']:
                    #     self.update_credit()
                    if self.fifa_account.credit < needed_credit + 2000:
                        self.update_credit()
                    self.fifa_account.refresh_from_db()
                    if (self.fifa_account.credit < needed_credit and
                            self.running_platform not in ['console_web_pc'] and
                            (need_to_buy_players or need_to_buy_players_2)):
                        inject_coin = 2000
                        if needed_credit > 2000:
                            inject_coin = needed_credit + 2000
                        if self.running_platform in ['console_web_pc']:
                            new_print(self.fifa_account,
                                      'need more coin for solving sbc 2 but this type of worker dont use coin',
                                      ' need coin : ', needed_credit)
                            # need_pass_sbc_process = True
                            cant_solve_sbc_type_id.append(sbc.id)
                            continue
                            # break
                        elif self.running_platform in ['console', 'console_web', 'console_web_pc']:
                            new_print(self.fifa_account, 'need more coin for solving sbc : ',
                                      inject_coin, ' needed credit : ', needed_credit,
                                      ' current coin : ', self.fifa_account.credit)
                            return 'no credit'
                        else:
                            # new_print(self.fifa_account, 'no credit')
                            # # self.send_message(bot, '123', 'no credit for account %s' % self.username)
                            # time.sleep(600)
                            # 5 / 0
                            new_print(self.fifa_account, 'not enough credit.w8 5 minutes. #### ')
                            self.main_dic['no_credit'] += 1
                            new_print(self.fifa_account, "self.main_dic['no_credit'] = ",
                                      self.main_dic['no_credit'])
                            if self.main_dic['no_credit'] == 13:
                                self.get_new_sid()
                            elif self.main_dic['no_credit'] == 14:
                                self.sbc_low_credit_staff()

                            elif self.main_dic['no_credit'] > 26:
                                text = 'not enough credit for account %s . Before sbc. credit = %s , sbc_credit = %s' % (
                                    self.username, self.fifa_account.credit, sbc.sbc_actual_price)
                                self.send_message(bot, 123, text)
                                self.sbc_worker.error_description = "no credit"
                                self.sbc_worker.has_error = 1
                                self.sbc_worker.save(update_fields=['error_description', 'has_error'])

                                self.handle_end_bot()
                                time.sleep(30)
                                return 'no credit'
                            time.sleep(300)

                    if sid_control and (need_to_buy_players or need_to_buy_players_2):
                        set_sub_log(self.sbc_worker,
                                    f'buy needed targets , len = {len(need_to_buy_players)} , len_2 = {len(need_to_buy_players_2)}')
                        if self.running_platform in ['console_web_pc']:
                            new_print(self.fifa_account,
                                      f'sbc solution need some player '
                                      f'{need_to_buy_players} -- {need_to_buy_players_2}'
                                      f'but this type of worker cant buy player, so add it to cant solve',
                                      ' -- sum players 2 : ', sum([ii.get('price') for ii in need_to_buy_players_2]))
                            # need_pass_sbc_process = True
                            cant_solve_sbc_type_id.append(sbc.id)
                            continue
                            # break
                        for target in need_to_buy_players:
                            if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                                if target and target.target_filter:
                                    new_print(self.fifa_account,
                                              'need this target filter : ', target.target_filter)
                                else:
                                    new_print(self.fifa_account, 'need this target : ', target)
                                AccountSBCNeedPlayer.objects.create(
                                    fifa_account=self.fifa_account,
                                    sbc_target=target,
                                )
                                continue
                            else:
                                if target.target_filter:
                                    self.search_player_and_bid(
                                        target.asset_id, 0, 1,
                                        trade_mode=2,
                                        max_bid_price=0,
                                        position=target.position,
                                        accounts_sbc_id=sbc_process.id,
                                        change_pos=target.pos, sbc_target_id=target.id,
                                        team=target.team,
                                        filter_target=target.target_filter
                                    )
                                    continue
                                else:
                                    error = self.search_price(
                                        target.price, target.asset_id, trade_mode=2,
                                        rare=target.rare,
                                        rating=target.rating,
                                        position=target.position,
                                        accounts_sbc_id=sbc_process.id,
                                        limit_max_price=target.price * 2,
                                        change_pos=target.pos, team=target.team)
                            try:
                                player_price = int(error)
                            except:
                                new_print(self.fifa_account, 'error 57 : ',
                                          traceback.format_exc(), ' error = ', error)
                                # new_print(self.fifa_account, 'error = ', error)
                                if error == 'player bought':
                                    new_print(self.fifa_account, 'player already bought look for next one')
                                    continue
                                elif error:
                                    if self.main_dic['new_sid_set'] > 2:
                                        text = 'search loop for %s' % self.username
                                        self.send_message(bot, 'critical', text)
                                        time.sleep(3000)
                                    self.main_dic['new_sid_set'] += 1
                                    new_print(self.fifa_account, 'new sid set.reloop.')
                                    sid_control = 0
                                    break
                            self.main_dic['new_sid_set'] = 0
                            new_print(self.fifa_account, 'player_price 4 = ', player_price)
                            if player_price > 16000:
                                text = (f'player price is more than 16000. will not buy this item .'
                                        f' account = {self.username}')
                                self.send_message(bot, 'critical', text)
                                time.sleep(300)
                                # break
                                # if self.running_platform == 'console':
                                #     self.console_close_ultimate()
                                raise Exception('player price is more than 16000')
                            if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                                AccountSBCNeedPlayer.objects.create(
                                    fifa_account=self.fifa_account,
                                    sbc_target=target,
                                )
                            else:
                                self.search_player_and_bid(
                                    target.asset_id, player_price, 1,
                                    rating=target.rating,
                                    rare=target.rare,
                                    trade_mode=2,
                                    max_bid_price=0,
                                    position=target.position,
                                    accounts_sbc_id=sbc_process.id,
                                    change_pos=target.pos, sbc_target_id=target.id,
                                    team=target.team)
                        for target_2 in need_to_buy_players_2:
                            if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                                new_print(self.fifa_account, 'need this target 2 : ', target_2)
                                AccountSBCNeedPlayer.objects.create(
                                    fifa_account=self.fifa_account,
                                    player_card=target_2.get('player_card'),
                                    price=target_2.get('price')
                                )
                                continue
                            else:
                                player_card_obj = target_2.get('player_card')
                                error = self.search_price(
                                    target_2.get('price'), player_card_obj.asset_id, trade_mode=2,
                                    rare=player_card_obj.rare,
                                    rating=player_card_obj.rating,
                                    limit_max_price=target_2.get('price')*2,
                                    position=player_card_obj.position,
                                    team=player_card_obj.team)
                            try:
                                player_price = int(error)
                            except:
                                new_print(self.fifa_account, 'error 57 : ', traceback.format_exc(), ' error = ',
                                          error)
                                # new_print(self.fifa_account, 'error = ', error)
                                if error == 'player bought':
                                    new_print(self.fifa_account, 'player already bought look for next one')
                                    continue
                                elif error:
                                    if self.main_dic['new_sid_set'] > 2:
                                        text = 'search loop for %s' % self.username
                                        self.send_message(bot, 'critical', text)
                                        time.sleep(3000)
                                    self.main_dic['new_sid_set'] += 1
                                    new_print(self.fifa_account, 'new sid set.reloop.')
                                    sid_control = 0
                                    break
                            self.main_dic['new_sid_set'] = 0
                            new_print(self.fifa_account, 'player_price = ', player_price)
                            if player_price > 16000:
                                text = 'player price is more than 16000. will not buy this item . account = %s' % self.username
                                self.send_message(bot, 'critical', text)
                                time.sleep(300)
                                raise Exception('player price is more than 16000')

                            card_data = target_2.get('player_card')
                            self.search_player_and_bid(
                                card_data.asset_id, target_2.get('price'), 1,
                                rating=card_data.rating,
                                rare=card_data.rare,
                                position=card_data.position, team=card_data.team,
                                trade_mode=2,
                                max_bid_price=0)
                        if self.running_platform in [
                            'console', 'console_web', 'console_web_pc'
                        ] and (need_to_buy_players or need_to_buy_players_2):
                            return 'need to buy player'
                        #     self.console_close_ultimate()
                        #     new_print(self.fifa_account, 'console end of sbc players get price and buy ...')
                    if need_pass_sbc_process:
                        continue
                    if not sid_control:
                        continue
                    new_print(self.fifa_account, 'buy all players for sbc is done , sbc : ', sbc.name)
                    self.main_dic['no_credit'] = 0
                    self.all_club_players_by_search = {} # make it empty to get it again
                    self.sbc_storage_players = None  # make it None to get it again
                    # sbc.refresh_from_db()
                    # sbc.update_time = timezone.localtime()
                    # sbc.save()
                    # need_sleep = 1
                    set_sub_log(self.sbc_worker, 'send sbc solution and open pack')
                    process_targets_information = list(SBCProcessTarget.objects.filter(
                        sbc_process=sbc_process).distinct('club_id').values())
                    process_targets_last_sale_price = [ii.get('last_sale_price') for ii in process_targets_information]
                    for iee in process_targets_information:
                        remove_status = self.remove_from_club_players_information(int(iee.get('club_id')))
                        # new_print(self.fifa_account, 'remove status : ', remove_status)
                    new_print(self.fifa_account, ' remove me , solvation targets  : ',
                              process_targets_information, ' sbc number : ', sbc)
                    submit_sbc_result = self.send_squad_solution_and_open_pack(sbc_process.id, submit=sbc.submit_sbc)
                    if submit_sbc_result == 'successful' and sbc.repeatable:
                        solved_sbc_type_id.append(sbc.id)
                        same_group_sbcs = SBCType.objects.filter(
                            father_number=sbc.father_number
                        ).exclude(
                            must_done=0
                        ).exclude(
                            Q(sbc_number=sbc.sbc_number) & ~Q(id=sbc.id)
                        )
                        if same_group_sbcs.count() >= 2:
                            for group_sbc in same_group_sbcs:
                                new_print(self.fifa_account,
                                          f'sbc {group_sbc.sbc_number} {group_sbc.name}'
                                          f' with father number {group_sbc.father_number} will reset')
                                if group_sbc.id in cant_solve_sbc_type_id:
                                    cant_solve_sbc_type_id.remove(group_sbc.id)
                    if submit_sbc_result == 'successful':
                        set_sbc_status(self.sbc_worker, f'submit sbc {sbc.sbc_number} done')
                        set_main_log(self.sbc_worker, 'sbc done successful')
                        new_print(self.fifa_account, 'process_targets_last_sale_price : ',
                                  process_targets_last_sale_price)
                        bought_item_list = []
                        for aaad in process_targets_last_sale_price:
                            if aaad:
                                bought_item_list.append(AccountBoughtItem(
                                    fifa_account=self.fifa_account,
                                    buy_price=int(aaad),
                                    item_type='player',
                                    requested_worker='sbc',
                                    sbc_number=sbc.sbc_number,
                                ))
                        if bought_item_list:
                            AccountBoughtItem.objects.bulk_create(objs=bought_item_list)
                        sbc_process.sum_bought_items = sum(process_targets_last_sale_price)
                        sbc_process.save(update_fields=['sum_bought_items'])
                        need_check_max_requests = True
                        if sbc.open_packs == 1:
                            need_open_packs = True
                    if submit_sbc_result == 'need_check_sbc_solution':
                        sbc_process.is_done = True
                        sbc_process.has_error = True
                        sbc_process.save(update_fields=['is_done', 'has_error'])
                        need_pass_sbc_process = True
                        cant_solve_sbc_type_id.append(sbc.id)
                    if not sbc.submit_sbc:
                        sbc_process.is_done = True
                        sbc_process.has_error = True
                        sbc_process.save(update_fields=['is_done', 'has_error'])
                        # if sbc.sbc_number == 36:
                        #     self.sbc_worker.refresh_from_db()
                        #     self.sbc_worker.main_squad = False
                        #     self.sbc_worker.save()
                    # if submit_sbc_result == 'pass sbc' and sbc.can_pass:
                    if submit_sbc_result == 'pass sbc':
                        need_pass_sbc_process = True
                        cant_solve_sbc_type_id.append(sbc.id)
                    if submit_sbc_result:
                        if self.running_platform not in ['console', 'console_web', 'console_web_pc']:
                            new_print(self.fifa_account, 'sleep for 10 seconds')
                            time.sleep(10)

                else:
                    new_print(self.fifa_account, 'no sbc left to done. going to all sbc done process')
                    self.sbc_worker.refresh_from_db()
                    need_to_set_puzzle_master_and_first_xi = False
                    if self.manual_loyal:
                        new_print(self.fifa_account, 'manual loyal??')
                        time.sleep(20)
                    if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                        sell_items(self, self.sbc_worker, self.fifa_account)
                    set_sub_log(self.sbc_worker, 'all sbc completed things')
                    if self.running_platform in ['console_web', 'console_web_pc']:
                        set_main_log(self.sbc_worker, 'sbc file completed')
                    else:
                        set_main_log(self.sbc_worker, 'sbc core completed')
                    self.all_sbc_completed = True
                    # active_trades, sum_active_trades, sum_starting_bids, sum_unlisted_items = self.check_active_unlisted_items()
                    check_active_result = self.check_active_unlisted_items()
                    active_trades = check_active_result.get('active_trades')
                    sum_active_trades = check_active_result.get('sum_active_trades')
                    sum_starting_bids = check_active_result.get('sum_starting_bids')
                    sum_unlisted_items = check_active_result.get('sum_unlisted_items')
                    if sum_unlisted_items > 5 and self.running_platform not in [
                        'console', 'console_web', 'console_web_pc'
                    ]:
                        continue

                    self.sbc_worker.complete_number += 1
                    self.sbc_worker.save()
                    if self.sbc_worker.order_active_squad:
                        if self.sbc_worker.order_active_squad_formation:
                            self.active_squad_handler(formation=self.sbc_worker.order_active_squad_formation)
                        else:
                            self.active_squad_handler()
                    open_packs_result = self.open_packs_method()
                    if open_packs_result:
                        new_print(self.fifa_account, 'open packs result 2 : , ', open_packs_result)
                        return open_packs_result
                    self.save_unopened_packs_data()
                    if self.running_platform in ['console', 'console_web', 'console_web_pc']:
                        self.save_account_items(force_update=True)
                    text = ('all SBC is completed\n' + self.username +
                            '\nsearchs for solving and sell items = ' +
                            str(self.fifa_account.account_search.filter(
                                search_time__gt=timezone.localtime() - timezone.timedelta(hours=24)).count()))
                    add_part = f'\nnumber of active trades = {sum_active_trades} ' \
                               f'\nactive trades starting bids sum = {sum_starting_bids}'
                    add_part2 = '\ncomplete try number = %s' % self.sbc_worker.complete_number
                    if self.fifa_account.console:
                        add_part2 += f'\nunlisted items : {sum_unlisted_items}' \
                                     f'\nconsole : {self.fifa_account.console.name}'
                    if self.fifa_account.use_special_squad:
                        dream_players = []
                        dream_not_special_players = []
                        active_squad = self.se.get(f'{fifa_23_address}/squad/active',
                                                   headers=self.main_dic['header'])
                        for active_squad_player in active_squad.json()['players']:
                            item_data = active_squad_player['itemData']
                            if (item_data.get('dream', False) and
                                    item_data['assetId'] in self.special_squad_players_build):
                                dream_players.append(item_data)
                            elif item_data.get('dream', False):
                                dream_not_special_players.append(item_data)
                        # new_print(self.fifa_account, 'dream players : ', dream_players)
                        # new_print(self.fifa_account, 'dream not special players : ', dream_not_special_players)
                        if len(dream_players):
                            add_part2 += f'\ndream players : {len(dream_players)}'
                            squad_played_count = self.fifa_account.fifaaccountsquadgame_set.all().count()
                            if squad_played_count < 100 or squad_played_count > 200:
                                add_part2 += '\n can play : True'
                            else:
                                add_part2 += '\n can play : False'
                        if len(dream_not_special_players):
                            add_part2 += f'\ndream not special players : {len(dream_not_special_players)}'
                        # squad_list = self.se.get(f'{fifa_23_address/squad/list',
                        #                          headers=self.main_dic['header']).json()
                        # add_part2 += f'\nactive squad id : {squad_list.get("activeSquadId", None)}'
                    new_print(self.fifa_account, text + add_part + add_part2)
                    self.send_message(bot, 123, text + add_part + add_part2,
                                      message_thread_id=ARZBAZI_REPORT_TOPIC_SBC_THREAD_MESSAGE_ID)
                    if self.running_platform in ['console', ]:
                        if self.cant_set_active_squad:
                            self.cant_set_active_squad = False
                            new_print(self.fifa_account, 'now can set active squad again')
                            time.sleep(20)
                            continue

                        # if self.can_get_help_for_discharge:
                        #     new_print(self.fifa_account, 'can_get_help_for_discharge is OK')
                        #     transfer = CloseWebAppTransfers.objects.filter(
                        #         error=False, for_inject=True, first_side_done=True, second_side_done=False,
                        #         first_account=self.fifa_account,
                        #         web_app_start_time__gt=timezone.localtime() - timedelta(minutes=30)
                        #     ).first()
                        #     if not transfer:
                        #         for trade in active_trades:
                        #             new_print(
                        #                 self.fifa_account, "trade['itemData']['assetId'] = ",
                        #                 trade['itemData']['assetId'],
                        #                 "trade['startingBid'] = ", trade['startingBid'],
                        #                 "trade['buyNowPrice'] = ", trade['buyNowPrice'],
                        #                 "trade['expires'] = ", trade['expires'],
                        #                 "trade['tradeId'] = ", trade['tradeId'])
                        #             if trade['expires'] < 3000:
                        #                 # time.sleep(1)
                        #                 # check_resp = self.check_trade(trade['tradeId'])
                        #                 # new_print(self.fifa_account,'check_resp.text = ', check_resp.text)
                        #                 # json_check_resp = check_resp.json()
                        #                 # if json_check_resp['auctionInfo'][0]['tradeState'] == 'active':
                        #                 expire_time = trade['expires']
                        #                 new_print(self.fifa_account,
                        #                           'player added to database for help ... expire time = ',
                        #                           expire_time)
                        #                 player_name = get_player_fifa_name_by_id(
                        #                     trade['itemData']['assetId'])
                        #                 if trade['startingBid'] * 3 < trade['buyNowPrice']:
                        #                     new_print(
                        #                         self.fifa_account,
                        #                         'player listed with min and max price. will not insert in database'
                        #                     )
                        #                     time.sleep(120)
                        #                     break
                        #                 max_mule = MuleAccounts.objects.order_by('-fifa_account__credit').first()
                        #                 new_print(self.fifa_account, 'max_mule.fifa_account.credit = ',
                        #                           max_mule.fifa_account.credit)
                        #                 if len(active_trades) > 3:
                        #                     new_print(self.fifa_account,
                        #                               'more than 2 players in active trades')
                        #                     time.sleep(120)
                        #                     break
                        #                 if trade['startingBid'] > (max_mule.fifa_account.credit - 15000):
                        #                     # if True:
                        #                     new_print(
                        #                         self.fifa_account,
                        #                         'player price is more that %s. will not insert in database' % (
                        #                                 max_mule.fifa_account.credit - 15000))
                        #                     time.sleep(120)
                        #                     break
                        #
                        #                 transfer_data = CloseWebAppTransfers.objects.create(
                        #                     player_name=player_name, player_rating=0,
                        #                     player_asset_id=trade['itemData']['assetId'],
                        #                     start_price=trade['startingBid'], buy_now_price=trade['buyNowPrice'],
                        #                     for_inject=True, first_account=self.fifa_account)
                        #
                        #                 transfer_data.put_for_sale_time = timezone.localtime() - timedelta(
                        #                     seconds=(3600 - expire_time))
                        #                 transfer_data.first_side_done = True
                        #                 transfer_data.need_to_care = True
                        #                 transfer_data.save()
                        #                 break
                        #                 # time.sleep(2)
                        #     else:
                        #         new_print(self.fifa_account, 'another transfer existed ...')
                        return 'all sbc completed'
                    #     if sum_active_trades < 100:
                    #         self.update_credit()
                    #         self.fifa_account.refresh_from_db()
                    #         self.sbc_worker.refresh_from_db()
                    #         if not self.sbc_worker.produced_coins:
                    #             self.sbc_worker.produced_coins = self.fifa_account.credit
                    #             self.sbc_worker.status = 'discharging ...'
                    #             set_main_log(self.sbc_worker, 'discharging ...')
                    #             self.sbc_worker.status_change_time = timezone.localtime()
                    #             self.sbc_worker.description = ''
                    #             self.sbc_worker.save()
                    #         credit = self.fifa_account.credit
                    #         if credit < 5100 and sum_active_trades == 0:
                    #             new_print(self.fifa_account, 'all task is done. need to delete club this club.')
                    #             if self.fifa_account.active:
                    #                 temp_sbc = SBCType.objects.get(sbc_number=36, must_done=3)
                    #                 completed_challenge = self.check_if_completed_sbc(temp_sbc.father_number,
                    #                                                                   temp_sbc.sbc_number,
                    #                                                                   0)
                    #                 if completed_challenge:
                    #                     set_sub_log(self.sbc_worker, 'delete club and create club')
                    #                     if self.public_moves.delete_club():
                    #                         self.public_moves.create_club()
                    #
                    #                     try:
                    #                         self.console_close_ultimate()
                    #                     except:
                    #                         pass
                    #
                    #             else:
                    #                 new_print(self.fifa_account, 'i think some think is wrong. wont delete club')
                    #             set_sub_log(self.sbc_worker, 'its done. putting on rest mode')
                    #             self.sbc_worker.is_done = 1
                    #             self.sbc_worker.end_time = timezone.localtime()
                    #             self.sbc_worker.save()
                    #             self.public_moves.put_on_rest_mode()
                    #             set_main_log(self.sbc_worker, 'done')
                    #             print('******************************* its done ********************************')
                    #             return 'its done'
                    #         sell_all = False
                    #         if credit < 20000 and sum_starting_bids < 10000:
                    #             sell_all = True
                    #         # self.discharge_coin(credit, sell_all=sell_all)
                    #         self.discharge_with_snipe(credit)
                    #         # if end:
                    #         #
                    #         # else:
                    #         #     time.sleep(30)
                    #         #     continue
                    #         if credit < 20000 and sum_active_trades > 0:
                    #             time.sleep(120)
                    #     else:
                    #         new_print(self.fifa_account, 'need to sleep for 10 minutes')
                    #         time.sleep(600)
                    #         continue
                    else:
                        if ((sum_starting_bids < 3000) or (sum_active_trades < 3 and sum_starting_bids < 6000)
                        ) or self.running_platform in ['console_web', 'console_web_pc']:
                            self.sbc_worker.is_done = 1
                            self.sbc_worker.save(update_fields=['is_done'])
                            if self.running_platform == 'console_web_pc':
                                return 'all sbc completed'
                        elif self.running_platform == 'console':
                            return 'all sbc completed'
                        self.handle_end_bot()
                        time.sleep(60)
                        return 'all sbc completed'

            except:
                try:
                    new_print(self.fifa_account, 'error 54 : ', traceback.format_exc())
                    # for conn in connections.all():
                    #     conn.close_if_unusable_or_obsolete()
                    # this equal to commented abow
                    close_old_connections()
                    self.sbc_worker.refresh_from_db()
                    if self.sbc_worker.must_done:
                        try:
                            new_print(self.fifa_account, 'sbc worker ', self.sbc_worker, ' must done_2')
                            if self.running_platform in ['console_web', 'console_web_pc']:
                                return 'must done'
                            self.handle_end_bot()
                        except:
                            new_print(self.fifa_account, 'error 53 : ', traceback.format_exc())
                        new_print(self.fifa_account, 'bot is done and must return something in main branch')
                        return 'its done'
                    get_sid_result = self.get_new_sid()
                    if self.running_platform in ['console_web', 'console_web_pc'] and get_sid_result == 'console login':
                        self.sbc_worker.error = True
                        self.sbc_worker.error_description = str(get_sid_result)
                        self.sbc_worker.save(update_fields=['error', 'error_description'])
                        return str(get_sid_result)
                except:
                    new_print(self.fifa_account, 'error 51 : ', traceback.format_exc())
                    while True:
                        try:
                            try:
                                self.main_dic['driver'].quit()
                                if os.name == 'nt':
                                    os.system("TASKKILL /F /IM chromedriver.exe")
                                self.sbc_worker.error = True
                                self.sbc_worker.error_description = 'unknown error'
                                self.sbc_worker.save(update_fields=['error', 'error_description'])
                            except:
                                pass
                            return 'need to rerun'
                        except:
                            new_print(self.fifa_account, 'error 52 : ', traceback.format_exc())
                            time.sleep(10)
                            close_old_connections()

    def check_active_unlisted_items(self):
        resp = get_trade_pile(self.fifa_account, self.se, self.main_dic, self.server_key)
        json_resp = resp.json()
        trades = json_resp['auctionInfo']
        sum_active_trades = 0
        sum_starting_bids = 0
        sum_unlisted_items = 0
        active_trades = []
        for trade in trades:
            if trade['tradeState'] == 'active':
                sum_active_trades += 1
                sum_starting_bids += trade['startingBid']
                if (trade['itemData']['itemType'] == 'player' and
                        self.running_platform in ['console', 'console_web', 'console_web_pc']):
                    resp = self.get_price_limit(trade['itemData']['id'])
                    js_resp = resp.json()
                    max_price = js_resp[0]['maxPrice']
                    # if str(trade['startingBid']) != str(min_price) and str(trade['buyNowPrice']) != max_price:
                    if str(trade['buyNowPrice']) != max_price:
                        active_trades.append(trade)
            else:
                sum_unlisted_items += 1
        return {'active_trades': active_trades, 'sum_active_trades': sum_active_trades,
                'sum_starting_bids': sum_starting_bids, 'sum_unlisted_items': sum_unlisted_items}

    def create_club_web_app(self, start_part_2=False):
        new_print(self.fifa_account, 'start create club')
        if not start_part_2:
            link = f'{fifa_23_address}/user/action/ONBOARDING_COUNTRY_1_SELECTED'
            result = force_post(link, {}, self.fifa_account, self.se, self.main_dic['header'])
            new_print(self.fifa_account, 'select country resp : ', result)
            new_print(self.fifa_account, self.main_dic['header'])
            time.sleep(1)
            historical_info_link = f'{fifa_23_address}/user/historical'
            historical_info = force_get(historical_info_link, self.fifa_account, self.se, self.main_dic['header'])
            historical_info_json = historical_info.json()
            clubAbbr = historical_info_json.get('clubAbbr')
            clubName = historical_info_json.get('clubName')
            time.sleep(1)
            user_info_link = f'{fifa_23_address}/user'
            user_info_data = {'clubAbbr': clubAbbr,
                              'clubName': clubName,
                              'purchased': True}
            user_info_result = force_post(user_info_link, json.dumps(user_info_data), self.fifa_account,
                                          self.se, self.main_dic['header'])
            # new_print(self.fifa_account, user_info_result.text)
            user_info_json = user_info_result.json()
            person_id = deep_get(user_info_json, 'login.personaId')
            squad_info_link = f'{fifa_23_address}/squad/0/user/{person_id}'
            new_print(self.fifa_account, f'squad info link {squad_info_link}')
            squad_info_result = force_get(squad_info_link, self.fifa_account, self.se, self.main_dic['header'])
            squad_info_json = squad_info_result.json()
            squad_players_info = squad_info_json.get('players')
        else:
            user_mass_info = force_get(
                f'{fifa_23_address}/usermassinfo', self.fifa_account, self.se, self.main_dic['header']).json()
            squad_info_json = user_mass_info.get('squad')
            squad_players_info = squad_info_json.get('players')
            time.sleep(2)
        loan_players_link = f'{fifa_23_address}/loan/players'
        loan_players_result = force_get(loan_players_link, self.fifa_account, self.se, self.main_dic['header'])
        time.sleep(2)
        loan_players_json = loan_players_result.json()
        loan_players_list = loan_players_json.get('loans')
        players_list = [squad_players_info[0]]
        loan_put_link = f'{fifa_23_address}/loan/player/{loan_players_list[0]["itemData"]["assetId"]}'
        new_print(self.fifa_account, f'loan put lin : {loan_put_link}')
        loan_put_json = self.se.put(loan_put_link).json()
        time.sleep(2)
        swaped_player_id = loan_put_json.get('id')
        swap_link = f'{fifa_23_address}/item'
        swap_data = {
            "itemData": [
                {
                    "id": swaped_player_id,
                    "pile": "club"
                }
            ]
        }
        new_print(self.fifa_account, f'swap data {swap_data}')
        swap_result = self.se.put(swap_link, swap_data)
        time.sleep(2)
        manager_club_id = squad_info_json.get('manager')[0].get('id')
        payload = {"id": 0, "squadName": "best squad", "chemistry": 99,
                   "manager": [{"id": manager_club_id, "dream": False}], "formation": "f343",
                   "players": [{"index": 0, "kitNumber": 1, "itemData": {"id": 0, "dream": False}},
                               {"index": 1, "kitNumber": 2, "itemData": {"id": 0, "dream": False}},
                               {"index": 2, "kitNumber": 3, "itemData": {"id": 0, "dream": False}},
                               {"index": 3, "kitNumber": 4, "itemData": {"id": 0, "dream": False}},
                               {"index": 4, "kitNumber": 5, "itemData": {"id": 0, "dream": False}},
                               {"index": 5, "kitNumber": 6, "itemData": {"id": 0, "dream": False}},
                               {"index": 6, "kitNumber": 7, "itemData": {"id": 0, "dream": False}},
                               {"index": 7, "kitNumber": 8, "itemData": {"id": 0, "dream": False}},
                               {"index": 8, "kitNumber": 11, "itemData": {"id": 0, "dream": False}},
                               {"index": 9, "kitNumber": 9, "itemData": {"id": 0, "dream": False}},
                               {"index": 10, "kitNumber": 22, "itemData": {"id": 0, "dream": False}},
                               {"index": 11, "kitNumber": 13, "itemData": {"id": 0, "dream": False}},
                               {"index": 12, "kitNumber": 14, "itemData": {"id": 0, "dream": False}},
                               {"index": 13, "kitNumber": 15, "itemData": {"id": 0, "dream": False}},
                               {"index": 14, "kitNumber": 16, "itemData": {"id": 0, "dream": False}},
                               {"index": 15, "kitNumber": 17, "itemData": {"id": 0, "dream": False}},
                               {"index": 16, "kitNumber": 18, "itemData": {"id": 0, "dream": False}},
                               {"index": 17, "kitNumber": 19, "itemData": {"id": 0, "dream": False}},
                               {"index": 18, "kitNumber": 20, "itemData": {"id": 0, "dream": False}},
                               {"index": 19, "kitNumber": 21, "itemData": {"id": 0, "dream": False}},
                               {"index": 20, "kitNumber": 12, "itemData": {"id": 0, "dream": False}},
                               {"index": 21, "kitNumber": 10, "itemData": {"id": 0, "dream": False}},
                               {"index": 22, "kitNumber": 0, "itemData": {"id": 0, "dream": False}}]}
        self.send_main_squad(payload, players_list)
        time.sleep(2)

        kits_link = f'{fifa_23_address}/onboarding/kits'
        kits_json = force_get(kits_link, self.fifa_account, self.se, self.main_dic['header']).json()
        time.sleep(2)
        max_home_kit = max(kits_json['homeItemDataList'], key=lambda x: x['rating'])
        max_away_kit = max(kits_json['awayItemDataList'], key=lambda x: x['rating'])
        new_print(self.fifa_account, f'max home kit {max_home_kit}')
        new_print(self.fifa_account, f'max away kit {max_away_kit}')
        send_kits_link = f'{fifa_23_address}/onboarding/kits'
        send_kits_data = {
            'awayKitId': max_away_kit['resourceId'],
            'homeKitId': max_home_kit['resourceId']
        }
        new_print(self.fifa_account, f'squad info link {send_kits_data}')
        force_post(send_kits_link, json.dumps(send_kits_data), self.fifa_account, self.se, self.main_dic['header'])
        time.sleep(2)

        badges_link = f'{fifa_23_address}/onboarding/badges'
        badges_json = force_get(badges_link, self.fifa_account, self.se, self.main_dic['header']).json()
        time.sleep(2)
        max_badge = max(badges_json['badgeItemDataList'], key=lambda x: x['rating'])
        new_print(self.fifa_account, f'max badge {max_badge}')
        send_badge_link = f'{fifa_23_address}/onboarding/badge/{max_badge["resourceId"]}'
        force_post(send_badge_link, {}, self.fifa_account, self.se, self.main_dic['header'])
        return 200

    def read_fut_web_live_msg(self):
        response = self.se.get(f'{fifa_23_address}/livemessage/template?screen=futweblivemsg')
        id_list = []
        for message_item in response.json().get('messageList'):
            id_list.append(message_item.get('messageId'))
        if id_list:
            new_print(self.fifa_account, 'read message list : ', id_list)
            read_result = self.se.put(f'{fifa_23_address}/livemessage?screen=futweblivemsg',
                                      json={'idList': [item for item in id_list]})

    def solve_with_ramin_captcha(self, api_key=None):
        if not api_key:
            api_key = 'ccbf62d7921a1c4b4f9cdc0fa18ece52'  # ramin api key
            # api_key = '51d6f1b562d03ccf8fe69ea7666f19f8' # futplus api key
        cookies = self.main_dic['driver'].get_cookies()
        nx_mpcid = ''
        for cookie in cookies:
            if str(cookie['name']) == '_nx_mpcid':
                nx_mpcid = str(cookie['value'])
        if not nx_mpcid:
            text = 'no nx_mpcid found for account %s' % self.username
            self.send_message(bot, 123, text)
            new_print(self.fifa_account, text)
            time.sleep(300)
            return 'no nx_mpcid'
        payload = {
            'fingerprint': '',
            'device': 'WEB',
            'userAgent': user_agent,
            'console': {'ps': 'PS', 'xboxs': 'XBOX', 'xbox360': 'XBOX'}.get(
                self.fifa_account.platform),
            'nx_mpcid': nx_mpcid,
            'sessionId': self.main_dic['driver'].execute_script(
                "return services.Authentication.utasSession.id"),
            'futEmail': self.username,
            'api_key': api_key,
            'nucleusId': self.main_dic['driver'].execute_script(
                "return services.User.getUser().id"),
            'user': 'simonhains',
            'pass': 'zmvLAS0193',
        }
        if self.main_dic['proxy_ip']:
            payload.update({
                'proxy_port': str(self.main_dic['proxy_port']),
                'proxy_ip': self.main_dic['proxy_ip'],
                'proxy_user': self.main_dic['proxy_user'],
                'proxy_pass': self.main_dic['proxy_pass'],
                'proxy_type': 'HTTP',
            })
        headers = {
            'content-type': "application/json"
        }
        new_print(self.fifa_account, 'before request data = ', payload)
        for nm in range(3):
            resp = requests.post('https://api.dmapi.co/fcapi/solve.php', json=payload,
                                 headers=headers)
            try:
                json_resp = resp.json()
                if json_resp['EA_VALIDATED'] == 1 and json_resp['FC_SOLVED'] == 1:
                    self.fifa_account.need_captcha = 0
                    self.fifa_account.save(update_fields=['need_captcha'])
                    self.fifa_account.refresh_from_db()

                    self.send_message(bot, -1001208022772,
                                      'captcha solved for %s' % self.username)
                    time.sleep(5)
                    self.main_dic['driver'].get(fifa_first_address)
                    wait_for_element('class', 'one', 'view-navbar-currency-coins',
                                     driver=self.main_dic['driver'])
                    refresh_count = 2
                    return 'captcha solved'
                    # break
                else:
                    new_print(self.fifa_account, 'cant solve captcha : ', json_resp, 'try again after 300 min')
                    time.sleep(300)
                    # text = 'cant solve captcha for %s' % self.username
                    # self.send_message(bot, 'critical', text)
                    # new_print(self.fifa_account, text)
                    # time.sleep(300)
                    # return 'can not solve captcha'
            except:
                new_print(self.fifa_account, 'error 45 : ', traceback.format_exc())
                text = 'cant solve captcha for %s' % self.username
                self.send_message(bot, 'critical', text)
                new_print(self.fifa_account, text)
                time.sleep(300)
                self.handle_end_bot()
                return 'solving captcha exception'
        text = 'cant solve captcha for %s' % self.username
        self.send_message(bot, 'critical', text)
        new_print(self.fifa_account, text)
        time.sleep(300)
        return 'can not solve captcha'

    def solve_with_anticaptcha(self):
        return 'can not solve captcha'
        # self.send_message(bot, 123, 'captcha need . automatic solve for %s' % self.username)
        # pageSource = self.main_dic['driver'].page_source
        # begin = pageSource.find('public_key') + len('public_key') + 4
        # if begin == -1 + len('public_key') + 4:
        #     self.send_message(bot, 123, 'wrong public key for %s' % self.username)
        #     return 'wrong public key'
        # end = pageSource.find("'", begin + 1)
        # public_key = pageSource[begin:end]
        # new_print(self.fifa_account, 'anticaptcha public_key = ', public_key)
        # if public_key.find(' ') != -1:
        #     self.send_message(bot, 123, 'wrong public key for %s' % self.username)
        #     self.fifa_account.refresh_from_db()
        #     self.fifa_account.need_captcha = False
        #     self.fifa_account.save()
        #     time.sleep(300)
        #     return 'wrong public key'
        # proxy = self.fifa_account.proxy
        # # todo: remove bellow after test 2018
        # console = self.fifa_account.console
        # if console and (
        #         console.name in list(range(0, 9000))
        #         # console.name in list(range(2000, 2018)) +
        #         #     list(range(5091, 5121)) + list(range(5067, 5079)) + list(range(5043, 5055)) +
        #         #     list(range(5211, 5223)) + list(range(5139, 5151)) + list(range(5163, 5175)) +
        #         #     list(range(5187, 5199)) +
        #         #     list(range(1, 7)) + list(range(13, 19)) + list(range(25, 31)) + list(range(36, 43)) +
        #         #     list(range(48, 55)) + list(range(66, 73)) + list(range(78, 85)) + list(range(90, 97)) +
        #         #     list(range(2051, 2058)) + list(range(2063, 2071))
        # ):
        #     proxy = None
        #
        # if not proxy:
        #     self.send_message(bot, 123, 'captcha solver no proxy %s' % self.username)
        #     self.fifa_account.refresh_from_db()
        #     self.fifa_account.need_captcha = False
        #     self.fifa_account.save()
        #     time.sleep(300)
        #     return 'no proxy'
        # new_print(self.fifa_account, 'anti captcha proxy data : ', proxy.ip_address, proxy.port, proxy.user_name,
        #           proxy.password)
        # solver = funcaptchaProxyon()
        # solver.set_verbose(1)
        # solver.set_key("34c7e8f74a556f4a88a41d161410e7c9")
        # solver.set_website_url(fifa_first_address)
        # solver.set_website_key(public_key)
        # solver.set_proxy_address(proxy.ip_address)
        # solver.set_proxy_port(proxy.port)
        # solver.set_proxy_login(proxy.user_name)
        # solver.set_proxy_password(proxy.password)
        # solver.set_user_agent(user_agent)
        #
        # for nm in range(3):
        #     self.sbc_worker.refresh_from_db()
        #     if self.sbc_worker.must_done or self.sbc_worker.has_error:
        #         try:
        #             new_print(self.fifa_account, 'sbc worker ', self.sbc_worker, ' must done_2')
        #             self.handle_end_bot()
        #         except:
        #             new_print(self.fifa_account, 'error 53 : ', traceback.format_exc())
        #         new_print(self.fifa_account, 'bot is done and must return something in main branch')
        #         return 'its done'
        #     try:
        #         token = solver.solve_and_return_solution()
        #         if token != 0:
        #             new_print(self.fifa_account, "funcaptcha result token: " + token)
        #             sp_token = (str(token).split('|'))[0]
        #             # payload = "{\"funCaptchaToken\":\"" + sp_token + "|r=eu-west-1|metabgclr=transparent|guitextcolor=%23606060|metaiconclr=%23606060|meta=6|lang=en|pk=A4EECF77-AC87-8C8D-5754-BF882F72063B|injs=https%3A%2F%2Fea-api.arkoselabs.com%2Fcdn%2Ffc%2Fassets%2Fgraphics%2Fea%2Fscript%2Fprivacy_policy_fifa_2.js|at=40|ht=1|cdn_url=https%3A%2F%2Fea-api.arkoselabs.com%2Fcdn%2Ffc|lurl=https%3A%2F%2Faudio-eu-west-1.arkoselabs.com|surl=https%3A%2F%2Fea-api.arkoselabs.com\"}"
        #             payload = {
        #                 'funCaptchaToken': f"{sp_token}|r=eu-west-1|meta=6|metabgclr=transparent|metaiconclr=%23606060|guitextcolor=%23606060|lang=en|pk=A4EECF77-AC87-8C8D-5754-BF882F72063B|at=40|cdn_url=https%3A%2F%2Fea-api.arkoselabs.com%2Fcdn%2Ffc|lurl=https%3A%2F%2Faudio-eu-west-1.arkoselabs.com|surl=https%3A%2F%2Fea-api.arkoselabs.com|smurl=https%3A%2F%2Fea-api.arkoselabs.com%2Fcdn%2Ffc%2Fassets%2Fstyle-manager"
        #             }
        #             url = f"{fifa_23_address}/captcha/fun/validate"
        #             new_print(self.fifa_account, 'payload = ', payload)
        #             # payload = "{\"funCaptchaToken\":\"%s\"}"%token
        #             self.main_dic['driver'].get(fifa_first_address)
        #             wait_for_element('xpath', 'one',
        #                              "//h2[contains(text(),'Verification Required')]",
        #                              driver=self.main_dic['driver'])
        #             headers = {
        #                 'accept-encoding': "gzip, deflate, br",
        #                 'accept-language': "en-US,en;q=0.5",
        #                 'origin': "https://www.ea.com",
        #                 'referer': "https://www.ea.com/",
        #                 'User-Agent': user_agent,
        #                 'x-ut-sid': self.main_dic['driver'].execute_script(
        #                     "return services.Authentication.sessionUtas.id"),
        #                 'accept': "*/*",
        #                 'content-type': "application/json",
        #                 'Host': fifa_host,
        #                 'cache-control': "no-cache"
        #             }
        #             new_print(self.fifa_account, 'funcaptcha payload = ', payload, ' , sid = ',
        #                       self.main_dic['driver'].execute_script("return services.Authentication.sessionUtas.id"))
        #             response = requests.request("POST", url, data=json.dumps(payload), headers=headers)
        #             new_print(self.fifa_account, 'anti captcha solve response : ', response, response.text)
        #             if response.status_code == 200:
        #                 self.fifa_account.refresh_from_db()
        #                 self.fifa_account.need_captcha = False
        #                 self.fifa_account.save()
        #                 self.send_message(bot, 123,
        #                                   'captcha solved with anticaptcha for %s' % self.username)
        #                 self.main_dic['driver'].get(fifa_first_address)
        #                 wait_for_element('class', 'one', 'view-navbar-currency-coins',
        #                                  driver=self.main_dic['driver'])
        #                 refresh_count = 2
        #                 return 'captcha solved'
        #                 break
        #             else:
        #                 time.sleep(100)
        #         else:
        #             new_print(self.fifa_account, "task finished with error " + solver.error_code)
        #             self.send_message(bot, 123,
        #                               f'error in captcha solver with anticaptcha for {self.username}:\n{solver.error_code}')
        #             time.sleep(600)
        #     except:
        #         new_print(self.fifa_account, 'error 45 : ', traceback.format_exc())
        #         text = 'cant solve captcha for %s' % self.username
        #         self.send_message(bot, 'critical', text)
        #         new_print(self.fifa_account, text)
        #         time.sleep(300)
        #         self.handle_end_bot()
        #         return 'solving captcha exception'
        #
        # text = 'cant solve captcha with anticaptcha for %s' % self.username
        # self.send_message(bot, 'critical', text)
        # new_print(self.fifa_account, text)
        # time.sleep(300)
        # return 'can not solve captcha'
