from django.contrib.auth.models import User as django_user
from django.db import models
from django.utils import timezone

# Create your models here.
from accounts.models import FifaAccount, PlayerCard
from sbc.consts import SBC_TARGET_RARITIES, SBC_TARGET_POSITION, SBC_TARGET_CHEMISTRY, SBC_TARGET_LEVEL, \
    SBC_TARGET_NATIONS, SBC_TARGET_LEAGUES, SBC_TARGET_CLUBS
from trade.consts import TradeOrderStatus, TradeLogStatus, ConsoleTradeOneQualityName, WEB_TRADE_CONSUMABLE_QUALITY
from trade.managers import TradeOrderManager, TradeWorkerManager


class TradeOrder(models.Model):
    creator = models.ForeignKey(django_user, on_delete=models.PROTECT, null=True)
    create_time = models.DateTimeField(default=timezone.now)
    file_name = models.CharField(max_length=255, verbose_name='File_name')
    status = models.CharField(max_length=100, choices=TradeOrderStatus, verbose_name='Status')

    objects = TradeOrderManager()

    def __str__(self):
        return f'({self.id}) {self.file_name}'


class TradeWorker(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    trade_order = models.ForeignKey(TradeOrder, on_delete=models.CASCADE)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.PROTECT)
    # receiver = models.IntegerField(default=0)
    # transfer_to = models.IntegerField(default=0)
    # transfer_amount = models.IntegerField(default=0)
    # coins_before = models.IntegerField(default=0)
    # coins_after = models.IntegerField(default=0)
    # coins_taken = models.IntegerField(default=0)
    # need_proof = models.IntegerField(default=0)
    running_platform = models.TextField(null=True, blank=True, default='web')
    last_run_time = models.DateTimeField(default=timezone.now)
    is_done = models.IntegerField(default=0)
    has_error = models.IntegerField(default=0)
    error_description = models.TextField(null=True, blank=True)
    task_id = models.CharField(max_length=500, null=True)
    status = models.TextField(null=True, blank=True, default='')
    start_coin = models.IntegerField(default=0)
    last_update_coin = models.IntegerField(default=0)

    objects = TradeWorkerManager()

    def __str__(self):
        return f'order({self.id}) {self.fifa_account.user_name}'


class SinglePlayerTradeOrder(models.Model):
    creator = models.ForeignKey(django_user, on_delete=models.PROTECT, null=True)
    create_time = models.DateTimeField(default=timezone.now)
    file_name = models.CharField(max_length=255, verbose_name='File_name')
    status = models.CharField(max_length=100, choices=TradeOrderStatus, verbose_name='Status')

    objects = TradeOrderManager()

    def __str__(self):
        return f'({self.id}) {self.file_name}'


