from datetime import date
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 asset_management_app import models
from asset_management_app import serializers
from asset_management_app import utils

from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.generics import GenericAPIView

import os
import math
import random
import json
import pgeocode
import pandas as pd

class serviceAPIView(GenericAPIView):
    
    def post(self,request):
        try:
            print("enter")
            # serializer = serializers.service_validate_serializers(data=request.data)             
            # if not serializer.is_valid():
            #     print("ok")
            #     return Response({"statusCode":"0", "errors":serializer.errors}) 
            print("right")
            asset_id =   request.data["asset_id"]
            id  =  request.data["customer_id"]
            print(asset_id)
            print(id)
            # is_admin = request.data["is_admin"]
            if not models.customer.objects.filter(id = id).exists():
                return Response({"statusCode":"0","statuMessage":"Failed","error":"Mismatch customer Id"}) 
            if not models.asset.objects.filter(id =  asset_id).exists():
                return Response({"statusCode":"0","statuMessage":"Failed","error":"Mismatch asset Id"})
            
            print("start")
            status_all= models.service_status.objects.all()
            if len(status_all)==0:
                return Response({"statusCode":"0","statuMessage":"Failed","error":"status table is empty"})
            print(status_all)    
            service_status = models.service_status.objects.all().values('status_name','id')
            inprogress_status_id =0
            for i in service_status:
                status_name = i['status_name'] 
                if status_name.lower() == 'inprogress' :
                    inprogress_status_id = i['id']
            print("ok")
            if inprogress_status_id == 0:
                return Response({"statusCode":"0","statuMessage":"Failed","error":"asset table is empty"})
            
            print("th")
            current_date = date.today()
            current_date = current_date.strftime("%Y-%m-%d")
        
            request.data["status_id"] =  inprogress_status_id
            request.data["request_by"] = id
            request.data["request_on_date"] = current_date
            request.data["service_request"] =  "0"
            serializer= serializers.create_service_serializers(data=request.data)                 
            serializer.is_valid(raise_exception=True)                 
            serializer.save()   
            print("completed")
            return Response({"statusCode":"1","statusMessage":"Success","data":serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
        
    def get(self,request):
        try:
            id =  request.GET.get('id',None)
            result = get_service_details(id)
            return Response({"statusCode":"1","statusMessage":"Success","data":result})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})


    def patch(self,request):
        try:
            # admin = request.data["is_admin"]
            service_id  = request.GET.get("service_id",None)  
            service_request = request.data["service_request"]
          
            # start_date = request.data["service_start"]
            if "technician_id" not  in request.data and "service_request" in request.data  and service_id is not None : 
                print("i am enter")
                request.data["service_request"]
                if models.asset_service_histroy.objects.filter(id = service_id).exists():
                    qs_user_info = models.asset_service_histroy.objects.get(id = service_id)
                    print(qs_user_info)
                    # print(models.asset_media.objects.get(id=service_id).value)
                    serializer = serializers.create_service_serializers(qs_user_info, data=request.data, partial=True)
                    serializer.is_valid(raise_exception=True)
                    serializer.save()
                    print(serializer.data)
                    print("done")
                    return Response({"statusCode":"1","statusMessage":"Success","data":serializer.data})
            tech_id = request.data["technician_id"] 
            if "technician_id" in request.data:
                request.data["service_request"] ="2"
                status_all= models.service_status.objects.all()
                if len(status_all)==0:
                    return Response({"statusCode":"0","statuMessage":"Failed","error":"status table is empty"})
                print(status_all)    
                service_status = models.service_status.objects.all().values('status_name','id')
                inpending_status_id =0
                for i in service_status:
                    status_name = i['status_name'] 
                    if status_name.lower() == 'pending' or status_name.lower() == 'pending' :
                        inprogress_status_id = i['id']
                if inprogress_status_id == 0:
                    return Response({"statusCode":"0","statuMessage":"Failed","error":"asset table is empty"})
                request.data["status_id"] =  inprogress_status_id
                if models.asset_service_histroy.objects.filter(id = service_id).exists():
                    qs_user_info = models.asset_media.objects.get(id = service_id)
                    serializer = serializers.create_service_serializers(qs_user_info, data=request.data, partial=True)
                    serializer.is_valid(raise_exception=True)
                    serializer.save()
                    return Response({"statusCode":"1","statusMessage":"Success","data":serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
    
        
    

        



class serviceRequestAPIView(GenericAPIView):

    def patch(self,request):
  
        try:
            service_id  = request.data["service_id"]     
            request.data["service_request"] =  "1" # request 
            if models.asset_service_histroy.objects.filter(id = service_id).exists():
                qs_user_info = models.asset_service_histroy.objects.get(id = service_id)
                serializer = serializers.create_service_serializers(qs_user_info, data=request.data, partial=True)
                serializer.is_valid(raise_exception=True)
                serializer.save()
            return Response({"statusCode":"1","statusMessage":"Success","data":serializer.data})
        except Exception as e:
            return Response({"statusCode":"0", "statusMessage": str(e)})
        
    def get(self,request):
        try:
            result = get_request_byall()
            return Response({"statusCode":"1","statusMessage":"Success","data":result})
        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_request_byall():
    param = {}
    rows = []
    with connection.cursor() as cur:
        cur.execute(''' SELECT 
                    

                    w.id as service_id, w.tech_id as service_tech_id , w.service_date, w.service_notes, w.notes as service_notes,
                        w.service_start , w.service_end, w.request_by as service_customer_id, w.request_on_date as service_request_date,
                        w.status_id as service_status_id, w.next_service_duedate, w.invoice_number, w.is_active, w.is_deleted as service_delete,
                        w.created_at as service_created_at, w.asset_id_id as service_asset_id, w.service_media, w.value,w.service_request,

                    

                      x.id as asset_id, x.name as asset_name, x.serial_number as asset_serialnumber, x.description,x.value asset_value,
                      x.person_in_charge as asset_person_in_charge,x.is_active as asset_active, x.is_deleted as asset_deleted,
                    
                    
                     z.* 
                    
                    FROM 
                    asset_db.asset_management_app_asset_service_histroy as  w
                    left JOIN 
                    asset_db.asset_management_app_asset AS x 
                    ON x.id = w.asset_id_id
                    left JOIN 
                     asset_db.asset_management_app_customer AS Z
                    ON  z.id = w.request_by
                     where w.service_request=1 and z.is_deleted =0 and x.is_deleted=0 and w.is_deleted=0
                  
                    ''', param)
        rows = dictfetchall(cur)
    return rows





def get_service_details(id):
    param ={'uid':id}
    rows = []
    with connection.cursor() as cur:
            cur.execute('''
         select w.id as service_id, w.tech_id as service_tech_id , w.service_date, w.service_notes, w.notes as service_notes,
                        w.service_start , w.service_end, w.request_by as service_customer_id, w.request_on_date as service_request_date,
                        w.status_id as service_status_id, w.next_service_duedate, w.invoice_number, w.is_active, w.is_deleted as service_delete,
                        w.created_at as service_created_at, w.asset_id_id as service_asset_id, w.service_media, w.value,

                       u.id as tech_id, u.name as tech_name , u.address as tech_address, u.city as tech_city,
                       u.state as tech_state , u.zip_code as tech_zipocode, u.phone as tech_phone, u.email as tech_email, u.is_active as tech_active, u.is_deleted as tech_delete,
                        
                      x.id as asset_id, x.name as asset_name, x.serial_number as asset_serialnumber, x.description,x.value asset_value,
                      x.person_in_charge as asset_person_in_charge,x.is_active as asset_active, x.is_deleted as asset_deleted,

                      y.id as status_id, y.status_name as status_name, y.is_active as status_active, y.is_deleted as status_delete
                        


                        from asset_db.asset_management_app_asset_service_histroy as w
                        left join asset_db.asset_management_app_technician as u  on w.tech_id = u.id
                        left join asset_db.asset_management_app_asset as x on w.asset_id_id = x.id
                        left join asset_db.asset_management_app_service_status as y on w.status_id = y.id

                        where w.is_deleted =0 and w.id= %(uid)s;
        ''',param)
            rows = dictfetchall(cur)
            return rows






# class assignTechnicianAPIView(GenericAPIView):
    
#     def patch(self,request):

#         try:
#             # id  = request.user.pk
#             if "service_id" not in request.data:
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"Please send service_id"}) 
#             if "technician_id" not in request.data:
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"Please send service_id"}) 
#             id  =  request.data["id"]
#             tech_id  =  request.data["technician_id"]
#             service_id =  request.data["service_id"]
#             if not models.asset_service_histroy.objects.filter(id  = service_id ).exists():
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"Mismatch service_id"}) 
#             asset_service_history = models.asset_service_histroy.objects.filter(id=service_id).values()
#             print(asset_service_history)
#             # service_request_value = asset_service_history.service_request
            
