from django.db.models import F, Sum
from django_tables2 import Table, LinkColumn, A, Column, DateTimeColumn

from accounts.models import CloseWebAppSnipes, CloseWebAppTransfers
from sniper.models import SniperOrder, SniperAccount, SniperTradeItemLog, DischargeMode2, DischargePerDay
from utils import number_convertor_to_milion
from utils.table_fields import CounterColumn, SimpleSeparatorColumn


class SniperOrdersTable(Table):
    logs = LinkColumn('sniper-order-excel', text='Download Excel', verbose_name='--', args=[A('pk')],
                      attrs={'a': {'class': 'btn btn-info'}})
    cancel_order = LinkColumn('cancel-sniper-order', text='Cancel Order', verbose_name='--', args=[A('pk')],
                              attrs={'a': {'class': 'btn btn-danger'}})

    def render_sum_accounts(self, record):
        return record.sum_accounts

    def render_sum_senders_success(self, record):
        return record.sum_senders_success

    def render_sum_receivers_success(self, record):
        return record.sum_receivers_success

    def render_sum_fail(self, record):
        return record.sum_fail

    def render_sum_success(self, record):
        return record.sum_success

    def render_sum_price_taken(self, record):
        return number_convertor_to_milion(record.sum_price_taken or 0)

    def render_miss_and_tax(self, record):
        return round(record.miss_and_tax or 0, 1)

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = SniperOrder
        fields = ('file_name', 'create_time', 'status', 'sum_accounts', 'sum_fail', 'sum_senders_success',
                  'sum_receivers_success', 'sum_success', 'sum_price_taken', 'miss_and_tax', 'cancel_order')
        attrs = {'class': 'table table-stripped'}


class DischargeWithSnipeLogListTable(Table):
    counter = CounterColumn()

    console_name = Column(accessor='console_name', verbose_name='Console')
    miss_rate_all = Column(accessor='id', verbose_name='Miss Rate')
    snatched = Column(accessor='second_side_found_target', verbose_name='Snatched')
    min_price = Column(accessor='player_min_price_from_futbin', verbose_name='Min')
    insert_time_field = DateTimeColumn(accessor='insert_time', verbose_name='Insert', format='Y/m/d H:i')
    ready_time_field = DateTimeColumn(accessor='second_side_ready_time', verbose_name='Ready', format='Y/m/d H:i')

    def render_miss_rate_all(self, value, record):
        if record.all_value:
            if record.all_value_24:
                return '{} ({})'.format(str(round((record.miss_value_24 or 0) * 100 / record.all_value_24, ndigits=2)),
                                        str(round((record.miss_value or 0) * 100 / record.all_value, ndigits=2)))
            return '-- ({})'.format(str(round((record.miss_value or 0) * 100 / record.all_value, ndigits=2)))
        else:
            return 0

    # def render_sum_price_taken(self, value):
    #     sniper_logs = SniperTradeItemLog.objects.filter(sniper_order_id=value).annotate(
    #         price_taken=F('price') - (F('buy_now_price') - (F('buy_now_price') * 0.05)),
    #     ).aggregate(
    #         sum_price_taken=Sum('price_taken'),
    #     )
    #     price_taken = sniper_logs.get('sum_price_taken')
    #     return number_convertor_to_milion(price_taken or 0)
    #
    # def render_miss_and_tax(self, value):
    #     miss_and_tax = 0
    #     sniper_logs = SniperTradeItemLog.objects.filter(
    #         sniper_account__receiver=1, sniper_order_id=value
    #     ).annotate(
    #         # پولی که از اکانت مبدا کم شده
    #         price_taken=F('price') - (F('buy_now_price') - (F('buy_now_price') * 0.05)),
    #     ).aggregate(
    #         sum_price_taken=Sum('price_taken'),
    #     )
    #     final_transfers = SniperTradeItemLog.objects.filter(
    #         sniper_account__receiver=1, sniper_order_id=value, status=1
    #     ).annotate(
    #         # خالص پولی که بعد از فروش ایتم توی حساب مشتری میمونه
    #         price_receiver=(F('price') - (F('price') * 0.05)) - F('buy_now_price')
    #     ).aggregate(
    #         sum_price_receiver=Sum('price_receiver'),
    #     )
    #     price_taken = sniper_logs.get('sum_price_taken')
    #     final_transfers = final_transfers.get('sum_price_receiver')
    #     if final_transfers and price_taken:
    #         miss_and_tax = 100 - (final_transfers / price_taken * 100)
    #     return round(miss_and_tax, ndigits=1)

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = CloseWebAppSnipes
        fields = ('counter', 'console_name', 'first_account_user',
                  'player_name', 'min_price', 'player_price', 'insert_time_field',
                  'ready_time_field', 'status', 'miss_rate_all')
        attrs = {'class': 'table table-stripped'}
        row_attrs = {
            "class": lambda record: "bg-danger fw-bold" if record.status == 'missed' else
            'bg-success fw-bold' if record.status == 'success' else 'fw-bold'
        }


