from rest_framework import viewsets
from utils.page import MyPageNumberPagination
from utils.datasolve import sumOfList, transportation_calculate
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.utils import timezone



from .models import AsnListModel, AsnDetailModel
from .filter import AsnListFilter, AsnDetailFilter
from .serializers import ASNListGetSerializer, ASNListPostSerializer, ASNDetailGetSerializer,ASNDetailPostSerializer
from .files import FileListRenderCN, FileDetailRenderCN

from warehouse.models import ListModel as warehouse

from warehouse.models import ListModel as warehouse
from staff.models import ListModel as staff

from rest_framework.permissions import AllowAny




class AsnListViewSet(viewsets.ModelViewSet):
    """
        retrieve:
            Response a data list(get)
        list:
            Response a data list(all)
        create:
            Create a data line(post)

        delete:
            Delete a data line(delete)

    """
    authentication_classes = []  # 禁用所有认证类
    permission_classes = [AllowAny]  # 允许任意访问
    
    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = AsnListFilter

    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 AsnListModel.objects.filter( is_delete=False)
            else:
                return AsnListModel.objects.filter( id=id, is_delete=False)
        else:
            return AsnListModel.objects.none()

    def get_serializer_class(self):
        if self.action in ['list', 'destroy']:
            return ASNListGetSerializer
        elif self.action in ['create', 'update']:
            return ASNListPostSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    def create(self, request, *args, **kwargs):

        data = self.request.data
        if AsnListModel.objects.filter(code=data['code'], is_delete=False).exists():
            raise APIException({"detail": "Data exists"})
        else:
            data['openid'] = self.request.auth.openid
            qs_set = AsnListModel.objects.filter(openid=self.request.auth.openid,asn_type=data['asn_type'], is_delete=False)
            order_day =str(timezone.now().strftime('%Y%m%d'))
            if len(qs_set) > 0:
                asn_last_code = qs_set.order_by('-id').first().asn_code
                if str(asn_last_code[3:11]) == order_day:
                    order_create_no = f"{int(asn_last_code[11:]) + 1:03d}"
                    data['asn_code'] = data['asn_type'] + order_day + order_create_no
                else:
                    data['asn_code'] = data['asn_type'] + order_day + '001'
            else:
                data['asn_code'] = data['asn_type'] + order_day + '001'
    
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()

            AsnDetailModel.objects.create(
                openid=self.request.auth.openid,
                asn_code=serializer.data['asn_code'],
                asn_type=serializer.data['asn_type'],
                asn_status=serializer.data['asn_status'],
                
                goods_code=serializer.data['goods_code'],
                goods_desc=serializer.data['goods_desc'],
                goods_qty=serializer.data['goods_qty'],
                goods_weight=serializer.data['goods_weight'],

                creater =  serializer.data['creater'],
          

            )
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)
    
    def update(self, request, pk):
        qs = self.get_object()
        data = self.request.data
        serializer = self.get_serializer(qs, data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        qs_detail = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=data['asn_code'], is_delete=False)
        serializer_detail = ASNDetailPostSerializer(qs_detail.first(), data=data)
        serializer_detail.is_valid(raise_exception=True)
        serializer_detail.save()


        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"})
        else:
            qs.is_delete = True
            asn_detail_list = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=qs.asn_code, is_delete=False)
            asn_detail_list.update(is_delete=True)
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)
       

class AsnDetailViewSet(viewsets.ModelViewSet):
    """
        retrieve:
            Response a data list(get)

        list:
            Response a data list(all)

        create:
            Create a data line(post)

        update:
            Update a data(put:update)
    """
    
    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = AsnDetailFilter

    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 AsnDetailModel.objects.filter( is_delete=False)
            else:
                return AsnDetailModel.objects.filter( id=id, is_delete=False)
        else:
            return AsnDetailModel.objects.none()

    def get_serializer_class(self):
        if self.action in ['list', 'destroy']:
            return ASNDetailGetSerializer
        elif self.action in ['update']:
            return ASNDetailPostSerializer
        else:
            return self.http_method_not_allowed(request=self.request)


    def update(self, request, pk):
        qs = self.get_object()
        data = self.request.data
        serializer = self.get_serializer(qs, data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        qs_detail = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=data['asn_code'], is_delete=False)
        serializer_detail = ASNDetailPostSerializer(qs_detail.first(), data=data)
        serializer_detail.is_valid(raise_exception=True)
        serializer_detail.save()


        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"})
        else:
            qs.is_delete = True
            asn_detail_list = AsnDetailModel.objects.filter(openid=self.request.auth.openid, asn_code=qs.asn_code, is_delete=False)
            asn_detail_list.update(is_delete=True)
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)