class SinglePlayerTradeWorker(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    trade_order = models.ForeignKey(SinglePlayerTradeOrder, on_delete=models.CASCADE, null=True, blank=True)
    player_card = models.ForeignKey(PlayerCard, on_delete=models.CASCADE, null=True, blank=True)
    unused_fifa_accounts = models.ManyToManyField(
        FifaAccount, related_name='single_player_trade_unused_fifa_accounts', blank=True)
    used_fifa_accounts = models.ManyToManyField(
        FifaAccount, related_name='single_player_trade_used_fifa_accounts', blank=True)
    running_platform = models.TextField(null=True, blank=True, default='web')
    last_run_time = models.DateTimeField(default=timezone.now)
    is_done = models.IntegerField(default=0)
    has_error = models.IntegerField(default=0)
    error_description = models.TextField(null=True, blank=True)
    task_id = models.CharField(max_length=500, null=True, blank=True)
    status = models.TextField(null=True, blank=True, default='')
    start_coin = models.IntegerField(default=0)
    last_update_coin = models.IntegerField(default=0)
    max_bid_price = models.IntegerField(default=0)
    sell_start_price = models.IntegerField(default=0)
    start_sell_now_price = models.IntegerField(default=0)
    end_sell_now_price = models.IntegerField(default=0)

    objects = TradeWorkerManager()

    def __str__(self):
        return f'order({self.id}) {self.player_card.asset_id}'


class TradeLog(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    # todo : fix below workers with Generic relations .
    trade_worker = models.ForeignKey(TradeWorker, on_delete=models.CASCADE, null=True, blank=True)
    single_player_trade_worker = models.ForeignKey(
        SinglePlayerTradeWorker, on_delete=models.CASCADE, null=True, blank=True)

    player_card = models.ForeignKey(PlayerCard, on_delete=models.SET_NULL, null=True)
    bid_price = models.IntegerField(default=0)
    bid_success = models.IntegerField(default=0)
    sell_price = models.IntegerField(default=0)
    sell_time = models.DateTimeField(null=True)

    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.SET_NULL, null=True)
    trade_id = models.CharField(max_length=50, null=True)
    start_price = models.IntegerField(default=0)
    buy_now_price = models.IntegerField(default=0)
    expires = models.DateTimeField(default=timezone.now)
    status = models.IntegerField(default=0, choices=TradeLogStatus)

    def __str__(self):
        return f'order({self.id}) {self.player_card}'


class ConsoleTradeOneQuality(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=255, choices=ConsoleTradeOneQualityName, null=True)
    bid_price = models.IntegerField(default=0)
    sell_price = models.IntegerField(default=0)
    auto_next_create = models.BooleanField(default=True)
    dynamic_upper_price = models.IntegerField(default=False)
    invest_bid_low_price = models.IntegerField(default=0)
    invest_sell_low_price = models.IntegerField(default=0)
    invest_bid_high_price = models.IntegerField(default=0)
    bid_items = models.BooleanField(default=True)
    sell_items = models.BooleanField(default=True)
    invest_lowest_credit = models.IntegerField(default=0)
    invest_highest_stock = models.IntegerField(default=300)

    def __str__(self):
        return f'{self.name}'


class ConsoleTradeOneCard(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True)
    bid_price = models.IntegerField(default=0)
    sell_price = models.IntegerField(default=0)
    deleted = models.BooleanField(default=False)
    quality = models.ForeignKey('trade.ConsoleTradeOneQuality', on_delete=models.SET_NULL, null=True)
    list_try_count = models.IntegerField(default=0)


class ConsoleTradeOneLog(models.Model):
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE)
    create_time = models.DateTimeField(default=timezone.now)
    description = models.TextField(null=True, blank=True)


class ConsoleTradeOneHistory(models.Model):
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE)
    create_time = models.DateTimeField(default=timezone.now)
    update_time = models.DateTimeField(null=True, blank=True)
    end_time = models.DateTimeField(null=True, blank=True)
    move_items_from_unassigned = models.DateTimeField(null=True, blank=True)
    quality_name = models.CharField(max_length=255, choices=ConsoleTradeOneQualityName, null=True)
    # console_trade_one_filter = models.ForeignKey(
    #     'trade.ConsoleTradeOneFilter', on_delete=models.SET_NULL, null=True, blank=True)
    bid_price = models.IntegerField(default=0)
    sell_price = models.IntegerField(default=0)
    bid_count = models.IntegerField(default=0)
    win_count = models.IntegerField(default=0)
    credit_before = models.IntegerField(default=0)
    credit_after = models.IntegerField(default=0)
    current_credit = models.IntegerField(default=0)
    current_sell_price = models.IntegerField(default=0)
    unassigned_item_count = models.IntegerField(default=0)
    unassigned_full_need_sell_counter = models.IntegerField(default=0)
    transfer_list_items_count = models.IntegerField(default=0)
    transfer_list_duplicate_items_count = models.IntegerField(default=0)
    sold_items_count = models.IntegerField(default=0)
    club_bronze1_items = models.IntegerField(default=0)
    club_silver1_items = models.IntegerField(default=0)
    club_silver0_items = models.IntegerField(default=0)
    club_gold0_items = models.IntegerField(default=0)
    club_gold1_items = models.IntegerField(default=0)
    club_position_modifier_items = models.IntegerField(default=0)
    list_try_count = models.IntegerField(default=0)
    change_quality_list_try_count = models.IntegerField(default=0)
    bought_items_managed = models.BooleanField(default=False)  # this field added just for sure items managed


