from django.shortcuts import render
from django.db import connection

from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated

from asset_management_app import models
from asset_management_app import serializers

class serviceStatusAPIView(GenericAPIView): #Create Service status  and  updated order status and edit order status in this view...
    permission_classes = [IsAuthenticated]
    def post(self,request):
        try:
            if  'status_name' not in request.data:
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors": "Please send status_name"})

            status_name =  request.data['status_name']
            if models.service_status.objects.filter(status_name=status_name, is_active=True, is_deleted=False).exists():
                return Response({"statusCode":"0", "statusMessage":"Failed", "errors": "Service status already exists"})
            
            serializer_data= serializers.create_service_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("status_id", None)
            if id is not None:
                if not models.service_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_service_status_byid(id) 
                return Response({"statusCode":"1", "statusMessage":"Success", "data": result })  
            else:
                result = get_all_service_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:
            status_id = request.GET.get("status_id", None)
            if status_id is None:
                return Response({"statusCode":"0", "StatusMessage":"Please send Id"})
                
            if models.service_status.objects.filter(id=status_id, is_active=True, is_deleted=False).exists():
                qs_user_info = models.service_status.objects.get(id=status_id, is_active=True, is_deleted=False)
                serializer = serializers.create_service_status_serializer(qs_user_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:
            status_id =  request.GET.get("status_id", None)
            delete_db =  request.GET.get("delete_db", None)
            if delete_db is not None:
                if models.service_status.objects.filter(id = status_id).exists():
                    qs_user_info = models.service_status.objects.get(id = status_id)                 
                    qs_user_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.service_status.objects.filter(id = status_id).exists():
                    request.data['is_deleted']  = "1"
                    qs_user_info = models.service_status.objects.get(id = status_id)
                    serializer = serializers.create_service_status_serializer(qs_user_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 assetStatusAPIView(GenericAPIView): #Create Service status  and  updated order status and edit order status in this view...
    permission_classes = [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_service_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_service_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_service_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_service_status_byid(id) 
                return Response({"statusCode":"1", "statusMessage":"Success", "data": result })  
            else:
                result = get_all_asset_service_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:
            status_id = request.GET.get("asset_status_id", None)
            if status_id is None:
                return Response({"statusCode":"0", "StatusMessage":"Please send Id"})
                
            if models.asset_service_status.objects.filter(id=status_id, is_active=True, is_deleted=False).exists():
                qs_user_info = models.asset_service_status.objects.get(id=status_id, is_active=True, is_deleted=False)
                serializer = serializers.create_asset_service_status_serializer(qs_user_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_service_status.objects.filter(id=asset_status_id).exists():
                    qs_user_info = models.asset_service_status.objects.get(id=status_id)                 
                    qs_user_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_service_status.objects.filter(id=status_id).exists():
                    request.data['is_deleted']  = "1"
                    qs_user_info = models.service_status.objects.get(id = status_id)
                    serializer = serializers.create_asset_service_status_serializer(qs_user_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)})
              
def get_all_service_status():
    rows = []
   
    with connection.cursor() as cur:
        cur.execute('''SELECT id, status_name, is_active, is_deleted, created_at, updated_at
            From asset_db.asset_management_app_service_status where is_active=1 AND is_deleted=0
        ''')
        rows = dictfetchall(cur)
    return rows

def get_asset_service_status_byid(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_service_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_service_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_service_status where is_active=1 AND is_deleted=0
        ''')
        rows = dictfetchall(cur)
    return rows

def get_service_status_byid(id):
    param = {'uid': id}
    rows = []
    try:
        with connection.cursor() as cur:
            cur.execute('''
                SELECT id, status_name, is_active, is_deleted, created_at, updated_at
                FROM asset_db.asset_management_app_service_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 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()
    ]

