from django.shortcuts import render
from django.contrib.auth.hashers import make_password
from django.contrib.auth import logout

from django.conf import settings
from django.db import connection
from random import randint

from asset_management_app import models
from asset_management_app import serializers
from asset_management_app import utils

from rest_framework import permissions
from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.generics import GenericAPIView
from datetime import datetime

import os
import math
import random
import json
import pgeocode
import pandas as pd
import qrcode

class assetAllAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def post(self,request):
        try :
            serializer = serializers.asset_validate_serializers(data=request.data)             
            if not serializer.is_valid():
                return Response({"statusCode":"0", "errors":serializer.errors})  

            serializer_asset = serializers.create_asset_serializer(data=request.data)                 
            serializer_asset.is_valid(raise_exception=True)                 
            serializer_asset.save()

            request.data["asset_id"] = int(serializer_asset.data["id"])
            serializer_asset_media = serializers.create_asset_media_serializer(data=request.data)                 
            serializer_asset_media.is_valid(raise_exception=True)                 
            serializer_asset_media.save() 

            serializer_asset_loc = serializers.create_asset_location_serializer(data=request.data)               
            serializer_asset_loc.is_valid(raise_exception=True)               
            serializer_asset_loc.save() 

            combineddata = {
                "asset":serializer_asset.data,
                "asset_media":serializer_asset_media.data,
                "asset_asset_loc":serializer_asset_loc.data
            }
            return Response({"statusCode":"1","statusMessage":"Success","data":combineddata})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})
    
    def get(self,request):
        try:
            id = request.user.pk
            asset_id = request.GET.get("asset_id",None)
            if asset_id is not None:
                result = get_assetdata_byid(asset_id)
                return Response({"statusCode":"1","statusMessage":"Success","data":result})
            else:
                result = get_assetdata_byall()
                return Response({"statusCode":"1","statusMessage":"Success","data":result})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})
        
    def patch(self,request):
        try:
            asset_id = request.GET.get("asset_id",None)
            asset_media_id = request.GET.get("media_id",None)
            asset_loc_id =  request.GET.get("location_id",None)

            serializer_asset = None
            serializer_media = None
            serializer_loc = None
            if asset_id is not None and asset_media_id is not None and asset_loc_id is not None:
                if models.asset.objects.filter(id = asset_id).exists():
                    qs_asset_info = models.asset.objects.get(id = asset_id)
                    serializer_asset = serializers.create_asset_serializer(qs_asset_info, data=request.data, partial=True)
                    serializer_asset.is_valid(raise_exception=True)
                    serializer_asset.save() 
                if models.asset_media.objects.filter(id = asset_media_id).exists():
                    qs_media_info = models.asset_media.objects.get(id = asset_media_id)
                    serializer_media = serializers.create_asset_media_serializer(qs_media_info, data=request.data, partial=True)
                    serializer_media.is_valid(raise_exception=True)
                    serializer_media.save() 
                if models.asset_location.objects.filter(id =  asset_loc_id).exists():
                    qs_location_info = models.asset_location.objects.get(id = asset_loc_id)
                    serializer_loc = serializers.create_asset_location_serializer(qs_location_info, data=request.data, partial=True)
                    serializer_loc.is_valid(raise_exception=True)
                    serializer_loc.save() 

                combineddata = {
                "asset":serializer_asset.data if serializer_asset  else {},
                "asset_media":serializer_media.data if serializer_media else {},
                "asset_asset_loc":serializer_loc.data if serializer_loc else {}
                
                }
                return Response({"statusCode":"1","statusMessage":"Success","data":combineddata})
              
            elif asset_id is not None and  asset_media_id is not None:
                if models.asset.objects.filter(id = asset_id).exists():
                    qs_asset_info = models.asset.objects.get(id = asset_id)
                    serializer_asset = serializers.create_asset_serializer(qs_asset_info, data=request.data, partial=True)
                    serializer_asset.is_valid(raise_exception=True)
                    serializer_asset.save() 
                    asset_id = serializer_asset["id"]
                if models.asset_media.objects.filter(id = asset_media_id).exists():
                    qs_media_info = models.asset_media.objects.get(id = asset_media_id)
                    serializer_media = serializers.create_asset_media_serializer(qs_media_info, data=request.data, partial=True)
                    serializer_media.is_valid(raise_exception=True)
                    serializer_media.save()

                combineddata = {
                "asset":serializer_asset.data if serializer_asset.data  else {},
                "asset_media":serializer_media.data if serializer_media.data else {},
                
                }
                return Response({"statusCode":"1","statusMessage":"Success","data":combineddata})
             
            elif asset_id is not None and asset_loc_id is not None:
                if models.asset.objects.filter(id = asset_id).exists():
                    qs_asset_info = models.asset.objects.get(id = asset_id)
                    serializer_asset = serializers.create_asset_serializer(qs_asset_info, data=request.data, partial=True)
                    serializer_asset.is_valid(raise_exception=True)
                    serializer_asset.save() 
                if models.asset_location.objects.filter(id =  asset_loc_id).exists():
                    qs_location_info = models.asset_location.objects.get(id = asset_loc_id)
                    serializer_loc = serializers.create_asset_location_serializer(qs_location_info, data=request.data, partial=True)
                    serializer_loc.is_valid(raise_exception=True)
                    serializer_loc.save() 
                combineddata = {
                "asset":serializer_asset.data if serializer_asset.data  else {},
                "asset_asset_loc":serializer_loc.data if serializer_loc else {}
                
                }
                return Response({"statusCode":"1","statusMessage":"Success","data":combineddata})
               
            elif asset_media_id is not None and asset_loc_id is not None: 
                if models.asset_media.objects.filter(id = asset_media_id).exists():
                    qs_media_info = models.asset_media.objects.get(id = asset_media_id)
                    serializer_media = serializers.create_asset_media_serializer(qs_media_info, data=request.data, partial=True)
                    serializer_media.is_valid(raise_exception=True)
                    serializer_media.save() 
                if models.asset_location.objects.filter(id =  asset_loc_id).exists():
                    qs_location_info = models.asset_location.objects.get(id = asset_loc_id)
                    serializer_loc = serializers.create_asset_location_serializer(qs_location_info, data=request.data, partial=True)
                    serializer_loc.is_valid(raise_exception=True)
                    serializer_loc.save() 

                combineddata = {
              
                "asset_media":serializer_media.data if serializer_media else {},
                "asset_asset_loc":serializer_loc.data if serializer_loc else {}
                
                }
                return Response({"statusCode":"1","statusMessage":"Success","data":combineddata})
            
            elif asset_id is not None:
                if models.asset.objects.filter(id = asset_id).exists():
                    qs_asset_info = models.asset.objects.get(id = asset_id)
                    serializer_asset = serializers.create_asset_serializer(qs_asset_info, data=request.data, partial=True)
                    serializer_asset.is_valid(raise_exception=True)
                    serializer_asset.save() 
                    return Response({"statusCode":"1","statusMessage":"Success","data":serializer_asset.data})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Mismatch  id"})
            
            elif asset_media_id is not None:
                if models.asset_media.objects.filter(id = asset_media_id).exists():
                    qs_media_info = models.asset_media.objects.get(id = asset_media_id)
                    serializer_media = serializers.create_asset_media_serializer(qs_media_info, data=request.data, partial=True)
                    serializer_media.is_valid(raise_exception=True)
                    serializer_media.save() 
                    return Response({"statusCode":"1","statusMessage":"Success","data":serializer_media.data})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Mismatch  id"})
            
            elif asset_loc_id is not None:
                if models.asset_location.objects.filter(id =  asset_loc_id).exists():
                    qs_location_info = models.asset_location.objects.get(id = asset_loc_id)
                    serializer_loc = serializers.create_asset_location_serializer(qs_location_info, data=request.data, partial=True)
                    serializer_loc.is_valid(raise_exception=True)
                    serializer_loc.save() 
                    return Response({"statusCode":"1","statusMessage":"Success","data":serializer_loc.data})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Mismatch  id"})
            else:
                    return Response({"statusCode": "0", "statusMessage": "Failed", "error": "Please send id"})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})
    
    def delete(self,request):
        try:
            asset_id =  request.GET.get("asset_id",None)
            delete_db =  request.GET.get("delete_db",None)
            asset_media_id =  request.GET.get("media_id",None)
            asset_loc_id = request.GET.get("location_id",None)
            if delete_db is not None:
                if asset_id is not None:
                    if models.asset.objects.filter(id = asset_id).exists():
                        qs_asset_info = models.asset.objects.get(id = asset_id)                 
                        qs_asset_info.delete()
                        return Response({"statusCode": "1", "statusMessage": "Customer deleted successfully"})
                    else:
                      return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
                
                if asset_media_id is not None:
                    if models.asset_media.objects.filter(id = asset_media_id).exists():
                        qs_asset_info = models.asset_media.objects.get(id = asset_media_id)                 
                        qs_asset_info.delete()
                        return Response({"statusCode": "1", "statusMessage": "Customer deleted successfully"})
                    else:
                        return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
                
                if asset_loc_id is not None:
                    if models.asset_location.objects.filter(id = asset_loc_id).exists():
                        qs_asset_info = models.asset_location.objects.get(id = asset_loc_id)                 
                        qs_asset_info.delete()
                        return Response({"statusCode": "1", "statusMessage": "Customer deleted successfully"})
                    else:
                       return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
               
            else:
                if asset_id is not None and asset_media_id is None and asset_loc_id is not None:
                    request.data['is_deleted']  = "1"
                    if models.asset.objects.filter(id = asset_id).exists():
                        qs_asset_info = models.asset.objects.get(id = asset_id)
                        serializer_asset = serializers.create_asset_serializer(qs_asset_info, data=request.data, partial=True)
                        serializer_asset.is_valid(raise_exception=True)
                        serializer_asset.save() 
                        if models.asset_media.objects.filter(id = asset_media_id).exists():
                            qs_media_info = models.asset_media.objects.get(id = asset_media_id)
                            serializer_media = serializers.create_asset_media_serializer(qs_media_info, data=request.data, partial=True)
                            serializer_media.is_valid(raise_exception=True)
                            serializer_media.save()
                        if models.asset_media.objects.filter(id = asset_media_id).exists():
                            qs_media_info = models.asset_media.objects.get(id = asset_media_id)
                            serializer_media = serializers.create_asset_media_serializer(qs_media_info, data=request.data, partial=True)
                            serializer_media.is_valid(raise_exception=True)
                            serializer_media.save()
                        return Response({"statusCode": "1", "statusMessage": "asset deleted successfully"})

                if asset_id is not None:
                    request.data['is_deleted']  = "1"
                    if models.asset.objects.filter(id = asset_id).exists():
                        qs_asset_info = models.asset.objects.get(id = asset_id)
                        serializer_asset = serializers.create_asset_serializer(qs_asset_info, data=request.data, partial=True)
                        serializer_asset.is_valid(raise_exception=True)
                        serializer_asset.save() 
                        return Response({"statusCode": "1", "statusMessage": "Succcess" , "data":"Asset deleted successfully"})
                    else:
                        return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
                    
                if asset_media_id is not None:
                    if models.asset_media.objects.filter(id = asset_media_id).exists():
                        request.data['is_deleted']  = "1"
                        qs_media_info = models.asset_media.objects.get(id = asset_media_id)
                        serializer_media = serializers.create_asset_media_serializer(qs_media_info, data=request.data, partial=True)
                        serializer_media.is_valid(raise_exception=True)
                        serializer_media.save()
                        return Response({"statusCode":"1","statusMessage":"Success","data":"Asset deleted successfuuly"})
                    else:
                      return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
                    
                if asset_loc_id is not None:
                    if models.asset_location.objects.filter(id =  asset_loc_id).exists():
                        request.data['is_deleted']  = "1"
                        qs_location_info = models.asset_location.objects.get(id = asset_loc_id)
                        serializer_loc = serializers.create_asset_location_serializer(qs_location_info, data=request.data, partial=True)
                        serializer_loc.is_valid(raise_exception=True)
                        serializer_loc.save() 
                        return Response({"statusCode":"1","statusMessage":"Success","data":"Location deleted successfuuly"})
                    else:
                        return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
                     
        except Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})

