# from mfire.models import *
# #from .serializers import UserSerializer
# from rest_framework import viewsets
# from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from mfire.models import *
from .serializers import *
from rest_framework.generics import ListAPIView
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework import viewsets #imp
from rest_framework.response import Response
from rest_framework import status
from django.contrib.auth import authenticate
from api.renderers import UserRenderer
from rest_framework_simplejwt.tokens import RefreshToken
from django.http import HttpResponse
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser #file imag upload
#
from django.db.models import Max, Subquery
from django.http import JsonResponse
from django.contrib.auth import authenticate,logout,login



# token manual genrate
def get_tokens_for_user(user):
    refresh = RefreshToken.for_user(user)
    
    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }

# # Create your views here.
class loginuser(APIView):
    renderer_classes = [UserRenderer]
    def post(self, request, formate=None):
        serializer = LoginSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            email = serializer.data.get('email')
            password = serializer.data.get('password')
            user = authenticate(email=email, password=password)
            if user is not None:
                
                userid = user.id
                user_type = user.user_type
                # offline code
                # if user_type == '1' or user_type == 1:
                #     empid = SiteModelProduct.objects.filter(empid__id=userid).values_list('modelno', flat=True)
                # else:
                #     empid = SiteModelProduct.objects.values_list('modelno', flat=True)

                # #empid = SiteModelProduct.objects.all().values('modelno')
                # product2serializer = []
                # for site_model in empid:
                #     product10 = FireExtinguisherHPCL.objects.filter(smpid__modelno=site_model).order_by('-id').select_related('smpid','empid')[:1]
                #     if product10:
                #         model10_serializer = Product10ScaneSerializer(product10, many=True)
                #         product2serializer.append(model10_serializer.data)
                
                #     product11 = FireHydrantHPCL.objects.filter(smpid__modelno=site_model).order_by('-id').select_related('smpid','empid')[:1]
                #     if product11:
                #         model11_serializer = Product11ScaneSerializer(product11, many=True)
                #         product2serializer.append(model11_serializer.data)

                # Get all unique model numbers
                if user_type == '1' or user_type == 1:
                    empid = SiteModelProduct.objects.filter(empid__id=userid).values_list('modelno', flat=True).distinct()
                else:
                    empid = SiteModelProduct.objects.values_list('modelno', flat=True).distinct()

                # Get the latest entry for each unique model number in FireExtinguisherHPCL
                latest_fire_extinguishers = FireExtinguisherHPCL.objects.filter(smpid__modelno__in=empid).values('smpid__modelno').annotate(latest_id=Max('id'))
                fire_extinguishers = FireExtinguisherHPCL.objects.filter(id__in=Subquery(latest_fire_extinguishers.values('latest_id')))

                latest_fire_hydrants = FireHydrantHPCL.objects.all().values('smpid__modelno').annotate(latest_id=Max('id'))
                fire_hydrants = FireHydrantHPCL.objects.filter(id__in=Subquery(latest_fire_hydrants.values('latest_id')))

                # Serialize the retrieved entries
                model10_serializer = Product10ScaneSerializer(fire_extinguishers, many=True)
                model11_serializer = Product11ScaneSerializer(fire_hydrants, many=True)

                # Combine the serialized data
                product2serializer = model10_serializer.data + model11_serializer.data

                response_data = {
                    'product': product2serializer,
                }
                #end ofline
                return Response({'msg':'Login Success','user_id':userid,'user_type':user_type,'offline':response_data}, status=status.HTTP_200_OK)
            else:
                return Response({'msg':'Email or Password is not Valid'}, status=status.HTTP_200_OK)
        return Response(serializer.error, status=status.HTTP_404_BAD_REQUEST) #
        
class userprofile(APIView):
    #renderer_classes = [UserRenderer]
    #permission_classes = [IsAuthenticated]
    def get(self, request, formate=None):
        serializer = ProfileSerializer(request.data)
        return Response(serializer.data, status=status.HTTP_200_OK)
        
