import datetime

import pytz
from django.db.models import Sum, F, Q, Avg, Count, Case, When, Value, DateTimeField, IntegerField
from django.db.models.functions import Extract, Trunc
from django.http import QueryDict
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from accounts.filters import DailyCreditGeneratedReportFilterSet, ItemPackChartReportFilterSet
from accounts.models import FifaAccountCreditLog, FifaAccount, ItemPack, AccountBoughtItem, AccountSoldItem
from accounts.tables import SummaryTable
from futplus import settings
from futplus.settings import TIME_ZONE
from trade.models import ConsoleTradeOneHistory, ConsoleInvestTradeItemsCountLog
from utils import number_convertor_to_milion
from utils.cache_utils import cached_method
from utils.dashboard_cards import TableDashboardCard, FilterDashboardCard, ChartDashboardCard, height_16_8
from utils.date_utils import normalize_month_range
from utils.query_extra_func import ToCharTZ


class DailyCreditGeneratedChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Daily Credit Generated')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = FifaAccountCreditLog
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    def get_chart_config(self):
        queryset = self.model.objects.filter(
            Q(fifa_account__delete_console_reason=None) | Q(fifa_account__delete_console_reason='')
        ).exclude(
            Q(fifa_account__console=None) | Q(fifa_account__console__investor=None)
        )
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        queryset = self.filter_queryset(queryset, filterset=filterset)
        # queryset = self.extra_filter_payments_queryset(queryset)
        a = queryset.values('create_time__date').order_by('create_time__date').annotate(
            formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy HH24'),
            # formatted_create_time=Func(
            #     F('create_time__date'),
            #     Value('dd.MM.yyyy'),
            #     function='to_char',
            #     output_field=CharField()
            # ),
            sum_today_production=Sum('today_production'),
            sum_today_production_mines_trade=Sum('today_production') - Sum('today_console_trades_profit'),
            sum_today_console_trades_profit=Sum('today_console_trades_profit'),
            sum_today_credit=Sum('current_credit'),
            sum_today_discharge_coin=Sum('today_discharges_coin')
        )
        labels = list(a.values_list('formatted_create_time', flat=True))
        values_today_production = list(a.values_list('sum_today_production', flat=True))
        values_today_production_mines_trade = list(a.values_list('sum_today_production_mines_trade', flat=True))
        # values_today_console_trades_profit = list(a.values_list('sum_today_console_trades_profit', flat=True))
        values_today_credit = list(a.values_list('sum_today_credit', flat=True))
        values_today_discharges_coin = list(a.values_list('sum_today_discharge_coin', flat=True))
        values_today_console_trades_profit = list(ConsoleTradeOneHistory.objects.exclude(
            Q(credit_before=0) | Q(credit_after=0)
        ).filter(
            create_time__date__in=a.values_list('create_time__date', flat=True),
            fifa_account__id__in=queryset.values_list('fifa_account__id', flat=True),
        ).annotate(
            profit_coin=F('credit_after') - F('credit_before')
        ).values('create_time__date').order_by('create_time__date').annotate(
            sum_profit_coin=Sum('profit_coin')
        ).values_list('sum_profit_coin', flat=True))
        # values_today_discharges_coin = list(CloseWebAppSnipes.objects.filter(
        #     (Q(second_side_done=True) | Q(error=True)),
        #     first_account__in=queryset.values_list('fifa_account', flat=True),
        #     insert_time__date__in=a.values_list('create_time__date', flat=True),
        # ).annotate(
        #     transfer_coin=F('player_price') - F('player_min_price_from_futbin')
        # ).values('insert_time__date').order_by('insert_time__date').annotate(
        #     sum_transfer_coin=Sum('transfer_coin')
        # ).values_list('sum_transfer_coin', flat=True))
        sum_generated_7_days = queryset.filter(
            create_time__gte=timezone.localtime() - timezone.timedelta(days=7)
        ).aggregate(sum_generated_7_days=Sum('today_production')).get('sum_generated_7_days', 0)

        self.table_data = [{
            'title': _('Generated 7 Days'),
            # 'sum': DecimalCurrency(sum(v or 0 for v in values_forecast), currency).as_text(),
            'sum': number_convertor_to_milion(sum_generated_7_days),
        }, {
            'title': _('Generate - Trade'),
            # 'sum': DecimalCurrency(sum(v or 0 for v in values_payments), currency).as_text(),
            'sum': 0,
        }, {
            'title': _('Trade'),
            # 'sum': DecimalCurrency(sum(v or 0 for v in values_remaining), currency).as_text(),
            'sum': 0,
        }]

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'line',
                    'label': _('Generated'),
                    'data': values_today_production,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }, {
                    'label': _('Generate - Trade'),
                    'data': values_today_production_mines_trade,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 1) * len(
                        values_today_production_mines_trade),
                    'borderWidth': 1,
                }, {
                    'label': _('Trade'),
                    'data': values_today_console_trades_profit,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 2) * len(
                        values_today_console_trades_profit),
                    'borderWidth': 1,
                }, {
                    'label': _('credit'),
                    'data': values_today_credit,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3) * len(values_today_credit),
                    'borderWidth': 1,
                }, {
                    'label': _('discharge'),
                    'data': values_today_discharges_coin,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 4) * len(
                        values_today_discharges_coin),
                    'borderWidth': 1,
                }
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


class InvestTradeSalaryChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Salary')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = FifaAccountCreditLog
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    def get_chart_config(self):
        queryset = self.model.objects.filter(
            Q(fifa_account__delete_console_reason=None) | Q(fifa_account__delete_console_reason='')
        ).exclude(
            Q(fifa_account__console=None) | Q(fifa_account__console__investor=None)
        ).annotate(
            create_time_epoch=Extract('create_time', 'epoch')
        )
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        queryset = self.filter_queryset(queryset, filterset=filterset)
        queryset = queryset.filter(
            create_time_epoch__gt=timezone.datetime(year=2023, month=9, day=20, hour=16).timestamp())
        period_filter = self.request.GET.dict().get('period_time', None)
        if period_filter == 'daily':
            a = queryset.filter(
                create_time__hour__in=[22, 23]
            ).values('create_time__date').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy'),
                sum_today_console_trade_salary=Sum('today_console_trade_salary'),
                sum_items_forcast=Sum('items_forcast'),
                sum_current_credit=Sum('current_credit'),
            )
        else:
            a = queryset.values('create_time').order_by('create_time').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy HH24'),
                # formatted_create_time=Func(
                #     F('create_time'),
                #     Value('dd.MM.yyyy hh'),
                #     function='to_char',
                #     output_field=CharField()
                # ),
                sum_today_console_trade_salary=Sum('today_console_trade_salary'),
                sum_items_forcast=Sum('items_forcast'),
                sum_current_credit=Sum('current_credit'),
            ).exclude(sum_items_forcast=0)

        data_list = a.values_list(
            'formatted_create_time', 'sum_today_console_trade_salary', 'sum_items_forcast', 'sum_current_credit'
        )
        labels = [i[0] for i in data_list]
        values_console_trade_salary = [i[1] for i in data_list]
        values_today_production = [i[2] for i in data_list]
        values_today_production_mines_trade = [i[3] for i in data_list]
        # labels = list(a.values_list('formatted_create_time', flat=True))
        # values_console_trade_salary = list(a.values_list('sum_today_console_trade_salary', flat=True))
        # values_today_production = list(a.values_list('sum_items_forcast', flat=True))
        # values_today_production_mines_trade = list(a.values_list('sum_current_credit', flat=True))
        if period_filter == 'daily':
            last_item = queryset.last()
            if last_item.create_time.hour < 23:
                b = queryset.filter(
                    create_time=last_item.create_time
                ).values('create_time__date').annotate(
                    formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy'),
                    sum_today_console_trade_salary=Sum('today_console_trade_salary'),
                    sum_items_forcast=Sum('items_forcast'),
                    sum_current_credit=Sum('current_credit'),
                )
                data_list_2 = b.values_list(
                    'formatted_create_time', 'sum_today_console_trade_salary', 'sum_items_forcast',
                    'sum_current_credit',
                )
                labels = labels + [ii[0] for ii in data_list_2]
                values_console_trade_salary = values_console_trade_salary + [ii[1] for ii in data_list_2]
                values_today_production = values_today_production + [ii[2] for ii in data_list_2]
                values_today_production_mines_trade = values_today_production_mines_trade + [ii[3] for ii in data_list_2]
                # labels = labels + list(b.values_list('formatted_create_time', flat=True))
                # values_console_trade_salary = values_console_trade_salary + list(
                #     b.values_list('sum_today_console_trade_salary', flat=True))
                # values_today_production = values_today_production + list(b.values_list('sum_items_forcast', flat=True))
                # values_today_production_mines_trade = values_today_production_mines_trade + list(
                #     b.values_list('sum_current_credit', flat=True))
        # self.table_data = [{
        #     'title': _('Generated 7 Days'),
        #     # 'sum': DecimalCurrency(sum(v or 0 for v in values_forecast), currency).as_text(),
        #     'sum': 0,
        # }, {
        #     'title': _('Generate - Trade'),
        #     # 'sum': DecimalCurrency(sum(v or 0 for v in values_payments), currency).as_text(),
        #     'sum': 0,
        # }, {
        #     'title': _('Trade'),
        #     # 'sum': DecimalCurrency(sum(v or 0 for v in values_remaining), currency).as_text(),
        #     'sum': 0,
        # }]

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'line',
                    'label': _('Items + Credit'),
                    'data': values_console_trade_salary,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }, {
                    'label': _('Items(value)'),
                    'data': values_today_production,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 1) * len(
                        values_today_production),
                    'borderWidth': 1,
                }, {
                    'label': _('Current credit'),
                    'data': values_today_production_mines_trade,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 2) * len(
                        values_today_production_mines_trade),
                    'borderWidth': 1,
                },
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


class InvestTradeSalaryGenerateChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Salary Generate')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = FifaAccountCreditLog
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    def get_chart_config(self):
        queryset = self.model.objects.filter(
            Q(fifa_account__delete_console_reason=None) | Q(fifa_account__delete_console_reason='')
        ).exclude(
            Q(fifa_account__console=None) | Q(fifa_account__console__investor=None)
        ).annotate(
            create_time_epoch=Extract('create_time', 'epoch')
        )
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        queryset = self.filter_queryset(queryset, filterset=filterset)
        queryset = queryset.filter(
            create_time_epoch__gt=timezone.datetime(year=2023, month=9, day=20, hour=16).timestamp()
        )
        period_filter = self.request.GET.dict().get('period_time', None)
        if period_filter == 'daily':
            a = queryset.values('create_time__date').order_by('create_time__date').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy'),
                sum_invest_trade_generation=Sum('invest_trade_generation'),
            )
        else:
            a = queryset.values('create_time').order_by('create_time').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy HH24'),
                sum_invest_trade_generation=Sum('invest_trade_generation'),
            )
        data_list = a.values_list('formatted_create_time', 'sum_invest_trade_generation')
        labels = [ii[0] for ii in data_list]
        values_salary_generate = [ii[1] for ii in data_list]
        # labels = list(a.values_list('formatted_create_time', flat=True))
        # values_salary_generate = list(a.values_list('sum_invest_trade_generation', flat=True))
        generate_7_days = queryset.filter(
            # create_time__gte=timezone.localtime() - timezone.timedelta(days=7)
            create_time_epoch__gte=(timezone.localtime() - timezone.timedelta(days=7)).timestamp()
        ).values('create_time').order_by('create_time').aggregate(
            sum_invest_trade_generation=Sum('invest_trade_generation'),
        ).get('sum_invest_trade_generation', 0)
        generate_30_days = queryset.filter(
            create_time_epoch__gte=(timezone.localtime() - timezone.timedelta(days=30)).timestamp()
        ).values('create_time').order_by('create_time').aggregate(
            sum_invest_trade_generation=Sum('invest_trade_generation'),
        ).get('sum_invest_trade_generation', 0)
        self.table_data = [{
            'title': _('Generated 7 Days'),
            'sum': number_convertor_to_milion(generate_7_days),
        }, {
            'title': _('Generated 30 Days'),
            'sum': number_convertor_to_milion(generate_30_days),
        }]

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'label': _('Generate'),
                    'data': values_salary_generate,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 1) * len(
                        values_salary_generate),
                    'borderWidth': 1,
                }
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


class ConsoleInvestTradeItemsCountLogChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Items')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = ConsoleInvestTradeItemsCountLog
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    def get_chart_config(self):
        queryset = self.model.objects.filter(
            Q(fifa_account__delete_console_reason=None) | Q(fifa_account__delete_console_reason='')
        ).exclude(
            Q(fifa_account__console=None) | Q(fifa_account__console__investor=None)
        ).annotate(
            create_time_epoch=Extract('create_time', 'epoch')
        )
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        queryset = self.filter_queryset(queryset, filterset=filterset)
        queryset = queryset.filter(
            create_time_epoch__gt=timezone.datetime(year=2023, month=9, day=20, hour=16).timestamp())
        period_filter = self.request.GET.dict().get('period_time', None)
        if period_filter == 'daily':
            a = queryset.values('create_time__date').order_by('create_time__date').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy'),
                sum_added_club_bronze1_items=Sum('added_club_bronze1_items'),
                sum_added_club_silver1_items=Sum('added_club_silver1_items'),
                sum_added_club_gold0_items=Sum('added_club_gold0_items'),
                sum_added_club_gold1_items=Sum('added_club_gold1_items'),
                sum_added_club_position_modifier_items=Sum('added_club_position_modifier_items'),
                sum_added_items=F('sum_added_club_bronze1_items') + F('sum_added_club_silver1_items') +
                                F('sum_added_club_gold0_items') + F('sum_added_club_gold1_items') +
                                F('sum_added_club_position_modifier_items'),
            )
        else:
            a = queryset.values('create_time').order_by('create_time').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy HH24'),
                # formatted_create_time=Func(
                #     F('create_time'),
                #     Value('dd.MM.yyyy hh'),
                #     function='to_char',
                #     output_field=CharField()
                # ),
                sum_added_club_bronze1_items=Sum('added_club_bronze1_items'),
                sum_added_club_silver1_items=Sum('added_club_silver1_items'),
                sum_added_club_gold0_items=Sum('added_club_gold0_items'),
                sum_added_club_gold1_items=Sum('added_club_gold1_items'),
                sum_added_club_position_modifier_items=Sum('added_club_position_modifier_items'),
                sum_added_items=F('sum_added_club_bronze1_items') + F('sum_added_club_silver1_items') +
                                F('sum_added_club_gold0_items') + F('sum_added_club_gold1_items') +
                                F('sum_added_club_position_modifier_items'),
            )
        data_list = a.values_list(
            'formatted_create_time',
            'sum_added_club_bronze1_items', 'sum_added_club_silver1_items',
            'sum_added_club_gold0_items', 'sum_added_club_gold1_items',
            'sum_added_club_position_modifier_items', 'sum_added_items',
        )
        labels = [i[0] for i in data_list]
        values_added_club_bronze1_items = [i[1] for i in data_list]
        values_added_club_silver1_items = [i[2] for i in data_list]
        values_added_club_gold0_items = [i[3] for i in data_list]
        values_added_club_gold1_items = [i[4] for i in data_list]
        values_added_club_position_modifier_items = [i[5] for i in data_list]
        values_added_items = [i[6] for i in data_list]
        # labels = list(a.values_list('formatted_create_time', flat=True))
        # values_added_club_bronze1_items = list(a.values_list('sum_added_club_bronze1_items', flat=True))
        # values_added_club_silver1_items = list(a.values_list('sum_added_club_silver1_items', flat=True))
        # values_added_club_gold0_items = list(a.values_list('sum_added_club_gold0_items', flat=True))
        # values_added_club_gold1_items = list(a.values_list('sum_added_club_gold1_items', flat=True))
        # values_added_club_position_modifier_items = list(
        #     a.values_list('sum_added_club_position_modifier_items', flat=True))
        # values_added_items = list(a.values_list('sum_added_items', flat=True))

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'line',
                    'label': _('All'),
                    'data': values_added_items,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }, {
                    'label': _('Bronze Rare'),
                    'data': values_added_club_bronze1_items,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 1) * len(
                        values_added_club_bronze1_items),
                    'borderWidth': 1,
                }, {
                    'label': _('Silver Rare'),
                    'data': values_added_club_silver1_items,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 2) * len(
                        values_added_club_silver1_items),
                    'borderWidth': 1,
                }, {
                    'label': _('Gold Common'),
                    'data': values_added_club_gold0_items,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3) * len(
                        values_added_club_gold0_items),
                    'borderWidth': 1,
                }, {
                    'label': _('Gold Rare'),
                    'data': values_added_club_gold1_items,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 4) * len(
                        values_added_club_gold1_items),
                    'borderWidth': 1,
                }, {
                    'label': _('Position Modifier'),
                    'data': values_added_club_position_modifier_items,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 5) * len(
                        values_added_club_gold1_items),
                    'borderWidth': 1,
                }
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


