from rest_framework import viewsets
from utils.page import MyPageNumberPagination
from utils.md5 import Md5
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.response import Response
from rest_framework.exceptions import APIException
from django.http import StreamingHttpResponse
from rest_framework.settings import api_settings
from django.db import transaction  
from rest_framework import status

from reportcenter.models import flowModel as flowlist
from . import serializers
from .filter import FlowFilter
from .files import  FileFlowListRenderCN


class FileListDownloadView(viewsets.ModelViewSet):
    renderer_classes = (FileFlowListRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "document_date" ]
    filter_class = FlowFilter

    def get_project(self):
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        id = self.get_project()
        if self.request.user:
            if id is None:
                return flowlist.objects.filter()
            else:
                return flowlist.objects.filter(id=id)
        else:
            return flowlist.objects.none()

    def get_serializer_class(self):
        if self.action in ['list']:
            return serializers.flowSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    def get_render(self, data):
        # lang = self.request.META.get('HTTP_LANGUAGE')
        # if lang:
        #     if lang == 'zh-hans':
        #         return FileListRenderCN().render(data)
        #     else:
        #         return FileListRenderEN().render(data)
        # else:
        #     return FileListRenderEN().render(data)
        return FileFlowListRenderCN().render(data)


    def list(self, request, *args, **kwargs):
        from datetime import datetime
        dt = datetime.now()
        data = (
            serializers.flowSerializer(instance).data
            for instance in self.filter_queryset(self.get_queryset())
        )
        renderer = self.get_render(data)
        response = StreamingHttpResponse(
            renderer,
            content_type="text/csv"
        )
        response['Content-Disposition'] = "attachment; filename='stocklist_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
        return response

class FlowsStatsViewSet(viewsets.ModelViewSet):

    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]

    filter_class = FlowFilter
    pagination_class = MyPageNumberPagination
   


    """
        list:
            Response a data list(all)
        post:
            Create a new data(create)
    """
    

    def get_project(self):
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None
    

    def get_queryset(self):
        id = self.get_project()

        if self.request.user:
            if id is None:
                return flowlist.objects.filter()
            else:
                return flowlist.objects.filter(id=id)
        else:
            return flowlist.objects.none()

    def get_serializer_class(self):
        if self.action in ['list', 'create', ]:
            return serializers.flowSerializer
        # elif self.action in ['retrieve','update',]:
        #     return serializers.stocklistpartialSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    # def create(self, request, *args, **kwargs):
    #     data = request.data.copy()
    #     warehouse_code = data.get('warehouse_code')
    #     warehouse_name = data.get('warehouse_name')
    #     shelf_type = data.get('shelf_type')
    #     shelf_name = data.get('shelf_name')
        
    #     rows = int(data.get('rows', 0))
    #     cols = int(data.get('cols', 0))
    #     layers = int(data.get('layers', 0))

        
    #     existing_positions = flowlist.get_existing_positions(warehouse_code,shelf_name, rows, cols, layers)

    #     # 生成所有可能的坐标
    #     instances = []
    #     for r in range(1, rows+1):
    #         for c in range(1, cols+1):
    #             for l in range(1, layers+1):
    #                 if (r, c, l) not in existing_positions  :
    #                     instances.append(flowlist(
    #                         warehouse_code=warehouse_code,
    #                         warehouse_name=warehouse_name,
    #                         shelf_type=shelf_type,
    #                         shelf_name=shelf_name,
    #                         row=r,
    #                         col=c,
    #                         layer=l,

    #                     ))
    #     try:
    #         with transaction.atomic():
    #             flowlist.objects.bulk_create(instances, batch_size=1000)
    #     except Exception as e:
    #         return Response(
    #             {"error": str(e)},
    #             status=status.HTTP_500_INTERNAL_SERVER_ERROR
    #         )

    #     return Response({
    #         "created": len(instances),
    #         "skipped": (rows*cols*layers) - len(instances)
    #     }, status=status.HTTP_201_CREATED)
        
    # def update(self, request, pk):
    #     qs = self.get_object()
    #     print(qs.id)
    #     # return Response({"detail": "暂不支持修改"}, status=status.HTTP_400_BAD_REQUEST)
       
    #     data = self.request.data
    #     print(data)
    #     serializer = self.get_serializer(qs, data=data)
    #     serializer.is_valid(raise_exception=True)
    #     serializer.save()
    #     headers = self.get_success_headers(serializer.data)
    #     return Response(serializer.data, status=200, headers=headers)

    # def retrieve(self, request, pk):
    #     qs = self.get_object()
    #     serializer = self.get_serializer(qs)
    #     return Response(serializer.data)