from django.db.models import Sum
from django.utils.translation import gettext_lazy as _
from django_tables2 import Table, LinkColumn, A, Column, TemplateColumn

from accounts.models import FifaAccount
from trade.models import TradeOrder, TradeWorker, TradeLog, SinglePlayerTradeOrder, WebTradeInfo, ConsoleTradeOneHistory
from utils import number_convertor_to_milion
from utils.table_fields import CounterColumn


class TradeOrdersTable(Table):
    logs = LinkColumn('trade-order-excel', text='Download Excel', verbose_name='--', args=[A('pk')],
                      attrs={'a': {'class': 'btn btn-info'}})
    cancel_order = LinkColumn('cancel-trade-order', text='Cancel Order', verbose_name='--', args=[A('pk')],
                              attrs={'a': {'class': 'btn btn-danger'}})

    orders = LinkColumn('get-trades', text='last 5000 trades', verbose_name='--', args=[A('pk')],
                        attrs={'a': {'class': 'btn btn-success'}})

    sum_accounts = Column(accessor='id', verbose_name='Accounts')
    sum_fail = Column(accessor='id', verbose_name='Fails')
    sum_workers_success = Column(accessor='id', verbose_name='Workers Done')
    sum_success_bid = Column(accessor='id', verbose_name='success bids')
    sum_failed_bid = Column(accessor='id', verbose_name='failed bids')
    possible_profit = Column(accessor='id', verbose_name='Forcast Profit')

    def render_sum_accounts(self, value):
        return TradeOrder.objects.get(id=value).tradeworker_set.all().count()

    def render_sum_workers_success(self, value):
        return TradeOrder.objects.get(id=value).tradeworker_set.filter(is_done=True).count()

    def render_sum_fail(self, value):
        return TradeWorker.objects.filter(trade_order__id=value, has_error=True).count()

    def render_sum_success_bid(self, value):
        order = TradeOrder.objects.get(id=value)
        logs = TradeLog.objects.filter(trade_worker__trade_order=order, bid_success=1).count()
        return number_convertor_to_milion(logs or 0)

    def render_sum_failed_bid(self, value):
        order = TradeOrder.objects.get(id=value)
        logs = TradeLog.objects.filter(trade_worker__trade_order=order, bid_success=0).count()
        return number_convertor_to_milion(logs or 0)

    def render_possible_profit(self, value):
        order = TradeOrder.objects.get(id=value)
        success = TradeLog.objects.filter(trade_worker__trade_order=order, bid_success=1)
        bid_prices = success.aggregate(sum_bids=Sum('bid_price')).get('sum_bids')
        sell_prices = success.aggregate(sum_prices=Sum('sell_price')).get('sum_prices')
        if bid_prices is None or sell_prices is None:
            return 0
        return number_convertor_to_milion((sell_prices - (sell_prices * .05)) - bid_prices)

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = TradeOrder
        fields = ('file_name', 'create_time', 'status', 'sum_accounts', 'sum_fail', 'sum_workers_success',
                  'sum_success_bid', 'sum_failed_bid', 'possible_profit', 'cancel_order', 'orders')
        attrs = {'class': 'table table-stripped'}


class SinglePlayerTradeOrdersTable(Table):
    logs = LinkColumn('single-player-trade-order-excel', text='Download Excel', verbose_name='--', args=[A('pk')],
                      attrs={'a': {'class': 'btn btn-info'}})
    cancel_order = LinkColumn('single-player-cancel-trade-order', text='Cancel Order', verbose_name='--',
                              args=[A('pk')], attrs={'a': {'class': 'btn btn-danger'}})

    orders = LinkColumn('single-player-get-trades', text='last 5000 trades', verbose_name='--', args=[A('pk')],
                        attrs={'a': {'class': 'btn btn-success'}})

    sum_accounts = Column(accessor='id', verbose_name='Accounts')
    sum_fail = Column(accessor='id', verbose_name='Fails')
    sum_workers_success = Column(accessor='id', verbose_name='Workers Done')
    sum_success_bid = Column(accessor='id', verbose_name='success bids')
    sum_failed_bid = Column(accessor='id', verbose_name='failed bids')
    possible_profit = Column(accessor='id', verbose_name='Forcast Profit')

    def render_sum_accounts(self, value):
        return SinglePlayerTradeOrder.objects.get(id=value).singleplayertradeworker_set.all().count()

    def render_sum_workers_success(self, value):
        return SinglePlayerTradeOrder.objects.get(id=value).singleplayertradeworker_set.filter(is_done=True).count()

    def render_sum_fail(self, value):
        return TradeWorker.objects.filter(trade_order__id=value, has_error=True).count()

    def render_sum_success_bid(self, value):
        order = SinglePlayerTradeOrder.objects.get(id=value)
        logs = TradeLog.objects.filter(single_player_trade_worker__trade_order=order, bid_success=1).count()
        return number_convertor_to_milion(logs or 0)

    def render_sum_failed_bid(self, value):
        order = SinglePlayerTradeOrder.objects.get(id=value)
        logs = TradeLog.objects.filter(single_player_trade_worker__trade_order=order, bid_success=0).count()
        return number_convertor_to_milion(logs or 0)

    def render_possible_profit(self, value):
        order = SinglePlayerTradeOrder.objects.get(id=value)
        success = TradeLog.objects.filter(single_player_trade_worker__trade_order=order, bid_success=1)
        bid_prices = success.aggregate(sum_bids=Sum('bid_price')).get('sum_bids')
        sell_prices = success.aggregate(sum_prices=Sum('sell_price')).get('sum_prices')
        if bid_prices is None or sell_prices is None:
            return 0
        return number_convertor_to_milion((sell_prices - (sell_prices * .05)) - bid_prices)

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = SinglePlayerTradeOrder
        fields = ('file_name', 'create_time', 'status', 'sum_accounts', 'sum_fail', 'sum_workers_success',
                  'sum_success_bid', 'sum_failed_bid', 'possible_profit', 'cancel_order', 'orders')
        attrs = {'class': 'table table-stripped'}


