from django.contrib.auth.models import User as django_user
from django.db import models
# Create your models here.
from django.utils import timezone

from accounts.consts import FifaAccountPlatforms, FifaAccountLoginStatus, FIFA_PROXY_TYPE_NAME, DELETE_CONSOLE_REASON, \
    FIFA_ACCOUNT_WORK_ERROR_SOLVE_STATUS, TELEGRAM_MESSAGE_TYPE, CREATE_OUTLOOK_STATUS, CONSOLE_READING_ACCOUNTS_STATUS, \
    CONSOLE_USER_MODE, FIFA_ACCOUNT_DISABLE_MODE, TRADE_ACCESS
from accounts.managers import ConsoleManager, FifaAccountManager, MuleAccountsManager, ConsoleLastStatusManager
from trade.consts import ConsoleTradeOneQualityName


class FifaAccount(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    creator = models.ForeignKey(django_user, on_delete=models.PROTECT, null=True)
    # operator use
    user_name = models.CharField(max_length=255, verbose_name='User Name')
    password = models.CharField(max_length=255, verbose_name='Password')
    platform = models.CharField(max_length=100, choices=FifaAccountPlatforms, verbose_name='Platform')
    last_run_time = models.DateTimeField(default=timezone.now)
    need_captcha = models.BooleanField(default=False)
    credit = models.IntegerField(default=0)
    proxy = models.ForeignKey('accounts.FifaProxy', on_delete=models.SET_NULL, null=True, blank=True)
    # search_number = models.IntegerField(default=0)
    console = models.ForeignKey('accounts.Console', on_delete=models.SET_NULL, null=True, blank=True)
    pc = models.ForeignKey('accounts.PC', on_delete=models.SET_NULL, null=True, blank=True)
    name_in_console = models.CharField(max_length=255, null=True, blank=True)
    gamer_tag = models.CharField(max_length=100, null=True, blank=True)
    allowed_play_game = models.IntegerField(default=0)
    allowed_play_game_day = models.IntegerField(default=3)
    account_played_games = models.IntegerField(default=0)
    squad_special_game_one = models.BooleanField(default=False)
    squad_special_game_two = models.BooleanField(default=True)
    main_squad_rate = models.IntegerField(default=0)
    use_special_squad = models.BooleanField(default=False)
    special_squad_ready_to_play = models.BooleanField(default=False)

    trade_access = models.CharField(max_length=50, default='', null=True, blank=True, choices=TRADE_ACCESS)
    xbox_email = models.CharField(max_length=255, default='', null=True, blank=True)
    xbox_pass = models.CharField(max_length=50, default='', blank=True, null=True)
    console_user_mode = models.IntegerField(default=0, choices=CONSOLE_USER_MODE)  # using in report

    run_squad_battle = models.BooleanField(default=False)
    run_discharge = models.BooleanField(default=True)
    run_sbc = models.BooleanField(default=False)
    run_force_discharge = models.BooleanField(default=False)
    run_console_trade_one = models.BooleanField(default=False)
    run_console_invest_trade_one = models.BooleanField(default=False, null=True)
    console_trade_one_quality = models.CharField(max_length=255, choices=ConsoleTradeOneQualityName,
                                                 null=True, blank=True)
    console_trade_one_quality_new = models.CharField(
        max_length=255, choices=ConsoleTradeOneQualityName, null=True, blank=True)
    # allowed_trade_on_day = models.IntegerField(default=3)
    is_running_console_trade_one = models.BooleanField(default=False, null=True)
    stop_console_trade_one_for_other_bots = models.BooleanField(default=False, null=True)

    # this account has been disabled or somthing like this
    previous_console = models.ForeignKey('accounts.Console', on_delete=models.PROTECT, null=True, blank=True,
                                         related_name='previous_console_fifa_account')
    delete_console_reason = models.TextField(null=True, blank=True, choices=DELETE_CONSOLE_REASON)

    investor = models.ForeignKey(
        django_user,
        # choices=django_user.objects.filter(user_permissions__codename='is_investor'),
        on_delete=models.SET_NULL, null=True, blank=True, related_name='fifa_account_investor')
    operators = models.ManyToManyField(
        django_user,
        # choices=django_user.objects.filter(user_permissions__codename='is_operator'),
        blank=True, related_name='fifa_account_operators')
    stop_for_update_game = models.BooleanField(default=False, null=True)
    description = models.TextField(null=True, blank=True)
    # bot use
    active = models.BooleanField(default=False)
    use_request_login = models.BooleanField(default=True)
    token_type = models.TextField(null=True, blank=True)
    access_token = models.TextField(null=True, blank=True)
    sid = models.CharField(max_length=255, null=True, blank=True)
    nucleus_id = models.TextField(null=True, blank=True)
    persona_id = models.TextField(null=True, blank=True)
    driver = models.BooleanField(default=False)
    selenium_cookies = models.TextField(null=True, blank=True)
    requests_cookies = models.TextField(null=True, blank=True)
    login_status = models.IntegerField(default=0, choices=FifaAccountLoginStatus)
    # not used
    can_kill_by_mother = models.BooleanField(default=False)
    login_working = models.IntegerField(default=0)
    last_login_time = models.DateTimeField(default=timezone.now)
    server = models.ForeignKey('utils.ServerData', on_delete=models.SET_NULL, null=True, blank=True)
    last_search_update = models.DateTimeField(default=timezone.now)
    delete_club_number = models.IntegerField(default=0)
    delete_club_renewal = models.BooleanField(default=False)

    objects = FifaAccountManager()

    def __str__(self):
        return f'({self.id}) {self.user_name}'


class Console(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    name = models.IntegerField(default=0, verbose_name='Console Name', unique=True)
    is_active = models.BooleanField(default=True)
    allowed_play_game_day = models.IntegerField(default=35)
    investor = models.ForeignKey(django_user, on_delete=models.SET_NULL, null=True, blank=True)
    need_games_update = models.BooleanField(default=False)
    allowed_account_work_day = models.IntegerField(default=50)
    turn_off_after_work = models.BooleanField(default=False)
    pc_is_on = models.BooleanField(default=True)
    restart_pc_for_update = models.BooleanField(default=False)
    restart_console_for_update = models.BooleanField(default=False)
    key_fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.SET_NULL, null=True, blank=True,
                                         related_name='console_key_fifa_account')
    fifa_key_is_home = models.BooleanField(default=False)
    remove_accounts = models.BooleanField(default=False, null=True)  # remove null true
    add_accounts = models.BooleanField(default=False, null=True)  # remove null true
    check_accounts = models.BooleanField(default=False, null=True)  # remove null true
    stop_after_add_remove_accounts = models.BooleanField(default=False, null=True)  # remove null true

    electric_node = models.ForeignKey('accounts.ElectricNode', on_delete=models.PROTECT, null=True, blank=True)
    worker_pc = models.ForeignKey('accounts.PC', on_delete=models.SET_NULL, null=True, blank=True)

    objects = ConsoleManager()

    def __str__(self):
        return f'({self.id}) {self.name}'


class ConsoleLastStatus(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    console = models.ForeignKey('accounts.Console', on_delete=models.CASCADE)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.SET_NULL, null=True)
    sbc_worker = models.ForeignKey('sbc.SBCWorker', on_delete=models.SET_NULL, null=True)
    status = models.TextField(default='', null=True, blank=True)
    status_change_time = models.DateTimeField(default=timezone.now)
    description = models.TextField(null=True, blank=True, default='')
    description_editor = models.ForeignKey(django_user, on_delete=models.SET_NULL, null=True, blank=True)

    objects = ConsoleLastStatusManager()


class ConsoleLastStatusHistory(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    console = models.ForeignKey('accounts.Console', on_delete=models.CASCADE)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.SET_NULL, null=True)
    sbc_worker = models.ForeignKey('sbc.SBCWorker', on_delete=models.SET_NULL, null=True)
    status = models.TextField(default='', null=True, blank=True)
    status_change_time = models.DateTimeField(default=timezone.now)
    description = models.TextField(null=True, blank=True, default='')
    description_editor = models.ForeignKey(django_user, on_delete=models.SET_NULL, null=True, blank=True)


class ConsolePowerCommand(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    console = models.ForeignKey('accounts.Console', on_delete=models.SET_NULL, null=True)
    arduino_pc = models.ForeignKey('accounts.PC', on_delete=models.SET_NULL, null=True, blank=True)
    arduino_pc_usb = models.CharField(max_length=10, null=True, blank=True)
    arduino_port = models.PositiveSmallIntegerField(default=0)
    last_command = models.CharField(
        max_length=255, choices=[('turn_on', 'Turn On'), ('shutdown', 'ShutDown')], null=True, blank=True)
    command_status = models.CharField(
        max_length=255, choices=[('doing', 'Doing'), ('done', 'Done')], null=True, blank=True)
    update_time = models.DateTimeField(null=True)


class ConsoleWorkTime(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    console = models.ForeignKey('accounts.Console', on_delete=models.CASCADE)
    start_time = models.TimeField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)


class ConsoleWorkTimeLimitLog(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    console = models.ForeignKey('accounts.Console', on_delete=models.CASCADE)


class PC(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    name = models.CharField(max_length=255, verbose_name='PC Name')
    any_desk_code = models.CharField(max_length=255, verbose_name='any desk code', null=True, blank=True)
    any_desk_code_2 = models.CharField(max_length=255, verbose_name='any desk code 2', null=True, blank=True)
    location_code = models.CharField(max_length=10)
    ampere_code = models.IntegerField(default=0)

    def __str__(self):
        return f'({self.id}) {self.name}'


class PCPowerCommand(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    pc = models.ForeignKey('accounts.PC', on_delete=models.SET_NULL, null=True)
    last_command = models.CharField(
        max_length=255, choices=[('sleep', 'Sleep'), ('shutdown', 'Shutdown')], null=True, blank=True)
    command_status = models.CharField(
        max_length=255, choices=[('doing', 'Doing'), ('done', 'Done')], null=True, blank=True)
    update_time = models.DateTimeField(null=True)


class ElectricNode(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    name = models.CharField(max_length=255, null=True)
    pc = models.ForeignKey('accounts.PC', on_delete=models.SET_NULL, null=True)
    start_hour = models.IntegerField(default=0)
    end_hour = models.IntegerField(default=0)

    def __str__(self):
        return f'{self.name}'


class FifaAccountBackupCode(models.Model):
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, related_name='account_backup_code')
    backup_code = models.CharField(max_length=20, null=True, blank=True)
    app_code = models.CharField(max_length=20, null=True, blank=True)
    backup_codes_str = models.CharField(max_length=255, null=True, blank=True)


class FifaAccountSearch(models.Model):
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, related_name='account_search')
    search_time = models.DateTimeField(default=timezone.now)


# todo : use bellow for every request look like search count
class FifaAccountRequest(models.Model):
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, related_name='account_request', db_constraint=False)
    create_time = models.DateTimeField(default=timezone.now)
    link = models.TextField(null=True, blank=True)
    worker_side = models.CharField(max_length=255, null=True, blank=True)  # server or console

    class Meta:
        indexes = [
            models.Index(fields=['fifa_account', 'create_time']),
            models.Index(fields=['create_time']),
        ]


class HourlyFifaAccountRequestHistory(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    link = models.TextField(null=True, blank=True)
    request_count = models.IntegerField(default=0)


class FifaAccountLog(models.Model):
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, db_constraint=False)
    log_time = models.DateTimeField(default=timezone.now)
    description = models.TextField(null=True, blank=True)


class FifaProxy(models.Model):
    ip_address = models.CharField(max_length=20)
    port = models.CharField(max_length=10)
    user_name = models.CharField(max_length=255, null=True, blank=True)
    password = models.CharField(max_length=255, null=True, blank=True)
    server = models.ForeignKey('utils.ServerData', on_delete=models.SET_NULL, null=True, blank=True)
    type_name = models.CharField(max_length=255, default='', choices=FIFA_PROXY_TYPE_NAME, blank=True)

    def __str__(self):
        return f'({self.id}) {self.ip_address}'


class PlayerCard(models.Model):
    asset_id = models.IntegerField(default=0)
    resource_id = models.CharField(max_length=20, null=True, blank=True)
    futbin_resource_id = models.CharField(max_length=20, null=True, blank=True)
    rating = models.IntegerField(default=0)
    nation = models.IntegerField(default=0, null=True)  # todo : remove null=True
    league = models.IntegerField(default=0, null=True)  # todo : remove null=True
    team = models.IntegerField(default=0)
    rare = models.IntegerField(default=0)
    position = models.CharField(max_length=100, null=True, blank=True)
    alternate_positions = models.CharField(max_length=100, null=True, blank=True)
    price = models.IntegerField(default=0)
    discard_value = models.IntegerField(default=0, null=True)  # todo : remove null=True
    update_time = models.DateTimeField(default=timezone.now)
    name = models.TextField(null=True, blank=True)
    unicode_name = models.TextField(null=True, blank=True)
    team_name = models.TextField(null=True, blank=True)
    nation_name = models.CharField(max_length=100, null=True, blank=True)
    special_name = models.TextField(null=True, blank=True)
    use_on_trade = models.BooleanField(default=False)
    trade_is_working = models.BooleanField(default=False)
    trade_last_bid_time = models.DateTimeField(default=timezone.now)

    def __str__(self):
        name_or_special = f'{self.name}' or f'{self.special_name}'
        if self.name or self.special_name:
            return f'({self.id}) {self.asset_id} {name_or_special}'
        else:
            return f'({self.id}) {self.asset_id}'


class ChangePositionCard(models.Model):
    source = models.CharField(max_length=20)
    destination = models.CharField(max_length=20)
    price = models.IntegerField(default=0)


class CloseWebAppTransfers(models.Model):
    create_time = models.DateTimeField(default=timezone.now, null=True) # remove null true
    player_name = models.TextField(null=True, blank=True)
    player_rating = models.IntegerField(default=0)
    player_asset_id = models.IntegerField(default=0)
    player_rare = models.IntegerField(default=0)
    start_price = models.IntegerField(default=0)
    buy_now_price = models.IntegerField(default=0)
    web_list_start_price = models.IntegerField(default=0)
    web_list_buy_now_price = models.IntegerField(default=0)
    put_for_sale_time = models.DateTimeField(default=timezone.now, null=True, blank=True)
    for_inject = models.BooleanField(default=False)
    for_discharge = models.BooleanField(default=False)
    error = models.BooleanField(default=False)
    error_description = models.TextField(null=True, blank=True)
    first_side_done = models.BooleanField(default=False)
    second_side_done = models.BooleanField(default=False)
    first_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True,
                                      related_name='first_account')
    second_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True,
                                       related_name='second_account')
    web_app_is_on_it = models.BooleanField(default=False)
    web_app_start_time = models.DateTimeField(default=timezone.now, null=True, blank=True)
    player_min_price = models.IntegerField(default=0)
    player_max_price = models.IntegerField(default=0)
    need_to_care = models.BooleanField(default=False)


class ConsoleSpecialNames(models.Model):
    create_time = models.DateTimeField(default=timezone.now, null=True) # remove null true
    player_name = models.TextField(null=True, blank=True)
    player_rating = models.IntegerField(default=0)
    edited_name = models.TextField(null=True, blank=True)
    compare_name = models.TextField(null=True, blank=True)
    regex_name = models.TextField(null=True, blank=True)
    last_fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True,
                                          related_name='last_acc')
    last_time = models.DateTimeField(default=timezone.now, null=True, blank=True)