class userpasswordreset(APIView):
    renderer_classes = [UserRenderer]
    def post(self, request, formate=None):
        serializer = UserResetPasswordSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            return Response({'msg':'Password Send To Your Mail'}, status=status.HTTP_200_OK)
        return Response({'msg':'Enter a valid email address'}, status=status.HTTP_200_OK)
        
class all_clients(APIView):
    #permission_classes = [IsAuthenticated]
    def get(self, request, formate=None):
        id = request.GET.get('id')
        if User.objects.filter(user_type='1',id=id):
            client = SiteModelProduct.objects.filter(empid=id)
            if  client:
                serializer = ClientSerializer(client, many=True)
                return Response(serializer.data, status=status.HTTP_200_OK)
            else:
                return Response({'msg':'Client Data Not Found'}, status=status.HTTP_200_OK)
        else:
            return Response({'msg':'Wrong Employee Id'}, status=status.HTTP_200_OK)
import json
 
 
 ### scan product by qr code api 
 
class scanproducts(APIView):
    def get(self, request, formate=None):
        modelno = request.GET.get('modelno')
        clientid = request.GET.get('clientid')
        if SiteModelProduct.objects.filter(modelno=modelno):
            if  SiteModelProduct.objects.filter(clientid=clientid,modelno=modelno):
                getmodel = SiteModelProduct.objects.filter(modelno=modelno)
                serializer = ProductScaneSerializer(getmodel, many=True)
                getpro = get_object_or_404(SiteModelProduct, modelno=modelno)
                many = False
                id = getpro.pid.id
                if id == 1:
                    getp1 = SiteModelProductDetailHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product1ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 2:
                    getp1 = FireHydrantHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product2ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 3:
                    getp1 = HoseReelHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product3ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 4:
                    getp1 = FireBucketHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product4ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                if id == 5:
                    getp1 = FirePumpHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product5ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 6:
                    getp1 = FireDetectionHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product6ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 7:
                    getp1 = PortableMonitorHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product7ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 8:
                    getp1 = SuppresionSystemHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product8ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 9:
                    getp1 = ControlValveHistory.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product9ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 10:
                    getp1 = FireExtinguisherHPCL.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product10ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
                elif id == 11:
                    getp1 = FireHydrantHPCL.objects.filter(smpid__modelno=modelno).order_by('-id')[:1]
                    serializer2 = Product11ScaneSerializer(getp1, many=True)
                    product_info = serializer2.data
                    client_info = serializer.data 
                    context = {'id':id,'client_info':client_info,'product_info':product_info}
                    return Response(context, status=status.HTTP_200_OK)
            else:
                return Response({'msg':'model no. is not associate with Client'}, status=status.HTTP_200_OK)
        else:
            return Response({'msg':'Wrong Model No.'}, status=status.HTTP_200_OK)
            
            # save data api
            

class SaveProducts(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product1hisScaneSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_500_BAD_REQUEST)
            
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = SiteModelProductDetailHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product1hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_500_BAD_REQUEST)
            
