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 stock.models import StockshelfModel as shelflist
from . import serializers
from .filter import StockBinFilter,StockshelfFilter

from .files import FileListRenderCN, FileListRenderEN, FileBinListRenderCN, FileBinListRenderEN
from rest_framework.settings import api_settings
from django.db import transaction  
from rest_framework import status

class stockshelfViewSet(viewsets.ModelViewSet):


    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = StockshelfFilter
    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 shelflist.objects.filter()
            else:
                return shelflist.objects.filter(id=id)
        else:
            return shelflist.objects.none()

    def get_serializer_class(self):
        if self.action in ['list', 'create', ]:
            return serializers.stockShelfSerializer
        elif self.action in ['retrieve','update',]:
            return serializers.stockShelfpartialSerializer
        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 = shelflist.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(shelflist(
                            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():
                shelflist.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)



class StockBinViewSet(viewsets.ModelViewSet):
    

    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = StockBinFilter
    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 shelflist.objects.filter()
            else:
                return shelflist.objects.filter(id=id)
        else:
            return shelflist.objects.none()

    def get_serializer_class(self):
        if self.action in ['list', 'create', ]:
            return serializers.stocklistSerializer
        # 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 = shelflist.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(shelflist(
    #                         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():
    #             shelflist.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)