def generate_qr_code(request, asset_id):
    current_time = datetime.now()
    timestamp = datetime.timestamp(current_time)

    qr = qrcode.QRCode(version=3, box_size=20, border=10, error_correction=qrcode.constants.ERROR_CORRECT_H)
    data = "https://admin.myassets.services/service-requests/create/" + str(asset_id)

    qr.add_data(data)
    qr.make(fit=True)

    media_folder = getattr(settings, "MEDIA_ROOT", None)
    if media_folder:
        path = os.path.join(media_folder, 'qrcode')
        if not os.path.exists(path):
            os.makedirs(path)

    filename = request.data['name'] + '_' + str(int(timestamp)) + '.png'
    file_path = os.path.join(path, filename)

    img = qr.make_image(fill_color="black", back_color="white")
    img.save(file_path)

    return_media_path = os.path.join(settings.MEDIA_URL, 'qrcode')
    return_media_path = return_media_path.replace('/media', 'media')
    success_image_url = return_media_path + '/' + str(filename)
    return success_image_url

class assetAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def post(self,request):
        try :
            serializer = serializers.asset_validate_serializers(data=request.data)             
            if not serializer.is_valid():
                return Response({"statusCode":"0", "errors":serializer.errors})
            
            serial_number = request.data['serial_number']
            name = request.data['name']
            if models.asset.objects.filter(name=name, serial_number=serial_number, is_active=True, is_deleted=False).exists():
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors":"Assets already exists"})

            if not models.asset.objects.filter(serial_number=serial_number, is_active=True, is_deleted=False).exists():
                # qr_code_path = generate_qr_code(request)
                # request.data['qr_scan'] = qr_code_path
            
                serializer_asset = serializers.create_asset_serializer(data=request.data)                 
                serializer_asset.is_valid(raise_exception=True)                 
                serializer_asset.save()

                qr_code_path = generate_qr_code(request, serializer_asset.data['id'])
                assets = models.asset.objects.get(pk=serializer_asset.data['id'])
                assets.qr_scan = qr_code_path
                assets.save()

                # request.data["asset_id"] = int(serializer_asset.data["id"])
                # request.data["is_primary_location"] = True
                # request.data['name'] = 'Main Branch'
                # serializer_asset_loc = serializers.create_asset_location_serializer(data=request.data)               
                # serializer_asset_loc.is_valid(raise_exception=True)               
                # serializer_asset_loc.save()   

                return Response({"statusCode":"1", "statusMessage":"Success", "data":serializer_asset.data})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})
    
    def get(self,request):
        try:
            querySet = None
            asset_id = request.GET.get("asset_id", None)
            asset_name = request.GET.get("name", None)
            asset_serial_number = request.GET.get("serial_number", None)
            purchase_date = request.GET.get("date", None)
            customer_id = request.GET.get("customer_id", None)

            sort_params = {}
            sort_params['is_active']=True
            sort_params['is_deleted']=False
            
            if asset_id is not None:
                sort_params['pk'] = asset_id
            
            if asset_name is not None:
                sort_params['name__icontains'] = asset_name

            if asset_serial_number is not None:
                sort_params['serial_number'] = asset_serial_number

            if purchase_date is not None:
                sort_params['purchase_date__icontains'] = purchase_date

            if customer_id is not None:
                sort_params['customer_id'] = customer_id

            querySet = models.asset.objects.filter(**sort_params)
            serializer = serializers.list_asset_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})
        
    def patch(self,request):
        try:
            asset_id =  request.GET.get("asset_id",None)
            if asset_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset id"})

            if not models.asset.objects.filter(pk=asset_id, is_active=True, is_deleted=False).exists():
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"asset id doesn't exists"})

            qs_asset_info = models.asset.objects.get(id=asset_id, is_active=True, is_deleted=False)
            serializer_user = serializers.create_asset_serializer(qs_asset_info, data=request.data, partial=True)
            serializer_user.is_valid(raise_exception=True)
            serializer_user.save()

            if models.asset_location.objects.filter(asset_id=asset_id, is_primary_location=True, is_active=True, is_deleted=False).exists():
                qs_location_info = models.asset_location.objects.get(asset_id=asset_id, is_primary_location=True)
                serializer_location = serializers.create_asset_location_serializer(qs_location_info, data=request.data, partial=True)
                serializer_location.is_valid(raise_exception=True)
                serializer_location.save()

            return Response({"statusCode":"1","statusMessage":"Success","data":serializer_user.data})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})
    
    def delete(self,request):
        try:
            asset_id =  request.GET.get("asset_id",None)
            if asset_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset id"})

            if not models.asset.objects.filter(pk=asset_id, is_active=True, is_deleted=False).exists():
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"asset id doesn't exists"})

            request_data = { "is_active": False, "is_deleted": True}
            qs_asset_info = models.asset.objects.get(id=asset_id, is_active=True, is_deleted=False)
            serializer = serializers.create_asset_serializer(qs_asset_info, data=request_data, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()

            if models.asset_location.objects.filter(asset_id=asset_id, is_primary_location=True, is_active=True, is_deleted=False).exists():
                qs_location_info = models.asset_location.objects.get(asset_id=asset_id, is_primary_location=True)
                serializer_location = serializers.create_asset_location_serializer(qs_location_info, data=request_data, partial=True)
                serializer_location.is_valid(raise_exception=True)
                serializer_location.save()

            return Response({"statusCode": "1", "statusMessage": "Success", "data":serializer.data})
        except Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})

class assetListAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            querySet = models.asset.objects.filter(is_active=True, is_deleted=False)
            serializer = serializers.list_asset_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class assetTransferHistoryAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            asset_id = request.GET.get("asset_id", None)
            id = request.GET.get("id", None)

            sort_params = {}
            sort_params['is_active']=True
            sort_params['is_deleted']=False

            if id is not None:
                sort_params['pk'] = id
            
            if asset_id is not None:
                sort_params['asset_id'] = asset_id
            
            querySet = models.asset_transfer_history.objects.filter(**sort_params)
            serializer = serializers.list_asset_transfer_history_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

    def post(self, request):
        try :
            serializer = serializers.asset_transfer_history_validate_serializers(data=request.data)             
            if not serializer.is_valid():
                return Response({"statusCode":"0", "errors":serializer.errors})
            
            serializer_asset_th = serializers.create_asset_transfer_history_serializer(data=request.data)                 
            serializer_asset_th.is_valid(raise_exception=True)                 
            serializer_asset_th.save()

            if models.asset_location.objects.filter(asset_id=request.data['asset_id'], location_id=request.data['from_location_id']).exists():
                qs_location_info = models.asset_location.objects.get(asset_id=request.data['asset_id'], location_id=request.data['from_location_id'])

                asset_loc_request_data = { "location_id": request.data['to_location_id'], "is_primary_location":True }
                serializer_location = serializers.create_asset_location_serializer(qs_location_info, data=asset_loc_request_data, partial=True)
                serializer_location.is_valid(raise_exception=True)
                serializer_location.save()

            return Response({"statusCode":"1", "statusMessage":"Success", "data":serializer_asset_th.data})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})

    def patch(self, request):
        try :
            id = request.GET.get("id", None)
            serializer = serializers.asset_transfer_history_validate_serializers(data=request.data)             
            if not serializer.is_valid():
                return Response({"statusCode":"0", "errors":serializer.errors})

            qs_asset_th = models.asset_transfer_history.objects.get(pk=id)
            serializer_asset_th = serializers.create_asset_transfer_history_serializer(qs_asset_th, data=request.data, partial=True)                 
            serializer_asset_th.is_valid(raise_exception=True)                 
            serializer_asset_th.save()

            if models.asset_location.objects.filter(asset_id=request.data['asset_id'], location_id=request.data['from_location_id']).exists():
                qs_location_info = models.asset_location.objects.get(asset_id=request.data['asset_id'], location_id=request.data['from_location_id'])

                asset_loc_request_data = { "location_id": request.data['to_location_id'], "is_primary_location":True }
                serializer_location = serializers.create_asset_location_serializer(qs_location_info, data=asset_loc_request_data, partial=True)
                serializer_location.is_valid(raise_exception=True)
                serializer_location.save()

            return Response({"statusCode":"1", "statusMessage":"Success", "data":serializer_asset_th.data})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})

class DDLAssetLocationAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            querySet = None
            asset_id = request.GET.get("asset_id", None)
            if asset_id:
                querySet = models.asset_location.objects.filter(asset_id=asset_id, is_active=True, is_deleted=False)
            else:
                querySet = models.asset_location.objects.filter(is_active=True, is_deleted=False)
            
            serializer = serializers.list_asset_location_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class assetLocationAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def post(self, request):
        try:
            serializer = serializers.asset_location_validate_serializers(data=request.data)             
            if not serializer.is_valid():
                return Response({"statusCode":"0", "errors":serializer.errors})   

            # asset_id = request.data["asset_id"]    
            # if not models.asset_location.objects.filter(asset_id=asset_id, is_active=True, is_deleted=False).exists():
            #     return Response({"statusCode":"0", "statusMessage":"Failed", "errors":"Asset doesn't exists in location"})

            if not models.asset_location.objects.filter(asset_id=request.data['asset_id']).exists():
                request.data["is_primary_location"] = True

            serializer_loc = serializers.create_asset_location_serializer(data=request.data)                 
            serializer_loc.is_valid(raise_exception=True)                 
            serializer_loc.save()   
                    
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer_loc.data})          
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})

    def get(self, request):
        try:
            querySet = None
            asset_id = request.GET.get("asset_id", None)
            asset_location_id = request.GET.get("asset_location_id", None)
            location_name = request.GET.get("name", None)
            serial_number = request.GET.get("serial_number", None)
            location_city = request.GET.get("city", None)
            installation_date = request.GET.get("date", None)

            sort_params = {}
            sort_params['is_active']=True
            sort_params['is_deleted']=False

            if asset_location_id is not None:
                sort_params['id'] = asset_location_id
            
            if asset_id is not None and asset_id != "0":
                sort_params['asset_id'] = asset_id

            if serial_number is not None:
                qs_assets = models.asset.objects.filter(serial_number=serial_number).values('id')
                sort_params['asset_id__icontains'] = qs_assets
            
            if location_name is not None:
                sort_params['name__icontains'] = location_name

            if location_city is not None:
                sort_params['location__icontains'] = location_city

            if installation_date is not None:
                sort_params['installation_date__icontains'] = installation_date

            querySet = models.asset_location.objects.filter(**sort_params)

            # if asset_location_id:
            #     querySet = models.asset_location.objects.filter(id=asset_location_id, asset_id=asset_id, is_active=True, is_deleted=False)
            # elif asset_id and asset_id != "0":
            #     querySet = models.asset_location.objects.filter(asset_id=asset_id, is_active=True, is_deleted=False)
            # else:
            #     querySet = models.asset_location.objects.filter(is_active=True, is_deleted=False)
            
            serializer = serializers.list_asset_location_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

    def patch(self,request):
        try:
            asset_id = request.GET.get("asset_id", None)
            asset_location_id = request.GET.get("asset_location_id", None)

            if asset_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset id"})

            if asset_location_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset_location id"})

            serializer_location = None
            if models.asset_location.objects.filter(id=asset_location_id, asset_id=asset_id, is_active=True, is_deleted=False).exists():
                qs_location_info = models.asset_location.objects.get(id=asset_location_id, asset_id=asset_id)
                serializer_location = serializers.create_asset_location_serializer(qs_location_info, data=request.data, partial=True)
                serializer_location.is_valid(raise_exception=True)
                serializer_location.save() 
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer_location.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })
    
    def delete(self,request):
        try:
            asset_id = request.GET.get("asset_id", None)
            asset_location_id = request.GET.get("asset_location_id", None)
            if asset_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset id"})

            if asset_location_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset_location id"})

            request_data = { "is_active": False, "is_deleted": True}
            serializer_location = None
            if models.asset_location.objects.filter(id=asset_location_id, asset_id=asset_id, is_active=True, is_deleted=False).exists():
                qs_location_info = models.asset_location.objects.get(id=asset_location_id, asset_id=asset_id)
                serializer_location = serializers.create_asset_location_serializer(qs_location_info, data=request_data, partial=True)
                serializer_location.is_valid(raise_exception=True)
                serializer_location.save()  
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer_location.data}) 
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})

class serviceRequestAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def post(self, request):
        try:
            if 'service_status' not in request.data:
                qs_service_status = models.service_status.objects.filter(status_name__icontains='Queue').values_list('id', flat=True)
                for status in qs_service_status:
                    request.data['service_status'] = status

            if 'request_by' not in request.data:
                request.data['request_by'] = request.user.pk

            if 'request_on_date' not in request.data:
                request.data['request_on_date'] = datetime.now()

            request.data['asset'] = request.data['asset_id']

            if 'customer_id' not in request.data:
                qs_asset_loc = models.asset.objects.get(id=request.data['asset_id'])
                request.data['customer_id'] = qs_asset_loc.customer_id

            if 'service_notes' in request.data:
                request.data['additional_notes'] = request.data['service_notes']

            if 'image_path' not in request.data:
                request.data['image_path'] = ""

            serializer_asset_service = serializers.create_service_serializers(data=request.data)                 
            serializer_asset_service.is_valid(raise_exception=True)                 
            serializer_asset_service.save()
            
            request.data['service'] = serializer_asset_service.data['id']
            response = create_asset_service_details(request.data)
            if response:
                request_data = {
                    "asset_id": request.data['asset_id'],
                    "service_id": serializer_asset_service.data['id'],
                    "services_details_id": response['id'],
                    "date": serializer_asset_service.data['created_at'],
                    "notes": request.data['additional_notes'],
                    "image_path": request.data['image_path']
                }
                response = create_asset_media_details(request_data)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer_asset_service.data})          
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})

    def get(self, request):
        try:
            querySet = None
            asset_id = request.GET.get("asset_id", None)
            asset_service_id = request.GET.get("asset_service_id", None)

            if asset_service_id and asset_id:
                querySet = models.asset_service_history.objects.filter(id=asset_service_id, asset_id=asset_id, is_active=True, is_deleted=False)
            elif asset_service_id and asset_id is None:
                querySet = models.asset_service_history.objects.filter(id=asset_service_id, is_active=True, is_deleted=False)
            else:
                querySet = models.asset_service_history.objects.filter(asset_id=asset_id, is_active=True, is_deleted=False)
            
            serializer = serializers.list_service_serializers(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

    def patch(self,request):
        try:
            asset_id = request.GET.get("asset_id", None)
            asset_service_id = request.GET.get("asset_service_id", None)

            if asset_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset id"})

            if asset_service_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset_service id"})

            serializer_asset_service = None
            if models.asset_service_history.objects.filter(id=asset_service_id, asset_id=asset_id, is_active=True, is_deleted=False).exists():
                qs_asset_service = models.asset_service_history.objects.get(id=asset_service_id, asset_id=asset_id)

                serializer_asset_service = serializers.create_service_serializers(qs_asset_service, data=request.data, partial=True)
                serializer_asset_service.is_valid(raise_exception=True)
                serializer_asset_service.save()

                if 'value' in request.data and 'hours_spend' in request.data:
                    description = "Completed"
                    if 'description' in request.data:
                        description = request.data['description']

                    request_data = { 
                        "value": request.data['value'], "hours_spend": request.data['hours_spend'],
                        "description": description,
                        "invoice_number": "INV" +  str(random_with_N_digits(5))
                    }
                    response = update_asset_service_details(asset_service_id, request_data)
                    if response:
                        request_data = {
                            "asset_id": asset_id,
                            "service_id": asset_service_id,
                            "services_details_id": qs_asset_service.id,
                            "image_path": request.data['image_path']
                        }
                        response = update_asset_media_details(asset_id, asset_service_id, qs_asset_service.id, request_data)

            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer_asset_service.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })
    
    def delete(self,request):
        try:
            asset_id = request.GET.get("asset_id", None)
            asset_service_id = request.GET.get("asset_service_id", None)
            if asset_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset id"})

            if asset_service_id is None:
                return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send asset_service id"})

            request_data = { "is_active": False, "is_deleted": True}
            serializer_asset_service = None
            if models.asset_service_history.objects.filter(id=asset_service_id, asset_id=asset_id, is_active=True, is_deleted=False).exists():
                qs_asset_service = models.asset_service_history.objects.get(id=asset_service_id, asset_id=asset_id)
                serializer_asset_service = serializers.create_service_serializers(qs_asset_service, data=request_data, partial=True)
                serializer_asset_service.is_valid(raise_exception=True)
                serializer_asset_service.save()  
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer_asset_service.data}) 
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})