class DischargeMode2LogListTable(Table):
    counter = CounterColumn()

    console_name = Column(accessor='console_name', verbose_name='Console')
    insert_time_field = DateTimeColumn(accessor='create_time', verbose_name='Insert', format='Y/m/d H:i')
    # provider_type = Column(accessor='provider_type', verbose_name='Provider')
    provider_type = Column(accessor='mule', verbose_name='Provider')
    error_text = Column(accessor='error_description', verbose_name='Error')

    def render_provider_type(self, value, record):
        new_val = value.get_site_name_display()
        if record.has_star:
            new_val = str(new_val) + '*'
        return new_val


    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = DischargeMode2
        fields = ('counter', 'console_name', 'first_account_user',
                  'player_name', 'end_price', 'avg_price', 'insert_time_field', 'new_status', 'provider_type',
                  'tax', 'error_text')
        attrs = {'class': 'table table-stripped'}
        row_attrs = {
            "class": lambda record: "bg-danger fw-bold" if record.status == '' else
            'bg-success fw-bold' if record.status in ['success', 'failed'] else 'fw-bold'
        }


class DischargePerDayLogListTable(Table):
    counter = CounterColumn()

    create_time_ = DateTimeColumn(accessor='create_time', verbose_name='Create', format='Y/m/d')
    income_credit = SimpleSeparatorColumn(accessor='sum_income_credit', verbose_name='Income')
    euro_amount = SimpleSeparatorColumn(accessor='sum_euro_amount', verbose_name='EURO')
    usdt_amount = SimpleSeparatorColumn(accessor='sum_usdt_amount', verbose_name='USDT')

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = DischargePerDay
        fields = ('counter', 'create_time_', )
        attrs = {'class': 'table table-stripped'}


class DischargeMode3LogListTable(Table):
    counter = CounterColumn()

    console_name = Column(accessor='console_name', verbose_name='Console')
    insert_time_field = DateTimeColumn(accessor='web_app_start_time', verbose_name='Insert', format='Y/m/d H:i')
    web_list_start_price = Column(accessor='web_list_start_price', verbose_name='Start Price')
    first_side_done = Column(accessor='first_side_done', verbose_name='Step One')
    second_side_done = Column(accessor='second_side_done', verbose_name='Complete')

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = CloseWebAppTransfers
        fields = ('counter', 'console_name', 'first_account_user',
                  'player_name', 'buy_now_price', 'web_list_start_price',
                  'insert_time_field', 'first_side_done', 'second_side_done')
        attrs = {'class': 'table table-stripped'}
        row_attrs = {
            "class": lambda record: "bg-danger fw-bold" if record.new_status == '' else
            'bg-success fw-bold' if record.new_status in ['success'] else 'fw-bold'
        }