class WebTradeAddAccountTable(Table):
    web_trade_action = TemplateColumn(
        verbose_name='Action',
        template_code='''
            <a href="{% url "web-trade-action" %}?web_trade_id={{record.id}}&action=web_trade_one&state={{record.trade_one_state}}"
             class="btn {% if record.trade_one_state == 'active' %}btn-success{% else %}btn-danger{% endif %}">
            {{ record.trade_one_text }}</a>''',
        order_by='trade_one_state')
    last_worker_status = Column(accessor='fifa_account', verbose_name='Status')

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = WebTradeInfo
        fields = ('fifa_account', 'credit', 'search', 'quality', 'bid_price', 'sell_price', 'last_update',
                  'bid_count', 'win_count', 'passed_since_bid', 'last_worker_status',
                  'web_trade_action')
        attrs = {'class': 'table table-stripped'}

    def render_last_worker_status(self, value, record):
        if record['fifa_account'].need_captcha:
            return 'need captcha'
        last_worker = value.sbcworker_set.last()
        if last_worker:
            if last_worker.has_error:
                return last_worker.error_description
            return last_worker.status
        return '---'


class DailyInvestTradeGenerateChartDashboardCardTable(Table):
    class Meta:
        attrs = {'class': 'table table-striped hover'}
        empty_text = 'No data'

    title = Column(verbose_name=_('Title'), accessor='title', orderable=False)
    sum = Column(verbose_name=_('Not Empty Accounts'), accessor='sum', orderable=False,
                 attrs={'td': {'class': 'shrink text-right'}})
    accounts_credit = Column(verbose_name=_('Credit'), accessor='accounts_credit', orderable=False)
    items_count = Column(verbose_name=_('Items'), accessor='items_count', orderable=False)
    fifa_accounts_count = Column(verbose_name=_('Accounts'), accessor='fifa_accounts_count', orderable=False)


class ConsoleInvestTradeTable(Table):
    counter = CounterColumn()

    account = LinkColumn('admin:trade_consoletradeonehistory_change', args=[A('id')],
                         verbose_name=_('Account'), accessor='fifa_account')
    # current_cards_profit = Column(verbose_name=_('Profit'), accessor='current_cards_profit')
    profit = Column(verbose_name=_('Profit'), accessor='profit')
    salary = Column(verbose_name=_('Salary'), accessor='salary')
    console = Column(verbose_name=_('Console'), accessor='fifa_account.console')
    sell_p = Column(verbose_name=_('Sell Price'), accessor='current_sell_price')
    unassigned = Column(verbose_name=_('Unassigned'), accessor='unassigned_item_count')
    current_club_transfer_cards = Column(verbose_name=_('Stock'), accessor='current_club_transfer_cards')
    new_quality_name = Column(verbose_name=_('New Quality'), accessor='fifa_account.console_trade_one_quality_new')

    # def render_current_profit(self, value, record):
    #     if record.credit_before and record.current_credit:
    #         return record.current_credit - record.credit_before
    #     return 0

    def render_account(self, value, record):
        return record.fifa_account.user_name

    def render_console(self, value, record):
        if record.fifa_account.console:
            return record.fifa_account.console.name
        return '-'

    # def render_current_club_transfer_cards(self, value, record):
    #     if record.fifa_account.console_trade_one_quality == 'bronze1':
    #         return record.club_bronze1_items + record.transfer_list_items_count
    #     elif record.fifa_account.console_trade_one_quality == 'silver1':
    #         return record.club_silver1_items + record.transfer_list_items_count
    #     elif record.fifa_account.console_trade_one_quality == 'gold0':
    #         return record.club_gold0_items + record.transfer_list_items_count
    #     elif record.fifa_account.console_trade_one_quality == 'gold1':
    #         return record.club_gold1_items + record.transfer_list_items_count
    #     return '-'

    # def render_unassigned(self, value, record):
    #     return record.unassigned_item_count

    # def render_sell_p(self, value, record):
    #     return record.current_sell_price

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = ConsoleTradeOneHistory
        fields = ('account', 'create_time', 'console', 'quality_name', 'new_quality_name', 'bid_price', 'sell_p',
                  'bid_count', 'credit_before',
                  'profit', 'current_club_transfer_cards', 'salary', 'update_time', 'unassigned',)

        sequence = ('counter', '...',)
        attrs = {'class': 'table table-stripped'}


class ConsoleInvestChangeQualityProTable(Table):
    counter = CounterColumn()

    sell_p = Column(verbose_name=_('Sell Price'), accessor='last_history_current_sell_price')
    quality_name = Column(verbose_name=_('Quality'), accessor='console_trade_one_quality')
    new_quality_name = Column(verbose_name=_('New Quality'), accessor='console_trade_one_quality_new')
    credit = Column(verbose_name=_('Credit'), accessor='credit')
    current_club_transfer_cards = Column(verbose_name=_('Stock'), accessor='current_club_transfer_cards')

    def render_credit(self, value, record):
        return number_convertor_to_milion(value)

    class Meta:
        template_name = "django_tables2/bootstrap.html"
        model = FifaAccount
        fields = ('user_name', 'credit', 'console.name',
                  'quality_name', 'new_quality_name')

        sequence = ('counter', '...',)
        attrs = {'class': 'table table-stripped'}