def create_asset_service_details(request_data):
    try:
        serializer_asset_service_details = serializers.create_service_details_serializers(data=request_data)                 
        serializer_asset_service_details.is_valid(raise_exception=True)                 
        serializer_asset_service_details.save()
        return serializer_asset_service_details.data
    except Exception as e:
        print('error in create asset_service_details', str(e))

def update_asset_service_details(asset_service_id, request_data):
    try:
        qs_asset_service_details = models.asset_service_history_details.objects.get(service_id=asset_service_id, is_active=True, is_deleted=False)
        serializer_asset_service_details = serializers.create_service_details_serializers(qs_asset_service_details, data=request_data, partial=True)
        serializer_asset_service_details.is_valid(raise_exception=True)
        serializer_asset_service_details.save()
        return serializer_asset_service_details.data
    except Exception as e:
        print('error in update asset_service_details', str(e))

def random_with_N_digits(n):
    range_start = 10**(n-1)
    range_end = (10**n)-1
    return randint(range_start, range_end)

def create_asset_media_details(request_data):
    try:
        serializer_asset_media_details = serializers.create_asset_media_serializer(data=request_data)                 
        serializer_asset_media_details.is_valid(raise_exception=True)                 
        serializer_asset_media_details.save()
    except Exception as e:
        print('error in create asset_media_details', str(e))

def update_asset_media_details(asset_id, service_id, services_details_id, request_data):
    try:
        if models.asset_media.objects.filter(asset_id=asset_id, service_id=service_id, services_details_id=services_details_id).exists():
            qs_asset_media_details = models.asset_media.objects.get(asset_id=asset_id, service_id=service_id, services_details_id=services_details_id, is_active=True, is_deleted=False)
            serializer_asset_media_details = serializers.create_asset_media_serializer(qs_asset_media_details, data=request_data, partial=True)
            serializer_asset_media_details.is_valid(raise_exception=True)
            serializer_asset_media_details.save()
    except Exception as e:
        print('error in update update_asset_media_details', str(e))