class ConsoleTradeInvestDailyProfitLog(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True)
    current_credit = models.IntegerField(default=0)
    today_forcast = models.IntegerField(default=0)
    current_trade_history = models.ForeignKey(ConsoleTradeOneHistory, null=True, blank=True, on_delete=models.SET_NULL)
    current_trade_history_win_count = models.IntegerField(default=0)
    today_sell_count = models.IntegerField(default=0)
    credit_change = models.IntegerField(default=0)
    forcast_change = models.IntegerField(default=0)
    quality_name = models.CharField(max_length=255, null=True, blank=True)


class ConsoleInvestTradeItemsCountLog(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True)
    club_bronze1_items = models.IntegerField(default=0)
    club_silver0_items = models.IntegerField(default=0)
    club_silver1_items = models.IntegerField(default=0)
    club_gold0_items = models.IntegerField(default=0)
    club_gold1_items = models.IntegerField(default=0)
    club_position_modifier_items = models.IntegerField(default=0)
    added_club_bronze1_items = models.IntegerField(default=0)
    added_club_silver0_items = models.IntegerField(default=0)
    added_club_silver1_items = models.IntegerField(default=0)
    added_club_gold0_items = models.IntegerField(default=0)
    added_club_gold1_items = models.IntegerField(default=0)
    added_club_position_modifier_items = models.IntegerField(default=0)
    sold_items = models.IntegerField(default=0)
    added_sold_items = models.IntegerField(default=0)
    win_items = models.IntegerField(default=0)
    added_win_items = models.IntegerField(default=0)
    complete_trade_count = models.IntegerField(default=0)
    complete_trade_count_new = models.IntegerField(default=0)


# # todo : use this
# class ConsoleTradeOneFilter(models.Model):
#     create_time = models.DateTimeField(default=timezone.now)
#     # player_name = models.
#     level = models.CharField(max_length=20, choices=SBC_TARGET_LEVEL, null=True, blank=True)
#     position = models.CharField(max_length=20, choices=SBC_TARGET_POSITION, null=True, blank=True)
#     nation = models.IntegerField(default=0, choices=SBC_TARGET_NATIONS, null=True, blank=True)
#     league = models.IntegerField(default=0, choices=SBC_TARGET_LEAGUES, null=True, blank=True)
#     team = models.IntegerField(default=0, choices=SBC_TARGET_CLUBS, null=True, blank=True)
#     # chemistry_style = models.IntegerField(default=0, choices=SBC_TARGET_CHEMISTRY, null=True, blank=True)


# # todo : use this
# class ConsoleTradeOneFilterPriceHistory(models.Model):
#     create_time = models.DateTimeField(default=timezone.now)
#     fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True)
#     console_trade_one_filter = models.ForeignKey(
#         ConsoleTradeOneFilter, on_delete=models.SET_NULL, null=True, blank=True)
#     bid_price = models.IntegerField(default=0)
#     sell_price = models.IntegerField(default=0)
#     auto_next_create = models.BooleanField(default=True)
#     dynamic_upper_price = models.IntegerField(default=False)
#     invest_sell_low_price = models.IntegerField(default=0)
#     invest_bid_high_price = models.IntegerField(default=0)
#
#     def __str__(self):
#         return f'{self.console_trade_one_filter}'