class MuleAccounts(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    creator = models.ForeignKey(django_user, on_delete=models.CASCADE, related_name='muleaccount_creator', null=True)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE)
    last_used = models.DateTimeField(default=timezone.now)
    error = models.BooleanField(default=False)
    error_description = models.TextField(null=True, blank=True)
    in_use = models.BooleanField(default=False)
    last_sid = models.TextField(null=True, blank=True)
    last_nucleus = models.TextField(null=True, blank=True)
    last_persona = models.TextField(null=True, blank=True)
    investors = models.ManyToManyField(django_user)
    deleted = models.BooleanField(default=False)

    objects = MuleAccountsManager()


class ProgramVersion(models.Model):
    number = models.IntegerField(default=0)
    need_to_put_on_rest_mode = models.BooleanField(default=False)
    need_to_close_python_program = models.BooleanField(default=False)
    need_to_open_python_program = models.BooleanField(default=False)
    need_to_reset_gamepad = models.BooleanField(default=False)


class CloseWebAppSnipes(models.Model):
    player_name = models.TextField(null=True, blank=True)
    player_rating = models.IntegerField(default=0)
    player_asset_id = models.IntegerField(default=0)
    player_rarity_ids = models.IntegerField(default=0, null=True)
    player_price = models.IntegerField(default=0)
    player_min_price_from_futbin = models.IntegerField(default=0)
    first_side_ready = models.BooleanField(default=False)
    second_side_ready = models.BooleanField(default=False)
    error = models.BooleanField(default=False)
    error_desc = models.TextField(null=True, blank=True)
    web_app_is_on_it = models.BooleanField(default=False)
    first_side_done = models.BooleanField(default=False)
    second_side_done = models.BooleanField(default=False)
    winner_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True,
                                       related_name='winner_account')
    all_accounts_ids = models.CharField(max_length=255, null=True, blank=True)
    first_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True,
                                      related_name='main_account')
    insert_time = models.DateTimeField(default=timezone.now, null=True, blank=True)
    second_side_ready_time = models.DateTimeField(default=timezone.now, null=True, blank=True)
    second_side_found_target = models.BooleanField(default=False)
    winner_account_data = models.TextField(null=True, blank=True)