#             if asset_service_history:
#                 service_request_value = asset_service_history[0]['service_request']
#                 print(service_request_value)
#                 if service_request_value == False:
#                     return Response({"statusCode":"0","statuMessage":"Failed","error":"service Not approve "}) 
#                 if models.asset_service_histroy.objects.filter(tech_id = tech_id,).exists():
#                     print("ok")
#             return Response({"statusCode":"1","statusMessage":"Success","data":""})
#         except Exception as e:
#             return Response({"statusCode":"0", "statusMessage": str(e)})
          


       

# class serviceRequestAPIView(GenericAPIView):

#     def patch(self,request):
  
#         try:
#             #    id  = request.user.pk
#             print("dgdfg")
#             # serializer = serializers.service_validate_serializers(data=request.data)             
#             # if not serializer.is_valid():
#             #      return Response({"statusCode":"0", "errors":serializer.errors}) 
#             id  =  request.data["id"]
#             asset_id =   request.data["asset_id"]
#             service_id  = request.data["service_id"]
#             print(id,"dfgdf")
#             if not models.customer.objects.filter(id = id).exists():
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"Mismatch asset Id"}) 
#             status_all= models.service_status.objects.all()
#             if len(status_all)==0:
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"status table is empty"})
#             asset = models. asset.objects.all()
#             if len(asset) ==0:
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"asset table is empty"})
#             print(status_all)    
#             service_status = models.service_status.objects.all().values('status_name','id')
#             inprogress_status_id =0
#             for i in service_status:
#                 status_name = i['status_name'] 
#                 if status_name.lower() == 'inprogress' or status_name.lower() == 'pending' :
#                     inprogress_status_id = i['id']
#             if inprogress_status_id ==0:
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"asset table is empty"})
#             current_date = date.today()
#             current_date = current_date.strftime("%Y-%m-%d")
          
