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 SniperOrderStatus, SNIPER_ITEM_LOG_STATUS
from sniper.managers import SniperAccountManager, SniperOrderManager


class SniperOrder(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=SniperOrderStatus, verbose_name='Status')

    objects = SniperOrderManager()


# class SniperWorker(models.Model):
#     start_time = models.DateTimeField(default=timezone.now)
#     sniper_order = models.ForeignKey(SniperOrder, on_delete=models.CASCADE)
#     task_id = models.CharField(max_length=500, null=True)
#     running_platform = models.TextField(null=True, blank=True, default='web')
#     end_time = models.DateTimeField(default=timezone.now)


class SniperAccount(models.Model):
    sniper_order = models.ForeignKey(SniperOrder, on_delete=models.CASCADE)
    fifa_account = models.ForeignKey('accounts.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)
    empty_size_transfer_limit = models.IntegerField(default=0)  # empty to coins_to , empty_to_coins_to
    need_proof = models.IntegerField(default=0)
    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)

    objects = SniperAccountManager()


class SniperTransfers(models.Model):
    sender_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.PROTECT, related_name='transfer_sender')
    receiver_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.PROTECT, related_name='transfer_receiver')
    coins_taken = models.IntegerField(default=0)
    is_missed = models.IntegerField(default=0)
    transfer_time = models.DateTimeField(default=timezone.now)


# class SniperPlayerMissed(models.Model):
#     fifa_account = models.ForeignKey(FifaAccount, on_delete=models.CASCADE, null=True, blank=True)
#     player_card = models.ForeignKey('accounts.PlayerCard', on_delete=models.CASCADE, null=True, blank=True)
#     missed_time = models.DateTimeField(default=timezone.now)
#     buy_now_price = models.IntegerField(default=0)
#     missed_price = models.IntegerField(default=0)

class SniperTradeItemLog(models.Model):
    sniper_order = models.ForeignKey(SniperOrder, on_delete=models.CASCADE, null=True, blank=True)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.CASCADE, null=True, blank=True)
    sniper_account = models.ForeignKey(SniperAccount, on_delete=models.CASCADE, null=True, blank=True)
    player_card = models.ForeignKey('accounts.PlayerCard', on_delete=models.CASCADE, null=True, blank=True)
    action_time = models.DateTimeField(default=timezone.now)
    buy_now_price = models.IntegerField(default=0)
    price = models.IntegerField(default=0)
    sell_price = models.IntegerField(default=0)
    status = models.IntegerField(null=True, blank=True, choices=SNIPER_ITEM_LOG_STATUS)


class DischargeUsableCard(models.Model):
    creator = models.ForeignKey(django_user, on_delete=models.PROTECT, null=True)
    create_time = models.DateTimeField(default=timezone.now)
    player_name = models.CharField(max_length=255)
    asset_id = models.IntegerField(default=0)
    allowed_use_console_discharge = models.BooleanField(default=False)


class MuleDischargeMode2(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    user_name = models.CharField(max_length=255)
    password = models.CharField(max_length=255)
    api_user_name = models.CharField(max_length=255, null=True, blank=True)
    api_secret_key = models.CharField(max_length=255, null=True, blank=True)
    site_name = models.CharField(max_length=255, null=True, blank=True,
                                 choices=(('mydgn', 'MYDGN'), ('buyut', 'U7BUY'),
                                          ('game_currency', 'GC')))
    is_api = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    priority = models.IntegerField(default=0)
    in_use = models.BooleanField(default=False)
    last_run_time = models.DateTimeField(null=True, blank=True)
    last_fifa_account_used = models.ForeignKey('accounts.FifaAccount', on_delete=models.SET_NULL, null=True, blank=True)

    available_payment = models.CharField(max_length=255, null=True, blank=True)
    progress_payment = models.CharField(max_length=255, null=True, blank=True)
    pending_payment = models.CharField(max_length=255, null=True, blank=True)
    address_payment = models.CharField(max_length=255, null=True, blank=True)
    session_dict = models.TextField(blank=True, null=True)


class DischargeMode2(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.CASCADE, null=True, blank=True)
    mule = models.ForeignKey(MuleDischargeMode2, on_delete=models.SET_NULL, null=True, blank=True)
    player_name = models.TextField(null=True, blank=True)
    player_rating = models.IntegerField(default=0)
    player_asset_id = models.IntegerField(default=0)
    start_price = models.IntegerField(default=0)
    end_price = models.IntegerField(default=0)
    avg_price = models.IntegerField(default=0)
    site_price = models.IntegerField(default=0, null=True)  # todo : remove null=True
    site_player_id = models.IntegerField(default=0)
    status = models.CharField(max_length=255, null=True, blank=True)
    error_description = models.TextField(null=True, blank=True)
    income_credit = models.CharField(max_length=255, null=True, blank=True)


class DischargeMode3SpecialPlayers(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    player_name = models.CharField(max_length=255, null=True, blank=True)
    futbin_link = models.CharField(max_length=255, null=True, blank=True)
    futbin_id = models.IntegerField(default=0, null=True, blank=True)
    asset_id = models.IntegerField(default=0, null=True, blank=True)
    resource_id = models.IntegerField(default=0, null=True, blank=True)
    first_price = models.IntegerField(default=0, null=True, blank=True)
    price_list = models.TextField(null=True, blank=True)
    min_price = models.IntegerField(default=0, null=True, blank=True)
    max_price = models.IntegerField(default=0, null=True, blank=True)
    update_time = models.DateTimeField(default=timezone.now)
    last_fifa_account_used = models.ForeignKey('accounts.FifaAccount', on_delete=models.CASCADE, null=True, blank=True)
    bad_for_discharge_reason = models.TextField(null=True, blank=True)


class DischargePerDay(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.CASCADE, null=True, blank=True)
    income_credit = models.FloatField(default=0)
    usdt_amount = models.FloatField(default=0)
    euro_amount = models.FloatField(default=0)


class HourlyAccountDischargeHistory(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    mode2_count = models.IntegerField(default=0)
    mode3_count = models.IntegerField(default=0)


class StartDischargeBot(models.Model):
    create_time = models.DateTimeField(auto_now_add=True)
    fifa_account = models.ForeignKey('accounts.FifaAccount', on_delete=models.CASCADE, null=True, blank=True)
    end_time = models.DateTimeField(null=True, blank=True)
    discharge_mode = models.IntegerField(default=0,
                                         choices=((0, 'None'), (1, 'Sniper'), (2, 'Mode 2'), (3, 'Mode 3')))
    status = models.CharField(max_length=255, null=True, blank=True)
    has_error = models.DateTimeField(null=True, blank=True)
    error_description = models.TextField(null=True, blank=True)