class ConsoleInvestTradeSoldItemsCountLogChartDashboardCard(TableDashboardCard, ChartDashboardCard,
                                                            FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Sold Items')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = ConsoleInvestTradeItemsCountLog
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    def get_chart_config(self):
        queryset = self.model.objects.filter(
            Q(fifa_account__delete_console_reason=None) | Q(fifa_account__delete_console_reason='')
        ).exclude(
            Q(fifa_account__console=None) | Q(fifa_account__console__investor=None)
        ).annotate(
            create_time_epoch=Extract('create_time', 'epoch')
        )
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        queryset = self.filter_queryset(queryset, filterset=filterset)
        queryset = queryset.filter(
            create_time_epoch__gt=timezone.datetime(year=2023, month=9, day=20, hour=16).timestamp())
        period_filter = self.request.GET.dict().get('period_time', None)
        if period_filter == 'daily':
            a = queryset.values('create_time__date').order_by('create_time__date').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy'),
                sum_added_sold_items=Sum('added_sold_items'),
            )
        else:
            a = queryset.values('create_time').order_by('create_time').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy HH24'),
                # formatted_create_time=Func(
                #     F('create_time'),
                #     Value('dd.MM.yyyy hh'),
                #     function='to_char',
                #     output_field=CharField()
                # ),
                sum_added_sold_items=Sum('added_sold_items'),
            )
        data_list = a.values_list('formatted_create_time', 'sum_added_sold_items')
        labels = [ii[0] for ii in data_list]
        values_added_sold_items = [ii[1] for ii in data_list]
        # labels = list(a.values_list('formatted_create_time', flat=True))
        # values_added_sold_items = list(a.values_list('sum_added_sold_items', flat=True))

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'label': _('Sold Items'),
                    'data': values_added_sold_items,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 1) * len(
                        values_added_sold_items),
                    'borderWidth': 1,
                },
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


class ConsoleInvestTradeWinItemsCountLogChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Win Items')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = ConsoleInvestTradeItemsCountLog
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    def get_chart_config(self):
        queryset = self.model.objects.filter(
            Q(fifa_account__delete_console_reason=None) | Q(fifa_account__delete_console_reason='')
        ).exclude(
            Q(fifa_account__console=None) | Q(fifa_account__console__investor=None)
        ).annotate(
            create_time_epoch=Extract('create_time', 'epoch')
        )
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        queryset = self.filter_queryset(queryset, filterset=filterset)
        queryset = queryset.filter(
            create_time_epoch__gt=timezone.datetime(year=2023, month=9, day=20, hour=20).timestamp()
        )
        period_filter = self.request.GET.dict().get('period_time', None)
        if period_filter == 'daily':
            a = queryset.values('create_time__date').order_by('create_time__date').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy'),
                sum_added_win_items=Sum('added_win_items'),
            )
        else:
            a = queryset.values('create_time').order_by('create_time').annotate(
                formatted_create_time=ToCharTZ('create_time', TIME_ZONE, 'dd.MM.yyyy HH24'),
                # formatted_create_time=Func(
                #     F('create_time'),
                #     Value('dd.MM.yyyy hh'),
                #     function='to_char',
                #     output_field=CharField()
                # ),
                sum_added_win_items=Sum('added_win_items'),
            )
        data_list = a.values_list('formatted_create_time', 'sum_added_win_items')
        labels = [ii[0] for ii in data_list]
        values_added_win_items = [ii[1] for ii in data_list]
        # labels = list(a.values_list('formatted_create_time', flat=True))
        # values_added_win_items = list(a.values_list('sum_added_win_items', flat=True))

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'label': _('Win Items'),
                    'data': values_added_win_items,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 1) * len(
                        values_added_win_items),
                    'borderWidth': 1,
                },
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


class SBCSquadSalaryChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Salary')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = FifaAccount
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    @cached_method(timeout=60 * 60)
    def get_chart_config(self):
        # week_times = self.get_weeks(datetime.datetime(2024, 3, 3), datetime.datetime.now())
        week_times = self.kwargs.get('week_times')
        # queryset = self.model.objects.filter(
        #     Q(delete_console_reason=None) | Q(delete_console_reason='')
        # ).exclude(
        #     Q(console=None) | Q(console__investor=None)
        # # ).annotate(
        # #     create_time_epoch=Extract('create_time', 'epoch')
        # )
        # queryset_list = list(queryset.values_list('id', flat=True))
        queryset_list = self.kwargs.get('queryset_list')
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        # queryset = self.filter_queryset(queryset, filterset=filterset)
        labels = []
        sum_packs_list = []
        sum_sbc_bought_items_list = []
        sum_squad_bought_items_list = []
        pure_generate_list = []

        # packs = list(ItemPack.objects.filter(
        #     fifa_account__id__in=queryset_list,
        #     create_time__gte=datetime.datetime(2024, 3, 3)
        # ).annotate(
        #     create_week=Case(
        #         *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
        #                then=Value(week_time.get('start').timestamp())) for week_time in week_times],
        #         default=Value(None), output_field=IntegerField()),
        # ).values('create_week').annotate(sum_packs=Sum('pack_value')).values_list('create_week', 'sum_packs'))
        packs = self.kwargs.get('packs')

        sbc_bought_items = list(AccountBoughtItem.objects.filter(
            fifa_account__id__in=queryset_list,
            create_time__gte=datetime.datetime(2024, 3, 3),
            requested_worker='sbc',
        ).annotate(
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None), output_field=IntegerField()),
        ).values('create_week').annotate(
            sum_sbc_bought_items=Sum('buy_price')
        ).values_list('create_week', 'sum_sbc_bought_items'))

        squad_bought_items = list(AccountBoughtItem.objects.filter(
            fifa_account__id__in=queryset_list,
            create_time__gte=datetime.datetime(2024, 3, 3),
            requested_worker='squad',
        ).annotate(
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None), output_field=IntegerField()),
        ).values('create_week').annotate(
            sum_squad_bought_items=Sum('buy_price')
        ).values_list('create_week', 'sum_squad_bought_items'))

        for week_time in week_times:
            labels.append(week_time.get('start').strftime('%Y-%m-%d') + ' to ' + week_time.get('end').strftime('%m-%d'))

            sum_packs = sum([item[1] for item in packs if (item[0] and item[0] == week_time.get('start').timestamp())])
            sum_sbc_bought_items = sum([item[1] for item in sbc_bought_items if (item[0] and item[0] == week_time.get('start').timestamp())])
            sum_squad_bought_items = sum([item[1] for item in squad_bought_items if (item[0] and item[0] == week_time.get('start').timestamp())])

            pure_generate = sum_packs - (sum_sbc_bought_items + sum_squad_bought_items)
            sum_packs_list.append(sum_packs)
            sum_sbc_bought_items_list.append(sum_sbc_bought_items)
            sum_squad_bought_items_list.append(sum_squad_bought_items)
            pure_generate_list.append(pure_generate)

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'line',
                    'label': _('Sum Packs'),
                    'data': sum_packs_list,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }, {
                    'label': _('SBC Bought'),
                    'data': sum_sbc_bought_items_list,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 1) * len(
                        sum_sbc_bought_items_list),
                    'borderWidth': 1,
                }, {
                    'label': _('Squad Bought'),
                    'data': sum_squad_bought_items_list,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 4) * len(
                        sum_squad_bought_items_list),
                    'borderWidth': 1,
                }, {
                    'label': _('Generate'),
                    'data': pure_generate_list,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 2) * len(
                        pure_generate_list),
                    'borderWidth': 1,
                },
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


    def get_weeks(self, start_date, end_date):
        weeks = []
        delta = datetime.timedelta(days=7)
        current_date = start_date
        while current_date <= end_date:
            week = {
                'start': current_date,
                'end': (current_date + datetime.timedelta(days=6)).replace(hour=23, minute=59)
            }
            weeks.append(week)
            current_date += delta
        return weeks


class SBCSquadTradeSalaryChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Salary')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = FifaAccount
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    @cached_method(timeout=60*60)
    def get_chart_config(self):
        # week_times = self.get_weeks(datetime.datetime(2024, 3, 3), datetime.datetime.now())
        week_times = self.kwargs.get('week_times')
        # queryset = self.model.objects.filter(
        #     Q(delete_console_reason=None) | Q(delete_console_reason='')
        # ).exclude(
        #     Q(console=None) | Q(console__investor=None)
        # ).exclude(
        #     console__investor__id=18
        # # ).annotate(
        # #     create_time_epoch=Extract('create_time', 'epoch')
        # )
        # queryset = queryset.related_to(self.request.user)

        # queryset_list = list(queryset.values_list('id', flat=True))
        queryset_list = self.kwargs.get('queryset_list')
        credit_queryset = list(FifaAccountCreditLog.objects.filter(
        # ).annotate(
        #     create_time_epoch=Extract('create_time', 'epoch')
            create_time__gt=timezone.datetime(2024, 3, 3),
            fifa_account__id__in=queryset_list,
        ).annotate(
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None)
            )
        ).values('create_week').annotate(
            sum_invest_trade_generation=Sum('invest_trade_generation')
        ).values_list('create_week', 'sum_invest_trade_generation'))

        filterset = self.filterset
        # print('filterset : ', filterset.request)
        # queryset = self.filter_queryset(queryset, filterset=filterset)
        labels = []
        all_list = []
        # sum_bought_items_list = []
        packs_pure_generate_list = []
        trade_generate_list = []

        # packs = list(ItemPack.objects.filter(
        #     fifa_account__id__in=queryset_list,
        #     create_time__gte=datetime.datetime(2024, 3, 3)
        # ).annotate(
        #     create_week=Case(
        #         *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
        #                then=Value(week_time.get('start').timestamp())) for week_time in week_times],
        #         default=Value(None), output_field=IntegerField()),
        # ).values('create_week').annotate(sum_packs=Sum('pack_value')).values_list('create_week', 'sum_packs'))
        packs = self.kwargs.get('packs')

        bought_items = list(AccountBoughtItem.objects.filter(
            fifa_account__id__in=queryset_list,
            create_time__gte=datetime.datetime(2024, 3, 3),
        ).annotate(
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None), output_field=IntegerField()),
        ).values('create_week').annotate(
            sum_bought_items=Sum('buy_price')
        ).values_list('create_week', 'sum_bought_items'))

        for week_time in self.get_weeks(datetime.datetime(2024, 3, 3), datetime.datetime.now()):
            labels.append(week_time.get('start').strftime('%Y-%m-%d') + ' to ' + week_time.get('end').strftime('%m-%d'))

            sum_packs = sum([item[1] for item in packs if item[0] == week_time.get('start').timestamp()])
            sum_bought_items = sum([item[1] for item in bought_items if item[0] == week_time.get('start').timestamp()])

            all_generate = sum([item[1] for item in credit_queryset if item[0] == week_time.get('start').timestamp()])

            all_list.append(all_generate)
            # sum_bought_items_list.append(sum_bought_items)
            packs_pure_generate_list.append(sum_packs - sum_bought_items)
            trade_generate_list.append(all_generate - (sum_packs - sum_bought_items))

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'line',
                    'label': _('All'),
                    'data': all_list,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }, {
                    'label': _('Packs Generate'),
                    'data': packs_pure_generate_list,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 2) * len(
                        packs_pure_generate_list),
                    'borderWidth': 1,
                }, {
                    'label': _('Trade Generate'),
                    'data': trade_generate_list,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 4) * len(
                        trade_generate_list),
                    'borderWidth': 1,
                },
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


    def get_weeks(self, start_date, end_date):
        weeks = []
        delta = datetime.timedelta(days=7)
        current_date = start_date
        while current_date <= end_date:
            week = {
                'start': current_date,
                'end': (current_date + datetime.timedelta(days=6)).replace(hour=23, minute=59)
            }
            weeks.append(week)
            current_date += delta
        return weeks


class SBCSquadTradeSalary2ChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Salary')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = FifaAccount
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    @cached_method(timeout=60 * 60)
    def get_chart_config(self):
        # week_times = self.get_weeks(datetime.datetime(2024, 3, 3), datetime.datetime.now())
        week_times = self.kwargs.get('week_times')
        # queryset = self.model.objects.filter(
        #     Q(delete_console_reason=None) | Q(delete_console_reason='')
        # ).exclude(
        #     Q(console=None) | Q(console__investor=None)
        # ).exclude(
        #     console__investor__id=18
        # )
        # queryset_list = list(queryset.values_list('id', flat=True))
        queryset_list = self.kwargs.get('queryset_list')

        credit_queryset = list(FifaAccountCreditLog.objects.filter(
            create_time__gt=timezone.datetime(year=2024, month=3, day=3),
            fifa_account__id__in=queryset_list,
        ).annotate(
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None)
            )
        ).values('create_week').annotate(
            sum_invest_trade_generation=Sum('invest_trade_generation')
        ).values_list('create_week', 'sum_invest_trade_generation'))

        filterset = self.filterset

        labels = []
        all_list = []
        # sum_bought_items_list = []
        packs_pure_generate_list = []
        trade_generate_list = []

        sold_items = list(AccountSoldItem.objects.filter(
            create_time__gt=timezone.datetime(year=2024, month=3, day=3),
            fifa_account__id__in=queryset_list,
            is_sold=True,
            buy_price=Value(0),
        ).annotate(
            sold_price=Case(
                When(is_quick_sell=False, then=F('sell_price')),
                When(is_quick_sell=True, then=F('discard_value')),
                default=Value(0)),
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None), output_field=IntegerField()),
        ).values('create_week').annotate(sum_sold_price=Sum('sold_price')).values_list('create_week', 'sum_sold_price'))


        bought_items = list(AccountBoughtItem.objects.filter(
            create_time__gt=timezone.datetime(year=2024, month=3, day=3),
            fifa_account__id__in=queryset_list,
        ).annotate(
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None), output_field=IntegerField()),
        ).values('create_week').annotate(sum_buy_price=Sum('buy_price')).values_list('sum_buy_price', 'create_week'))

        for week_time in week_times:
            labels.append(week_time.get('start').strftime('%Y-%m-%d') + ' to ' + week_time.get('end').strftime('%m-%d'))

            sum_sold_items = sum([item[1] for item in sold_items if item[0] == week_time.get('start').timestamp()])
            if sum_sold_items:
                sum_sold_items = sum_sold_items - (sum_sold_items * .05)
            sum_bought_items = sum([item[1] for item in bought_items if item[0] == week_time.get('start').timestamp()])

            all_generate = sum([item[1] for item in credit_queryset if item[0] == week_time.get('start').timestamp()])

            all_list.append(all_generate)
            # sum_bought_items_list.append(sum_bought_items)
            packs_pure_generate_list.append(sum_sold_items - sum_bought_items)
            trade_generate_list.append(all_generate - (sum_sold_items - sum_bought_items))

        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'line',
                    'label': _('All'),
                    'data': all_list,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }, {
                    'label': _('Packs Generate'),
                    'data': packs_pure_generate_list,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 2) * len(
                        packs_pure_generate_list),
                    'borderWidth': 1,
                }, {
                    'label': _('Trade Generate'),
                    'data': trade_generate_list,
                    'stack': 'stack-0',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 4) * len(
                        trade_generate_list),
                    'borderWidth': 1,
                },
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


    def get_weeks(self, start_date, end_date):
        weeks = []
        delta = datetime.timedelta(days=7)
        current_date = start_date
        while current_date <= end_date:
            week = {
                'start': current_date,
                'end': (current_date + datetime.timedelta(days=6)).replace(hour=23, minute=59)
            }
            weeks.append(week)
            current_date += delta
        return weeks