class serviceRequestList(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            asset_id = request.GET.get("asset_id", None)
            asset_name = request.GET.get("asset_name", None)
            customer_name = request.GET.get("customer_name", None)
            asset_location = request.GET.get("city", None)
            request_on_date = request.GET.get("date", None)
            customer_id = request.GET.get("customer_id", None)
            technician_id = request.GET.get("technician_id", None)

            sort_params = {}
            sort_params['is_active']=True
            sort_params['is_deleted']=False
            
            if asset_id is not None:
                sort_params['asset'] = asset_id
            
            if asset_name is not None:
                qs_assets = models.asset.objects.filter(name=asset_name).values('id')
                sort_params['asset__id__icontains'] = qs_assets

            if customer_name is not None:
                qs_customer = models.customer.objects.filter(name=customer_name).values('id')
                sort_params['customer_id__icontains'] = qs_customer

            if customer_id is not None:
                sort_params['customer_id__in'] = customer_id

            if technician_id is not None:
                sort_params['technician_id__in'] = technician_id

            if asset_location is not None:
                sort_params['location'] = asset_location

            if request_on_date is not None:
                sort_params['request_on_date__icontains'] = request_on_date

            querySet = models.asset_service_history.objects.filter(**sort_params)
            serializer = serializers.list_service_serializers(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class serviceRequestWithDetailsList(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            querySet = models.asset_service_history.objects.filter(is_active=True, is_deleted=False)
            serializer = serializers.list_service_with_details_serializers(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class assetReportListAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            response = None
            asset_id = request.GET.get("asset_id", None)
            asset_location_id = request.GET.get("asset_location_id", None)
            customer_id = request.GET.get("customer_id", None)
            technician_id = request.GET.get("technician_id", None)

            sort_params = {}
            sort_params['is_active']=True
            sort_params['is_deleted']=False
            
            if asset_id is not None:
                sort_params['id'] = asset_id
            
            if asset_location_id is not None:
                qs_assets_location = models.asset_location.objects.filter(id=asset_location_id, is_active=True, is_deleted=False).values('id')
                sort_params['id__icontains'] = qs_assets_location

            if customer_id is not None:
                querySet = models.asset_service_history.objects.filter(customer_id=customer_id, is_active=True, is_deleted=False).values('asset_id')
                sort_params['id__in'] = querySet

            if technician_id is not None:
                querySet = models.asset_service_history.objects.filter(technician_id=technician_id, is_active=True, is_deleted=False).values('asset_id')
                sort_params['id__in'] = querySet

            querySet = models.asset.objects.filter(**sort_params)
            serializer = serializers.list_asset_with_history_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class customerAssetReportListAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            response = None
            customer_id = request.GET.get("customer_id", None)
            # if customer_id is None:
            #     return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send customer id"})

            asset_id = request.GET.get("asset_id", None)
            asset_location_id = request.GET.get("asset_location_id", None)
            cost_of_services = request.GET.get("cost_of_services", None)

            sort_params = {}
            sort_params['is_active']=True
            sort_params['is_deleted']=False

            if customer_id is not None:
                querySet = models.asset_service_history.objects.filter(customer_id=customer_id, is_active=True, is_deleted=False).values('asset_id')
                sort_params['id__in'] = querySet

            if asset_id is not None:
                sort_params['id'] = asset_id
            
            if asset_location_id is not None:
                qs_assets_location = models.asset_location.objects.filter(id=asset_location_id, is_active=True, is_deleted=False).values('id')
                sort_params['id__icontains'] = qs_assets_location

            if cost_of_services is not None:
                qs_asd = models.asset_service_history_details.objects.filter(value=cost_of_services, is_active=True, is_deleted=False).values('id')
                querySet = models.asset_service_history.objects.filter(id__in=qs_asd, is_active=True, is_deleted=False).values('asset_id')
                sort_params['id__in'] = querySet

            querySet = models.asset.objects.filter(**sort_params)
            serializer = serializers.list_asset_with_history_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class technicianAssetReportListAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            response = None
            technician_id = request.GET.get("technician_id", None)
            # if technician_id is None:
            #     return Response({"statusCode":"0", "statusMessage": "Failed", "error":"please send technician id"})

            asset_id = request.GET.get("asset_id", None)
            asset_location_id = request.GET.get("asset_location_id", None)
            customer_id = request.GET.get("customer_id", None)
            hours_spend = request.GET.get("hours_spend", None)

            sort_params = {}
            sort_params['is_active']=True
            sort_params['is_deleted']=False

            if technician_id is not None:
                querySet = models.asset_service_history.objects.filter(technician_id=technician_id, is_active=True, is_deleted=False).values('asset_id')
                sort_params['id__in'] = querySet

            if asset_id is not None:
                sort_params['id'] = asset_id
            
            if asset_location_id is not None:
                qs_assets_location = models.asset_location.objects.filter(id=asset_location_id, is_active=True, is_deleted=False).values('id')
                sort_params['id__icontains'] = qs_assets_location

            if customer_id is not None:
                querySet = models.asset_service_history.objects.filter(technician_id=technician_id, customer_id=customer_id, is_active=True, is_deleted=False).values('asset_id')
                sort_params['id__in'] = querySet

            if hours_spend is not None:
                qs_asd = models.asset_service_history_details.objects.filter(hours_spend=hours_spend, is_active=True, is_deleted=False).values('id')
                querySet = models.asset_service_history.objects.filter(id__in=qs_asd, is_active=True, is_deleted=False).values('asset_id')
                sort_params['id__in'] = querySet

            querySet = models.asset.objects.filter(**sort_params)
            serializer = serializers.list_asset_with_history_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class customerReportListAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            qs_customer = models.customer.objects.filter(is_active=True)
            serializer = serializers.list_customer_report_serializer(qs_customer, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class technicianReportListAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try: 
            qs_technician = models.technician.objects.filter(is_active=True)
            serializer = serializers.list_technician_report_serializer(qs_technician, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class assetReportAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            response = None
            asset_id = request.GET.get("asset_id", None)
            asset_location_id = request.GET.get("asset_location_id", None)
            customer_id = request.GET.get("customer_id", None)
            technician_id = request.GET.get("technician_id", None)
            
            if asset_id is not None and asset_location_id is None and customer_id is None and technician_id is None:
                if not models.asset.objects.filter(id=asset_id, is_active=True, is_deleted=False).exists():
                    return Response({"statusCode":"0","statusMessage":"Failed", "errors":"asset doesn't exists"})
                response = get_asset_details(asset_id)

            if asset_id is None and asset_location_id is not None and customer_id is None and technician_id is None:
                if not models.asset_location.objects.filter(id=asset_location_id, is_active=True, is_deleted=False).exists():
                    return Response({"statusCode":"0","statusMessage":"Failed", "errors":"asset location doesn't exists"})
                response = get_asset_location_details(asset_location_id)

            if asset_id is None and asset_location_id is None and customer_id is not None and technician_id is None:
                if not models.asset_service_history.objects.filter(customer_id=customer_id, is_active=True, is_deleted=False).exists():
                    return Response({"statusCode":"0","statusMessage":"Failed", "errors":"asset service doesn't exists"})
                response = get_asset_customer_details(customer_id)

            if asset_id is None and asset_location_id is None and customer_id is None and technician_id is not None:
                if not models.asset_service_history.objects.filter(technician_id=technician_id, is_active=True, is_deleted=False).exists():
                    return Response({"statusCode":"0","statusMessage":"Failed", "errors":"asset service doesn't exists"})
                response = get_asset_technician_details(technician_id)

            return Response({"statusCode":"1", "statusMessage":"Success", "data": response})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

def get_asset_details(asset_id):
    querySet = models.asset.objects.filter(id=asset_id, is_active=True, is_deleted=False)
    serializer = serializers.list_asset_with_history_serializer(querySet, many=True)
    return serializer.data

def get_asset_location_details(asset_location_id):
    querySet = models.asset_location.objects.filter(id=asset_location_id, is_active=True, is_deleted=False)
    serializer = serializers.list_asset_with_history_serializer(querySet, many=True)
    return serializer.data

def get_asset_customer_details(customer_id):
    response = []
    querySet = models.asset_service_history.objects.filter(customer_id=customer_id, is_active=True, is_deleted=False)
    for data in querySet:
        querySet = models.asset.objects.get(id=data.asset_id, is_active=True, is_deleted=False)
        serializer = serializers.list_asset_with_history_serializer(querySet)
        response.append(serializer.data)
    return response

def get_asset_technician_details(technician_id):
    response = []
    querySet = models.asset_service_history.objects.filter(technician_id=technician_id, is_active=True, is_deleted=False)
    for data in querySet:
        querySet = models.asset.objects.get(id=data.asset_id, is_active=True, is_deleted=False)
        serializer = serializers.list_asset_with_history_serializer(querySet)
        response.append(serializer.data)
    return response

class assetStatusAPIView(GenericAPIView):
    permission_classes = [permissions.IsAuthenticated, ]
    def post(self,request):
        try:
            if  'asset_status_name' not in request.data:
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors": "Please send asset_status_name"})

            asset_status_name =  request.data['asset_status_name']
            if models.asset_status.objects.filter(asset_status_name=asset_status_name, is_active=True, is_deleted=False).exists():
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors": "Asset Service status already exists"})
            
            serializer_data= serializers.create_asset_status_serializer(data=request.data)                 
            serializer_data.is_valid(raise_exception=True)                 
            serializer_data.save()   
            return Response({"statusCode":"1","statusMessage":"Success","data":serializer_data.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
        
    def get(self, request):
        try:        
            id = request.GET.get("asset_status_id", None)
            if id is not None:
                if not models.asset_status.objects.filter(id=id, is_active=True, is_deleted=False).exists():
                    return Response({"statusCode":"0", "statusMessage":"Failed", "errors":"status does not exist."})
                    
                result = get_asset_status_by_id(id) 
                return Response({"statusCode":"1", "statusMessage":"Success", "data": result })  
            else:
                result = get_all_asset_status()
                return Response({"statusCode":"1","statusMessage":"Success","data": result})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })
        
    def patch(self, request):
        try:
            asset_status_id = request.GET.get("asset_status_id", None)
            if asset_status_id is None:
                return Response({"statusCode":"0", "StatusMessage":"Please send Id"})
                
            if models.asset_status.objects.filter(id=asset_status_id, is_active=True, is_deleted=False).exists():
                qs_asset_info = models.asset_status.objects.get(id=asset_status_id, is_active=True, is_deleted=False)
                serializer = serializers.create_asset_status_serializer(qs_asset_info, data=request.data, partial=True)
                serializer.is_valid(raise_exception=True)
                serializer.save()                
                return Response({"statusCode":"1", "statusMessage":"Status Updated Successfully", "data": serializer.data})
            else:
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors":"Service Status Does not exist's"})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
        
    def delete(self,request):
        try:
            asset_status_id =  request.GET.get("asset_status_id", None)
            delete_db =  request.GET.get("delete_db", None)
            if delete_db is not None:
                if models.asset_status.objects.filter(id=asset_status_id).exists():
                    qs_asset_info = models.asset_status.objects.get(id=asset_status_id)                 
                    qs_asset_info.delete()
                    return Response({"statusCode": "1", "statusMessage":"Scuccess","data":"Status deleted successfully"})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed","data":"Mismatch id"})
            else:
                if models.asset_status.objects.filter(id=asset_status_id).exists():
                    request.data['is_deleted']  = "1"
                    qs_asset_info = models.asset_status.objects.get(id=asset_status_id)
                    serializer = serializers.create_asset_status_serializer(qs_asset_info, data=request.data, partial=True)
                    serializer.is_valid(raise_exception=True)
                    serializer.save()
                    return Response({"statusCode": "1", "statusMessage":"Success","data": "Status deleted successfully"})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})

class assetBrandAPIView(GenericAPIView):
    permission_classes = [permissions.IsAuthenticated, ]
    def post(self,request):
        try:
            if  'brand_name' not in request.data:
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors": "Please send brand_name"})

            brand_name =  request.data['brand_name']
            if models.asset_brand.objects.filter(brand_name=brand_name, is_active=True, is_deleted=False).exists():
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors": "Brand already exists"})
            
            serializer_data= serializers.create_asset_brand_serializer(data=request.data)                 
            serializer_data.is_valid(raise_exception=True)                 
            serializer_data.save()   
            return Response({"statusCode":"1","statusMessage":"Success","data":serializer_data.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
        
    def get(self, request):
        try:        
            id = request.GET.get("asset_brand_id", None)
            if id is not None:
                if not models.asset_brand.objects.filter(id=id, is_active=True, is_deleted=False).exists():
                    return Response({"statusCode":"0", "statusMessage":"Failed", "errors":"brand does not exist."})
                    
                result = get_asset_brand_by_id(id) 
                return Response({"statusCode":"1", "statusMessage":"Success", "data": result })  
            else:
                result = get_all_asset_brand()
                return Response({"statusCode":"1","statusMessage":"Success","data": result})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })
        
    def patch(self, request):
        try:
            asset_brand_id = request.GET.get("asset_brand_id", None)
            if asset_brand_id is None:
                return Response({"statusCode":"0", "StatusMessage":"Please send Id"})
                
            if models.asset_brand.objects.filter(id=asset_brand_id, is_active=True, is_deleted=False).exists():
                qs_asset_info = models.asset_brand.objects.get(id=asset_brand_id, is_active=True, is_deleted=False)
                serializer = serializers.create_asset_brand_serializer(qs_asset_info, data=request.data, partial=True)
                serializer.is_valid(raise_exception=True)
                serializer.save()                
                return Response({"statusCode":"1", "statusMessage":"Status Updated Successfully", "data": serializer.data})
            else:
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors":"Asset brand Does not exist's"})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
        
    def delete(self,request):
        try:
            asset_brand_id =  request.GET.get("asset_brand_id", None)
            delete_db =  request.GET.get("delete_db", None)
            if delete_db is not None:
                if models.asset_brand.objects.filter(id=asset_brand_id).exists():
                    qs_asset_info = models.asset_brand.objects.get(id=asset_brand_id)                 
                    qs_asset_info.delete()
                    return Response({"statusCode": "1", "statusMessage":"Scuccess","data":"Status deleted successfully"})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed","data":"Mismatch id"})
            else:
                if models.asset_brand.objects.filter(id=asset_brand_id).exists():
                    request.data['is_deleted']  = "1"
                    qs_asset_info = models.asset_brand.objects.get(id=asset_brand_id)
                    serializer = serializers.create_asset_brand_serializer(qs_asset_info, data=request.data, partial=True)
                    serializer.is_valid(raise_exception=True)
                    serializer.save()
                    return Response({"statusCode": "1", "statusMessage":"Success","data": "Status deleted successfully"})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})

class assetModelAPIView(GenericAPIView):
    permission_classes = [permissions.IsAuthenticated, ]
    def post(self,request):
        try:
            if  'model_name' not in request.data:
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors": "Please send model_name"})

            model_name =  request.data['model_name']
            if models.asset_model.objects.filter(model_name=model_name, is_active=True, is_deleted=False).exists():
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors": "Model already exists"})
            
            serializer_data= serializers.create_asset_model_serializer(data=request.data)                 
            serializer_data.is_valid(raise_exception=True)                 
            serializer_data.save()   
            return Response({"statusCode":"1","statusMessage":"Success","data":serializer_data.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
        
    def get(self, request):
        try:        
            id = request.GET.get("asset_model_id", None)
            if id is not None:
                if not models.asset_model.objects.filter(id=id, is_active=True, is_deleted=False).exists():
                    return Response({"statusCode":"0", "statusMessage":"Failed", "errors":"Model does not exist."})
                    
                result = get_asset_model_by_id(id) 
                return Response({"statusCode":"1", "statusMessage":"Success", "data": result })  
            else:
                result = get_all_asset_model()
                return Response({"statusCode":"1","statusMessage":"Success","data": result})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })
        
    def patch(self, request):
        try:
            asset_model_id = request.GET.get("asset_model_id", None)
            if asset_model_id is None:
                return Response({"statusCode":"0", "StatusMessage":"Please send Id"})
                
            if models.asset_model.objects.filter(id=asset_model_id, is_active=True, is_deleted=False).exists():
                qs_asset_info = models.asset_model.objects.get(id=asset_model_id, is_active=True, is_deleted=False)
                serializer = serializers.create_asset_model_serializer(qs_asset_info, data=request.data, partial=True)
                serializer.is_valid(raise_exception=True)
                serializer.save()                
                return Response({"statusCode":"1", "statusMessage":"Status Updated Successfully", "data": serializer.data})
            else:
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors":"Asset Model Does not exist's"})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
        
    def delete(self,request):
        try:
            asset_model_id =  request.GET.get("asset_model_id", None)
            delete_db =  request.GET.get("delete_db", None)
            if delete_db is not None:
                if models.asset_model.objects.filter(id=asset_model_id).exists():
                    qs_asset_info = models.asset_model.objects.get(id=asset_model_id)                 
                    qs_asset_info.delete()
                    return Response({"statusCode": "1", "statusMessage":"Scuccess","data":"Model deleted successfully"})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed","data":"Mismatch id"})
            else:
                if models.asset_model.objects.filter(id=asset_model_id).exists():
                    request.data['is_deleted']  = "1"
                    qs_asset_info = models.asset_model.objects.get(id=asset_model_id)
                    serializer = serializers.create_asset_model_serializer(qs_asset_info, data=request.data, partial=True)
                    serializer.is_valid(raise_exception=True)
                    serializer.save()
                    return Response({"statusCode": "1", "statusMessage":"Success","data": "Model deleted successfully"})
                else:
                    return Response({"statusCode": "0", "statusMessage": "Failed","error":"Mismatch Id"})
        except  Exception as e:
            return Response({"statusCode":"0","statusMessage":str(e)})

class DDLAssetStatusAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            querySet = models.asset_status.objects.filter(is_active=True, is_deleted=False)
            serializer = serializers.list_asset_status_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class DDLAssetBrandAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            querySet = models.asset_brand.objects.filter(is_active=True, is_deleted=False)
            serializer = serializers.list_asset_brand_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

class DDLAssetModelAPIView(GenericAPIView):
    permission_classes = (permissions.IsAuthenticated, )
    def get(self, request):
        try:
            querySet = models.asset_model.objects.filter(is_active=True, is_deleted=False)
            serializer = serializers.list_asset_model_serializer(querySet, many=True)
            return Response({"statusCode":"1", "statusMessage":"Success", "data": serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e) })

def dictfetchall(cursor):
    "Return all rows from a cursor as a dict"
    columns = [col[0] for col in cursor.description]
    return [ 
        dict(zip(columns, row))
        for row in cursor.fetchall()
    ]

def get_all_asset_status():
    rows = []
   
    with connection.cursor() as cur:
        cur.execute('''SELECT id, asset_status_name, is_active, is_deleted, created_at, updated_at
            From asset_db.asset_management_app_asset_status where is_active=1 AND is_deleted=0
        ''')
        rows = dictfetchall(cur)
    return rows

def get_asset_status_by_id(id):
    param = {'uid': id}
    rows = []
    try:
        with connection.cursor() as cur:
            cur.execute('''
                SELECT id, asset_status_name, is_active, is_deleted, created_at, updated_at
                FROM asset_db.asset_management_app_asset_status
                WHERE id = %(uid)s AND is_active=1 AND is_deleted = 0;
            ''', param)
            rows = dictfetchall(cur)
    except Exception as e:
        print(f"An error occurred: {e}")
    return rows

def get_all_asset_brand():
    rows = []
   
    with connection.cursor() as cur:
        cur.execute('''SELECT id, brand_name, is_active, is_deleted, created_at, updated_at
            From asset_db.asset_management_app_asset_brand where is_active=1 AND is_deleted=0
        ''')
        rows = dictfetchall(cur)
    return rows

def get_asset_brand_by_id(id):
    param = {'uid': id}
    rows = []
    try:
        with connection.cursor() as cur:
            cur.execute('''
                SELECT id, brand_name, is_active, is_deleted, created_at, updated_at
                FROM asset_db.asset_management_app_asset_brand
                WHERE id = %(uid)s AND is_active=1 AND is_deleted = 0;
            ''', param)
            rows = dictfetchall(cur)
    except Exception as e:
        print(f"An error occurred: {e}")
    return rows

def get_all_asset_model():
    rows = []
   
    with connection.cursor() as cur:
        cur.execute('''SELECT id, model_name, is_active, is_deleted, created_at, updated_at
            From asset_db.asset_management_app_asset_model where is_active=1 AND is_deleted=0
        ''')
        rows = dictfetchall(cur)
    return rows

def get_asset_model_by_id(id):
    param = {'uid': id}
    rows = []
    try:
        with connection.cursor() as cur:
            cur.execute('''
                SELECT id, model_name, is_active, is_deleted, created_at, updated_at
                FROM asset_db.asset_management_app_asset_model
                WHERE id = %(uid)s AND is_active=1 AND is_deleted = 0;
            ''', param)
            rows = dictfetchall(cur)
    except Exception as e:
        print(f"An error occurred: {e}")
    return rows

def get_assetdata_byid(id):
    param = {'uid':id}
    rows = []
    with connection.cursor() as cur:
        cur.execute(''' SELECT  x.id, x.name, x.serial_number, x.description, x.value, x.purchase_date, x.notes, x.person_in_charge, x.important_notes, x.is_active, x.is_deleted, x.created_at, x.updated_at,
                    
                    u.id as media_id, u.asset_id as media_asset_id, u.service_id as media_service_id,u.services_details_id as media_serivces_details_id, u.date as media_date, u.notes as media_notes, u.media as media_url, u.is_deleted as media_delete, u.created_at as media_created_at, u.updated_at as media_updated_at,
                    w.id as location_id, w.name as location_name, w.location as location, w.installation_date as location_installed_date, w.removel_date as location_removel_date, w.notes as location_notes, w.installed_by as location_installed_by, w.important_notes as location_importantnotes,w.is_deleted as location_deleted, w.created_at as location_created_at, w.updated_at as location_updated_at
                    FROM  asset_db.asset_management_app_asset as x 
                    Left join asset_db.asset_management_app_asset_media as u on u.asset_id = x.id
                    Left join asset_db.asset_management_app_asset_location as w  on w.asset_id = x.id
                      where  x.id = %(uid)s and w.is_deleted = 0 ''', param)
        rows = dictfetchall(cur)
    return rows

def get_assetdata_byall():
    param = {}
    rows = []
    with connection.cursor() as cur:
        cur.execute(''' SELECT  x.id, x.name,x.serial_number,x.description, x.value, x.purchase_date, x.notes, x.person_in_charge,x.important_notes,x.is_active, x.is_deleted,x.created_at,x.updated_at,
                    u.id as media_id, u.asset_id as media_asset_id, u.service_id as media_service_id,u.services_details_id as media_serivces_details_id, u.date as media_date, u.notes as media_notes, u.media as media_url, u.is_deleted as media_delete, u.created_at as media_created_at, u.updated_at as media_updated_at,
                    w.id as location_id, w.name as location_name, w.location as location, w.installation_date as location_installed_date, w.removel_date as location_removel_date, w.notes as location_notes, w.installed_by as location_installed_by, w.important_notes as location_importantnotes,w.is_deleted as location_deleted, w.created_at as location_created_at, w.updated_at as location_updated_at
                    FROM  asset_db.asset_management_app_asset as x
                    Left join asset_db.asset_management_app_asset_media as u on u.asset_id = x.id
                    Left join asset_db.asset_management_app_asset_location as w  on w.asset_id = x.id
                    where x.is_deleted =0
                     ''', param)
        rows = dictfetchall(cur)
    return rows

def get_asset_byid(id):
    param = {'uid':id}
    rows = []
    with connection.cursor() as cur:
        cur.execute(''' SELECT  id, name, serial_number, description, value, purchase_date, notes, person_in_charge, important_notes, is_active, is_deleted, created_at, updated_at 
                    FROM  asset_db.asset_management_app_asset where  id = %(uid)s''', param)
        rows = dictfetchall(cur)
    return rows

def get_asset_byall():
    param = {}
    rows = []
    with connection.cursor() as cur:
        cur.execute(''' SELECT  id, name, serial_number, description, value, purchase_date, notes, person_in_charge, important_notes, is_active, is_deleted, created_at, updated_at 
                    FROM  asset_db.asset_management_app_asset ''', param)
        rows = dictfetchall(cur)
    return rows