class StartCloseWebAppSnipes(models.Model):
    create_time = models.DateTimeField(auto_now_add=True)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    end_time = models.DateTimeField(null=True, blank=True)


class AccountSalablePlayerCard(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    player_card = models.ForeignKey(PlayerCard, on_delete=models.CASCADE)
    buy_start_price = models.IntegerField(default=0)
    buy_now_price = models.IntegerField(default=0)


class VerifiedIp(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    ip_address = models.CharField(max_length=255)


class SniperPlayerCard(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    player_card = models.ForeignKey(PlayerCard, on_delete=models.CASCADE)
    min_price = models.IntegerField(default=0)
    buy_now_price = models.IntegerField(default=0)
    use_console_discharge = models.BooleanField(default=False)


class ItemPack(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    pack_id = models.IntegerField(default=0)
    open_price = models.IntegerField(default=0)
    pack_value = models.IntegerField(default=0)


class FifaAccountDisable(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    console = models.ForeignKey(Console, on_delete=models.SET_NULL, null=True, blank=True)
    last_run_time = models.DateTimeField(null=True, blank=True)
    disable_mode = models.IntegerField(default=0, choices=FIFA_ACCOUNT_DISABLE_MODE)


class FifaAccountSuspend(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    console = models.ForeignKey(Console, on_delete=models.SET_NULL, null=True, blank=True)
    last_run_time = models.DateTimeField(null=True, blank=True)


#
class InvestorOperators(models.Model):
    investor = models.OneToOneField(
        django_user,
        # choices=django_user.objects.filter(user_permissions__codename='is_investor'),
        on_delete=models.CASCADE, related_name='investor_operator_user')
    operators = models.ManyToManyField(
        django_user,
        # choices=django_user.objects.filter(user_permissions__codename='is_operator'),
        related_name='investor_operator_operators')


class FifaAccountCreditLog(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    current_credit = models.IntegerField(default=0)
    today_discharges = models.ManyToManyField('accounts.CloseWebAppSnipes')
    today_discharges_coin = models.IntegerField(default=0)
    today_discharges_mode2 = models.ManyToManyField('sniper.DischargeMode2', related_name='credit_log_discharge_mode2')
    today_discharges_mode2_coin = models.IntegerField(default=0)
    today_discharges_mode3 = models.ManyToManyField('accounts.CloseWebAppTransfers', related_name='credit_log_discharge_mode3')
    today_discharges_mode3_coin = models.IntegerField(default=0)
    today_production = models.IntegerField(default=0)
    today_console_trades_history = models.ManyToManyField('trade.ConsoleTradeOneHistory')  # console_trade is trade mode
    today_console_trades_profit = models.IntegerField(default=0)  # console_trade is trade mode
    today_console_trade_salary = models.IntegerField(default=0)
    items_forcast = models.IntegerField(default=0)
    invest_trade_generation = models.IntegerField(default=0)
    save_credit_try = models.IntegerField(default=0)


class CaptchaSolverLog(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    solve_status = models.CharField(max_length=255, null=True, blank=True)
    captcha_solver_name = models.CharField(max_length=255, null=True, blank=True)


class ConsoleBotSetting(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    creator = models.ForeignKey(django_user, on_delete=models.CASCADE, null=True, blank=True)
    name = models.CharField(max_length=255)
    str_value = models.CharField(max_length=255, default=None, null=True, blank=True)
    int_value = models.IntegerField(default=None, null=True, blank=True)
    update_time = models.DateTimeField(default=timezone.now, null=True) # remove null true


# it's temporary and remove every round sbc solver work
# unopened packs data goes here
class AccountPackData(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    pack_id = models.IntegerField(default=0)
    pack_type = models.CharField(max_length=255, null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    coins = models.IntegerField(default=0)
    untradeable = models.BooleanField(default=True)


class ObjectiveSeasonProgressSpecialOption(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    title = models.TextField()
    xp_threshold = models.IntegerField(default=0)
    option_id = models.IntegerField(default=0)


class FifaAccountCurrentItems(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.OneToOneField(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    update_time = models.DateTimeField(default=timezone.now)
    unassigned_item_count = models.IntegerField(default=0)
    transfer_list_items_count = models.IntegerField(default=0)
    transfer_list_duplicate_items_count = models.IntegerField(default=0)
    sbc_storage_count = models.IntegerField(default=0)
    club_bronze0_tradable_items = models.IntegerField(default=0)
    club_bronze1_tradable_items = models.IntegerField(default=0)
    club_silver0_tradable_items = models.IntegerField(default=0)
    club_silver1_tradable_items = models.IntegerField(default=0)
    club_gold0_tradable_items = models.IntegerField(default=0)
    club_gold1_tradable_items = models.IntegerField(default=0)
    club_gold1_special_tradable_items = models.IntegerField(default=0)
    club_bronze0_untradable_items = models.IntegerField(default=0)
    club_bronze1_untradable_items = models.IntegerField(default=0)
    club_silver0_untradable_items = models.IntegerField(default=0)
    club_silver1_untradable_items = models.IntegerField(default=0)
    club_gold0_untradable_items = models.IntegerField(default=0)
    club_gold1_untradable_items = models.IntegerField(default=0)
    club_gold1_special_untradable_items = models.IntegerField(default=0)
    rating_80_items = models.IntegerField(default=0)
    rating_81_items = models.IntegerField(default=0)
    rating_82_items = models.IntegerField(default=0)
    rating_83_items = models.IntegerField(default=0)
    rating_84_items = models.IntegerField(default=0)
    rating_85_items = models.IntegerField(default=0)
    rating_86_items = models.IntegerField(default=0)
    rating_87_items = models.IntegerField(default=0)
    rating_88_items = models.IntegerField(default=0)
    rating_89_items = models.IntegerField(default=0)
    rating_90_items = models.IntegerField(default=0)
    rating_91_items = models.IntegerField(default=0)
    rating_92_items = models.IntegerField(default=0)
    rating_93_items = models.IntegerField(default=0)
    rating_94_items = models.IntegerField(default=0)
    rating_95_items = models.IntegerField(default=0)
    rating_96_items = models.IntegerField(default=0)
    rating_97_items = models.IntegerField(default=0)
    rating_98_items = models.IntegerField(default=0)
    rating_99_items = models.IntegerField(default=0)
    rating_100_items = models.IntegerField(default=0)


class FifaAccountInformation(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.OneToOneField(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
    last_ip_address = models.CharField(max_length=100, null=True, blank=True)


# class FifaAccountSupplementaryData(models.Model):
#     create_time = models.DateTimeField(default=timezone.now)
#     fifa_account = models.OneToOneField(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
#     establishment_state = models.IntegerField(default=0, choices=ESTABLISHMENT_STATE)
#     support_email = models.CharField(max_length=255, default='')
#     support_password = models.CharField(max_length=255, default='')
#     support_imap = models.CharField(max_length=255, default='')
#     support_phone_number = models.CharField(max_length=255, default='')
#     last_health_status = models.TextField(null=True, blank=True, choices=DELETE_CONSOLE_REASON)


class NewOutlookAccount(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    user_name = models.CharField(max_length=255)
    password = models.CharField(max_length=50)
    create_outlook = models.BooleanField(default=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField(null=True, blank=True)
    region = models.CharField(max_length=50, null=True, blank=True)
    proxy = models.ForeignKey(FifaProxy, on_delete=models.SET_NULL, null=True, blank=True)
    support_email = models.CharField(max_length=255, default='', null=True, blank=True)
    support_password = models.CharField(max_length=50, default='', null=True, blank=True)
    support_imap_host = models.CharField(max_length=50, default='', null=True, blank=True)
    outlook_created = models.BooleanField(default=False)
    support_created = models.BooleanField(default=False)
    create_origin = models.BooleanField(default=False)
    origin_user_name = models.CharField(max_length=50, null=True, blank=True)
    origin_app_code = models.CharField(max_length=50, null=True, blank=True)
    origin_created = models.BooleanField(default=False)
    console = models.ForeignKey('accounts.Console', on_delete=models.SET_NULL, null=True, blank=True)
    pc = models.ForeignKey('accounts.PC', on_delete=models.SET_NULL, null=True, blank=True)
    start_signup_time = models.DateTimeField(default=None, null=True, blank=True)
    signup_status = models.CharField(max_length=50, null=True, blank=True)
    signup_error = models.TextField(default=None, null=True, blank=True)
    gamer_tag = models.CharField(max_length=255, null=True, blank=True)
    gamer_tag_created = models.BooleanField(default=False)
    create_ip = models.CharField(max_length=50, null=True, blank=True)
    browser = models.CharField(max_length=50, null=True, blank=True,
                               choices=(('chrome', 'chrome'), ('firefox', 'firefox'), ('opera', 'opera'),
                                        ('edge', 'edge'), ('tor_windows', 'tor windows')))
    need_proxy = models.BooleanField(default=False)
    dont_check_ip = models.BooleanField(default=False, null=True)
    last_create_status = models.CharField(max_length=50, null=True, blank=True, choices=CREATE_OUTLOOK_STATUS)
    # outlook_captcha_count = models.IntegerField(default=0)
    # outlook_captcha_difficulty = models.IntegerField(default=0, choices=((0, 'easy'), (1, 'medium'), (2, 'hard')))
    # ea_captcha_count = models.IntegerField(default=0)


class OutlookCreateWorker(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    outlook_account = models.ForeignKey('accounts.NewOutlookAccount', on_delete=models.CASCADE)
    is_done = models.BooleanField(default=False)
    last_run_time = models.DateTimeField(default=timezone.now)
    has_error = models.BooleanField(default=False)
    error_description = models.TextField(null=True, blank=True)
    end_time = models.DateTimeField(default=timezone.now)
    status = models.TextField(null=True, blank=True, default='')
    status_change_time = models.DateTimeField(default=timezone.now)


class OutlookCreateProcess(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    outlook_account = models.ForeignKey('accounts.NewOutlookAccount', on_delete=models.CASCADE)
    is_done = models.BooleanField(default=False)
    start_time = models.DateTimeField(default=timezone.now)
    status = models.CharField(max_length=255, null=True, blank=True)


class NewConsoleAccount(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    user_name = models.CharField(max_length=255)
    password = models.CharField(max_length=50)
    gamer_tag = models.CharField(max_length=255, null=True, blank=True)
    support_email = models.CharField(max_length=255, default='')
    support_password = models.CharField(max_length=50, default='')
    support_imap_host = models.CharField(max_length=50, default='')
    console = models.ForeignKey('accounts.Console', on_delete=models.SET_NULL, null=True, blank=True)
    add_start_time = models.DateTimeField(default=None, null=True, blank=True)
    add_status = models.CharField(max_length=50, null=True, blank=True)
    add_error = models.TextField(default=None, null=True, blank=True)


class FifaAccountWorkError(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.SET_NULL, null=True, blank=True)
    error_text = models.TextField()
    solve_status = models.CharField(max_length=255, null=True, blank=True, choices=FIFA_ACCOUNT_WORK_ERROR_SOLVE_STATUS)
    solve_time = models.DateTimeField(null=True, blank=True)
    solve_user = models.ForeignKey(django_user, on_delete=models.SET_NULL, null=True, blank=True)


class TelegramMessage(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.SET_NULL, null=True, blank=True)
    message_type = models.CharField(max_length=50, null=True, blank=True, choices=TELEGRAM_MESSAGE_TYPE)
    text = models.TextField(null=True, blank=True)


class AccountBoughtItem(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.CASCADE, null=True, blank=True)
    buy_price = models.IntegerField(default=0)
    item_type = models.CharField(max_length=50, null=True, blank=True)
    requested_worker = models.CharField(max_length=50, null=True, blank=True)
    sbc_number = models.IntegerField(default=0, null=True)


class AccountSoldItem(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.CASCADE, null=True, blank=True)
    item_type = models.CharField(max_length=50, null=True, blank=True)
    requested_worker = models.CharField(max_length=50, null=True, blank=True)
    item_id = models.BigIntegerField(default=0)
    buy_price = models.IntegerField(default=0)
    sell_price = models.IntegerField(default=0)
    rating = models.IntegerField(default=0)
    rare = models.IntegerField(default=0)
    asset_id = models.IntegerField(default=0)
    is_sold = models.BooleanField(default=False)
    sale_time = models.DateTimeField(null=True, blank=True)
    discard_value = models.IntegerField(default=0)
    is_quick_sell = models.BooleanField(default=False)


class AccountLoginLog(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.CASCADE, null=True, blank=True)
    login_method = models.IntegerField(
        default=0, choices=[(0, 'Unknown'), (1, 'Requests'), (2, 'Selenium'), (3, 'Access Token')])
    login_status = models.IntegerField(default=0, choices=[(0, 'failed'), (1, 'success')])


class HourlyAccountLoginLogHistory(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    login_with_requests_count = models.IntegerField(default=0)
    success_login_with_requests_count = models.IntegerField(default=0)
    login_with_selenium_count = models.IntegerField(default=0)
    success_login_with_selenium_count = models.IntegerField(default=0)
    get_new_access_token_count = models.IntegerField(default=0)
    success_get_new_access_token_count = models.IntegerField(default=0)


class HourlyFifaAccountCreditLogHistory(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    current_credit = models.BigIntegerField(default=0)
    today_discharges_coin = models.BigIntegerField(default=0)
    today_discharges_mode2_coin = models.BigIntegerField(default=0)
    today_discharges_mode3_coin = models.BigIntegerField(default=0)
    today_production = models.BigIntegerField(default=0)
    today_console_trades_profit = models.BigIntegerField(default=0)  # console_trade is trade mode
    today_console_trade_salary = models.BigIntegerField(default=0)
    items_forcast = models.BigIntegerField(default=0)
    invest_trade_generation = models.BigIntegerField(default=0)


class ConsoleReadingAccounts(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    console = models.ForeignKey('accounts.Console', on_delete=models.CASCADE, null=True, blank=True)
    status_code = models.IntegerField(default=0, choices=CONSOLE_READING_ACCOUNTS_STATUS)
    description = models.TextField(null=True, blank=True)


class ArduinoPort(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    board_name = models.CharField(max_length=10, null=True, blank=True)
    port_name = models.CharField(max_length=10, null=True, blank=True)
    pin_name = models.CharField(max_length=10, null=True, blank=True)
    current_state = models.IntegerField(default=0, choices=((0, 'OFF'), (1, 'ON')))
    electric_node = models.ForeignKey('accounts.ElectricNode', on_delete=models.SET_NULL, null=True, blank=True)
    auto_update = models.BooleanField(default=True)
    last_get_state_time = models.DateTimeField(default=timezone.now)