class SBCSquadTradeSalary3ChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Trade quick sold')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = FifaAccount
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DailyCreditGeneratedReportFilterSet
    table_class = SummaryTable

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        return kwargs

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    @cached_method(timeout=60 * 60)
    def get_chart_config(self):
        # week_times = self.get_weeks(datetime.datetime(year=2024, month=3, day=3), datetime.datetime.now())
        week_times = self.kwargs.get('week_times')
        # queryset = self.model.objects.filter(
        #     Q(delete_console_reason=None) | Q(delete_console_reason='')
        # ).exclude(
        #     Q(console=None) | Q(console__investor=None)
        # ).exclude(
        #     console__investor__id=18
        # )
        # queryset_list = list(queryset.values_list('id', flat=True))
        queryset_list = self.kwargs.get('queryset_list')


        filterset = self.filterset
        labels = []
        all_list = []

        sold_items = list(AccountSoldItem.objects.filter(
            create_time__gt=timezone.datetime(year=2024, month=3, day=3),
            fifa_account__id__in=queryset_list,
            is_sold=True,
            buy_price__gt=Value(0),
            is_quick_sell=True,
            item_type='player',
        ).annotate(
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None), output_field=IntegerField()),
        ).values('create_week').annotate(sum_sold_count=Count('id')).values_list('create_week', 'sum_sold_count'))

        for week_time in week_times:
            labels.append(week_time.get('start').strftime('%Y-%m-%d') + ' to ' + week_time.get('end').strftime('%m-%d'))

            sold_items_count = sum([item[1] for item in sold_items if item[0] == week_time.get('start').timestamp()])
            all_list.append(sold_items_count)


        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'line',
                    'label': _('All'),
                    'data': all_list,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


    def get_weeks(self, start_date, end_date):
        weeks = []
        delta = datetime.timedelta(days=7)
        current_date = start_date
        while current_date <= end_date:
            week = {
                'start': current_date,
                'end': (current_date + datetime.timedelta(days=6)).replace(hour=23, minute=59)
            }
            weeks.append(week)
            current_date += delta
        return weeks


class SBCSquadTradeSalary4ChartDashboardCard(SBCSquadTradeSalary3ChartDashboardCard):
    title = _('Packs player quick sold')

    @cached_method(timeout=60 * 60)
    def get_chart_config(self):
        # week_times = self.get_weeks(datetime.datetime(2024, 3, 3), datetime.datetime.now())
        week_times = self.kwargs.get('week_times')
        # queryset = self.model.objects.filter(
        #     Q(delete_console_reason=None) | Q(delete_console_reason='')
        # ).exclude(
        #     Q(console=None) | Q(console__investor=None)
        # ).exclude(
        #     console__investor__id=18
        # )
        # queryset_list = list(queryset.values_list('id', flat=True))
        queryset_list = self.kwargs.get('queryset_list')
        filterset = self.filterset
        labels = []
        all_list = []

        sold_items = list(AccountSoldItem.objects.filter(
            create_time__gt=timezone.datetime(year=2024, month=3, day=3),
            fifa_account__id__in=queryset_list,
            is_sold=True,
            buy_price=Value(0),
            is_quick_sell=True,
            item_type='player',
        ).annotate(
            create_week=Case(
                *[When(Q(create_time__gte=week_time.get('start')) & Q(create_time__lte=week_time.get('end')),
                       then=Value(week_time.get('start').timestamp())) for week_time in week_times],
                default=Value(None), output_field=IntegerField()),
        ).values('create_week').annotate(sum_sold_count=Count('id')).values_list('create_week', 'sum_sold_count'))

        for week_time in week_times:
            labels.append(week_time.get('start').strftime('%Y-%m-%d') + ' to ' + week_time.get('end').strftime('%m-%d'))

            sold_items_count = sum([item[1] for item in sold_items if item[0] == week_time.get('start').timestamp()])
            all_list.append(sold_items_count)


        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'line',
                    'label': _('All'),
                    'data': all_list,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }


class ItemPackChartReportChartDashboardCard(TableDashboardCard, ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart-table.html'
    title = _('Salary')
    title_mdi = 'mdi-sale'
    # title_link = reverse_lazy('panel:monthly-sale-report')
    model = ItemPack
    # ordering = ('date',)
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = ItemPackChartReportFilterSet
    table_class = SummaryTable

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if not kwargs['data']:
            kwargs['data'] = QueryDict(mutable=True)
        data: QueryDict = kwargs['data']
        data._mutable = True
        start_date = normalize_month_range(
            start_date=timezone.localtime() - timezone.timedelta(days=31), future_months=0)[0]
        end_date = normalize_month_range(future_months=0)[1]
        data.setdefault('start_date', start_date.strftime('%Y-%m-%d'))
        data.setdefault('end_date', end_date.strftime('%Y-%m-%d'))
        data.setdefault('period_time', 12)
        return kwargs

    def get_table_data(self):
        if not self.table_data:
            return [{'title': '', 'sum': 0}]
        return self.table_data

    # def get_queryset(self):
    #     return None

    def extra_filter_remaining_queryset(self, queryset):
        return queryset

    def get_chart_config(self):
        queryset = self.model.objects.filter(
            Q(fifa_account__delete_console_reason=None) | Q(fifa_account__delete_console_reason='')
        ).exclude(
            Q(fifa_account__console=None) | Q(fifa_account__console__investor=None)
        ).filter(pack_value__gt=0)
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        queryset = self.filter_queryset(queryset, filterset=filterset)
        period_filter = self.request.GET.dict().get('period_time', None)
        start_time = timezone.datetime.strptime(self.request.GET.dict().get('start_date', (
                timezone.localtime() - timezone.timedelta(days=10)).strftime('%Y-%m-%d %H:%M')), '%Y-%m-%d %H:%M'
                                                ).replace(tzinfo=pytz.timezone(settings.TIME_ZONE), minute=0)
        end_time = timezone.datetime.strptime(
            self.request.GET.dict().get('end_date', timezone.localtime().strftime('%Y-%m-%d %H:%M')),
            '%Y-%m-%d %H:%M').replace(tzinfo=pytz.timezone(settings.TIME_ZONE), minute=0)
        interval_queryset = queryset.annotate(
            one_hour_interval=Trunc('create_time', kind='hour')
        ).values('one_hour_interval').annotate(
            avg_value=Avg('pack_value'),
            avg_count=Count('id')
        ).order_by('one_hour_interval')
        list_queryset = list(interval_queryset)
        time_intervals = []
        # start_time = timezone.localtime().replace(minute=0) - timezone.timedelta(days=30)
        # end_time = timezone.localtime().replace(minute=0)
        current_time = start_time
        interval_hours = 12
        if period_filter:
            interval_hours = period_filter
        while current_time <= end_time:
            time_intervals.append((current_time, current_time + timezone.timedelta(hours=int(interval_hours))))
            current_time += timezone.timedelta(hours=int(interval_hours))
        labels = []
        values_console_trade_salary = []
        opened_pack_count = []
        for interval in time_intervals:
            two_hour_data = []
            two_hour_count = []
            for nn in list_queryset:
                if interval[0] < nn.get('one_hour_interval') < interval[1]:
                    two_hour_data.append(nn.get('avg_value'))
                    two_hour_count.append(nn.get('avg_count'))
            # two_hour_data = [i.get('avg_value') or 0 for i in list_queryset if
            #                  interval[0] < i.get('one_hour_interval') < interval[1]]
            labels.append(interval[0].strftime('%Y-%m-%d %H:%M'))
            values_console_trade_salary.append(int(sum(two_hour_data) / len(two_hour_data)) if len(two_hour_data) else 0)
            opened_pack_count.append(sum(two_hour_count))
        return {
            'type': 'bar',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'bar',
                    'label': _('avg'),
                    'data': values_console_trade_salary,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'borderColor': self.get_chart_dataset_background_color(1, 3)[0],
                    'lineWidth': 2,
                    'fill': False,
                    # 'hidden':True,
                    # 'showLine': False,
                    # 'steppedLine': 'middle',
                    'datalabels': {
                        'display': True,
                    },
                }, {
                    'label': _('count'),
                    'data': opened_pack_count,
                    'stack': 'stack-1',
                    'backgroundColor': self.get_chart_dataset_background_color(1, 4) * len(opened_pack_count),
                    'borderWidth': 1,
                },
                ],
            },
            'options': {
                'scales': {
                    'xAxes': [{
                        'stacked': True,
                        'autoSkip': False,
                    }],
                    'yAxes': [{
                        'stacked': True,
                        'ticks': {
                            'beginAtZero': True,
                        },
                    }],
                },
                'tooltips': {
                    'mode': 'index',
                    # 'intersect': False,
                },
                'legend': {
                    'display': True,
                    'position': 'bottom',
                },
                'plugins': {
                    'labels': {
                        'render': 'value',
                    },
                }
            }
        }