#             request.data["status_id"] =  inprogress_status_id
#             request.data["request_by"] = id
#             request.data["request_on_date"] = current_date
          
#             if not models.asset.objects.filter(id =  asset_id).exists():
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"Mismatch asset Id"})
#             request.data["service_request"] =  "1"
#             if models.asset_service_histroy.objects.filter(id = service_id).exists():
#                 qs_user_info = models.asset_media.objects.get(id = service_id)
#                 serializer = serializers.create_service_serializers(qs_user_info, data=request.data, partial=True)
#                 serializer.is_valid(raise_exception=True)
#                 serializer.save()
#             return Response({"statusCode":"1","statusMessage":"Success","data":serializer.data})
#         except Exception as e:
#             return Response({"statusCode":"0", "statusMessage": str(e)})
        
#   status_all= models.service_status.objects.all()
#             if len(status_all)==0:
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"status table is empty"})
#             asset = models. asset.objects.all()
#             if len(asset) ==0:
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"asset table is empty"})
#             print(status_all)    
#             service_status = models.service_status.objects.all().values('status_name','id')
#             inprogress_status_id =0
#             for i in service_status:
#                 status_name = i['status_name'] 
#                 if status_name.lower() == 'inprogress' or status_name.lower() == 'pending' :
#                     inprogress_status_id = i['id']
#             if inprogress_status_id ==0:
#                 return Response({"statusCode":"0","statuMessage":"Failed","error":"asset table is empty"})
          
#             request.data["status_id"] =  inprogress_status_id