class saveproducts2(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product2hisScaneSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = FireHydrantHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product2hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
class saveproducts3(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product3hisScaneSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = HoseReelHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product3hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
class saveproducts4(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product4hisScaneSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = FireBucketHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product4hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
class saveproducts5(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product5hisScaneSerializer(data=request.data)
        serializer2 = Product5FirePumpService(data=request.data)
        if serializer.is_valid(raise_exception=True) and serializer2.is_valid(raise_exception=True):
            u = serializer.save()
            serializer2.save(fire_pump_id=u)
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = FirePumpHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product5hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
class saveproducts6(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product6hisScaneSerializer(data=request.data)
        serializer2 = Product6FireDetectionService(data=request.data)
        if serializer.is_valid(raise_exception=True) and serializer2.is_valid(raise_exception=True):
            u = serializer.save()
            serializer2.save(fire_detection_id=u)
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = FireDetectionHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product6hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
class saveproducts7(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product7hisScaneSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = PortableMonitorHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product7hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
class saveproducts8(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product8hisScaneSerializer(data=request.data)
        serializer2 = Product8SuppresionSystemService(data=request.data)
        if serializer.is_valid(raise_exception=True) and serializer2.is_valid(raise_exception=True):
            u = serializer.save()
            serializer2.save(suppresion_system_id=u)
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = SuppresionSystemHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product8hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
class saveproducts9(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product9hisScaneSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
        
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = ControlValveHistory.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product9hisScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_200_OK)
            
# save product hpcl

class saveproducts10(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product10ScaneSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            plocation = request.data.get('location', '')
            punit = request.data.get('unit', '')
            smpid = request.data.get('smpid')
            instance_to_update = SiteModelProduct.objects.get(id=smpid)
            # Initialize the serializer with the instance
            smpser = SiteModelProductSerializer(instance_to_update, data=request.data)
            if smpser.is_valid():
                smpser.save()
                serializer.save()
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    # def post(self, request, *args, **kwargs):
    #     serializer = Product10ScaneSerializer(data=request.data)
        
    #     # Check if all required fields are present in the request data
    #     required_fields = set(serializer.fields.keys())
    #     missing_fields = required_fields - set(request.data.keys())
    #     if missing_fields:
    #         error_msg = f"Missing required fields: {', '.join(missing_fields)}"
    #         return Response({'error': error_msg}, status=status.HTTP_400_BAD_REQUEST)

    #     if serializer.is_valid(raise_exception=True):
    #         serializer.save()
    #         return Response({'msg': 'Data saved'}, status=status.HTTP_200_OK)
    #     else:
    #         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = FireExtinguisherHPCL.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product10ScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
            
class saveproducts11(APIView):
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    def post(self, request, *args, **kwargs):
        serializer = Product11ScaneSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'data save'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
    def put(self, request, pk, format=None):
        try:
            id = pk 
            cl1 = FireHydrantHPCL.objects.get(pk=id)
        except:
            return Response({'error':'wrong id'}, status=status.HTTP_200_OK)
        serializer = Product11ScaneSerializer(cl1, data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({'msg':'Data Update'}, status=status.HTTP_200_OK)
        else:
            return Response(serializer.error, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

# end
            
class scanproductsnewcode(APIView):
    def get(self, request, formate=None):
        id = request.GET.get('id')
        if User.objects.filter(user_type='1',id=id):
            client = SiteModelProduct.objects.filter(empid=id).value('clientid').distinct()
            if  client:
                serializer = ClientSerializer(client, many=True)
                return Response(serializer.data, status=status.HTTP_200_OK)
            else:
                return Response({'msg':'Client Data Not Found'}, status=status.HTTP_200_OK)
        else:
            return Response({'msg':'Wrong Employee Id'}, status=status.HTTP_200_OK)
            
            # offline
            
from django.db.models import OuterRef, Subquery

class OfflineMode(APIView):
    def get(self, request, formate=None):
        # client
        id = request.GET.get('id')
        empid = SiteModelProduct.objects.filter(empid=id,pid='10').values('modelno')
        allsmp = SiteModelProduct.objects.filter(pid='11').values('modelno')
        ### product  serializer
        product2serializer = []
        for site_model in empid:
            product10 = FireExtinguisherHPCL.objects.filter(smpid__modelno=site_model['modelno']).order_by('-id').select_related('smpid','empid')[:1]
            if product10:
                model10_serializer = Product10ScaneSerializer(product10, many=True)
                product2serializer.append(model10_serializer.data)
        
        for site_model in allsmp:
            product11 = FireHydrantHPCL.objects.filter(smpid__modelno=site_model['modelno']).order_by('-id').select_related('smpid','empid')[:1]
            if product11:
                model11_serializer = Product11ScaneSerializer(product11, many=True)
                product2serializer.append(model11_serializer.data)
                
        response_data = {
            'product': product2serializer,
        }

        return Response(response_data)



        