# # todo : use this
# class FifaAccountConsoleTradeSettings(models.Model):
#     create_time = models.DateTimeField(default=timezone.now)
#     fifa_account = models.OneToOneField(FifaAccount, on_delete=models.CASCADE, null=True)
#
#     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)
#     is_running_console_trade_one = models.BooleanField(default=False, null=True)
#     run_with_filter = models.BooleanField(default=False)
#     console_trade_one_filter = models.ForeignKey(
#         ConsoleTradeOneFilter, on_delete=models.SET_NULL, null=True, blank=True)
#     console_trade_one_filter_new = models.ForeignKey(
#         ConsoleTradeOneFilter, on_delete=models.SET_NULL, null=True, blank=True)


class WebTradePlayerQuality(models.Model):
    asset_id = models.IntegerField(default=0)
    rarity_ids = models.CharField(max_length=10, choices=SBC_TARGET_RARITIES, null=True, blank=True)
    position = models.CharField(max_length=20, choices=SBC_TARGET_POSITION, null=True, blank=True)
    chemistry_style = models.IntegerField(default=0, choices=SBC_TARGET_CHEMISTRY, null=True, blank=True)
    level = models.CharField(max_length=20, choices=SBC_TARGET_LEVEL, null=True, blank=True)
    nation = models.IntegerField(default=0, choices=SBC_TARGET_NATIONS, null=True, blank=True)
    league = models.IntegerField(default=0, choices=SBC_TARGET_LEAGUES, null=True, blank=True)
    team = models.IntegerField(default=0, choices=SBC_TARGET_CLUBS, null=True, blank=True)

    def __str__(self):
        return f'{self.asset_id}'


class WebTradeConsumableQuality(models.Model):
    category = models.CharField(max_length=255, choices=WEB_TRADE_CONSUMABLE_QUALITY)
    level = models.CharField(max_length=20, choices=SBC_TARGET_LEVEL, null=True, blank=True)

    def __str__(self):
        return f'{self.category}'


class WebTradeQuality(models.Model):
    creator = models.ForeignKey(django_user, on_delete=models.SET_NULL, null=True, blank=True)
    create_time = models.DateTimeField(default=timezone.now)
    name = models.CharField(max_length=255)
    player_quality = models.ForeignKey(WebTradePlayerQuality, on_delete=models.SET_NULL, null=True, blank=True)
    consumable_quality = models.ForeignKey(WebTradeConsumableQuality, on_delete=models.SET_NULL, null=True, blank=True)
    zero_price = models.IntegerField(default=150)
    bid_price = models.IntegerField(default=0)
    sell_price = models.IntegerField(default=0)
    sell_next_grades = models.IntegerField(default=0)
    sell_previous_grades = models.IntegerField(default=0)
    auto_next_create = models.BooleanField(default=True)
    dynamic_upper_price = models.IntegerField(default=0)

    def __str__(self):
        return f'{self.name}'


class WebTradeInfo(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.OneToOneField('accounts.FifaAccount', on_delete=models.CASCADE)
    quality_name = models.CharField(max_length=255, null=True, blank=True)
    run_trade = models.BooleanField(default=False)
    is_running_trade = models.BooleanField(default=False)
    deleted = models.BooleanField(default=False)


class WebTradeHistory(models.Model):
    web_trade_info = models.ForeignKey(WebTradeInfo, on_delete=models.CASCADE)
    create_time = models.DateTimeField(default=timezone.now)
    update_time = models.DateTimeField(null=True, blank=True)
    end_time = models.DateTimeField(null=True, blank=True)
    move_items_from_unassigned = models.DateTimeField(null=True, blank=True)
    quality_name = models.CharField(max_length=255, null=True, blank=True)
    bid_price = models.IntegerField(default=0)
    sell_price = models.IntegerField(default=0)
    bid_count = models.IntegerField(default=0)
    win_count = models.IntegerField(default=0)
    credit_before = models.IntegerField(default=0)
    credit_after = models.IntegerField(default=0)
    list_try_count = models.IntegerField(default=0)
    last_list_items_time = models.DateTimeField(null=True, blank=True)


