from django.db.models import Sum
from django.http import QueryDict
from django.utils import timezone

from sniper.filters import DischargePerDayLogListFilter
from sniper.models import DischargePerDay
from utils.dashboard_cards import FilterDashboardCard, ChartDashboardCard, height_16_8
from utils.date_utils import normalize_month_range


class DischargePerDayLogChartDashboardCard(ChartDashboardCard, FilterDashboardCard):
    required_permission__all = 'manager_commands'
    template_name = 'generic_views/dashboard-cards/generic-chart.html'
    title = 'Discharge Per Day'
    title_mdi = 'mdi-sale'
    model = DischargePerDay
    chart_width = 500
    chart_height = height_16_8(chart_width)
    chart_wrapper_css = 'responsive-embed ratio_16_8'
    filterset_class = DischargePerDayLogListFilter

    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 extra_filter_remaining_queryset(self, queryset):
        return queryset

    def get_chart_config(self):
        queryset = self.model.objects.all()
        # queryset = queryset.related_to(self.request.user)

        filterset = self.filterset
        queryset = self.filter_queryset(queryset, filterset=filterset)
        queryset = queryset.values('create_time').annotate(
            sum_income_credit=Sum('income_credit'),
            sum_usdt_amount=Sum('usdt_amount'),
            sum_euro_amount=Sum('euro_amount'),
        ).order_by('create_time')
        labels = list(queryset.values_list('create_time', flat=True))
        labels = [ii.strftime('%Y-%m-%d') for ii in labels]
        values_sell_price = list(queryset.values_list('sum_usdt_amount', flat=True))

        return {
            'type': 'line',
            'data': {
                'labels': labels,
                'datasets': [{
                    'type': 'bar',
                    'label': 'discharge mode 2',
                    'data': values_sell_price,
                    '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': False,
                    },
                },
                ],
            },
            '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',
                    },
                }
            }
        }
