from rest_framework import serializers
from mainApp.models import * 
from mainApp.serializers import * 
from .models import * 
from django.db.models import Max
from .utils import *
from surgeryApp.models import Surgery,PtSurgery

############## Finance%Module #################
class ExpenseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Expense
        fields="__all__"
############## END Finance%Module #################

############## MedicalService%Module #################

class MedicalServiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = MedicalService
        fields="__all__"
class MsDoctorSerializer(serializers.ModelSerializer):
    class Meta:
        model = MedicalServiceDoctor
        fields=["doctor","doctor_price"]
############## END MedicalService%Module #################

############## Patient%Module #################

class PatientCustomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Patient
        fields=["id","fullname","next_consult",]
    def to_representation(self, instance):
        obj = super().to_representation(instance)
        # obj['last_visit'] = instance.last_visit.strftime("%Y-%m-%d    %H:%M")
        #if obj['last_visit'] : obj['last_visit'] = instance.last_visit.strftime("%Y-%m-%d")
        #else : obj['last_visit'] = "لا توجد زيارات سابقة"
        if obj['next_consult'] : obj['next_consult'] = instance.next_consult.strftime("%Y-%m-%d")
        else : obj['next_consult'] = "غير محدد"
        return obj

# class PatientInfoSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Patient
#         fields=["id","fullname","next_consult",]
#     def to_representation(self, instance):
#         obj = super().to_representation(instance)
#         # obj['last_visit'] = instance.last_visit.strftime("%Y-%m-%d    %H:%M")
#         #if obj['last_visit'] : obj['last_visit'] = instance.last_visit.strftime("%Y-%m-%d")
#         #else : obj['last_visit'] = "لا توجد زيارات سابقة"
#         if obj['next_consult'] : obj['next_consult'] = instance.next_consult.strftime("%Y-%m-%d")
#         else : obj['next_consult'] = "غير محدد"
#         return obj

class PatientExternalPaymentSerializer(serializers.ModelSerializer):
    class Meta:
        model = PatientExternalPayment
        fields="__all__"
class PatientExtraInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = PatientExtraInfo
        fields="__all__"

############## END Patient%Module #################

############## PatientVisit%Module #################
class PatientVisitSerializer(serializers.ModelSerializer):
    def create(self, validated_data):
        service_price =  int(self.context.get("service_price"))
        amount_paid = int(validated_data['amount_paid'])
        amount_remaining_ = service_price - amount_paid
        patient_=validated_data['patient']
        visitObj = PatientVisit(
        patient=patient_,
        medicalservice=validated_data['medicalservice'],
        doctor=validated_data['doctor'],
        visit_type=validated_data['visit_type'],
        amount_paid=amount_paid,
        visit_day = validated_data["visit_day"],
        created_by = validated_data["created_by"])
        visitObj.amount_remaining = amount_remaining_
        visitObj.amount_required = service_price
        lastVisitObjToday = PatientVisit.objects.filter(visit_day=validated_data["visit_day"]).aggregate(Max('entry_order'))
        visitObj.entry_order = (int(lastVisitObjToday["entry_order__max"]))+1 if lastVisitObjToday["entry_order__max"] else 1
        visitObj.save()
        return visitObj
        
    class Meta:
        model = PatientVisit
        fields="__all__"
    def to_representation(self, instance):
        obj = super().to_representation(instance)
        obj['patient'] = instance.patient.fullname
        obj['doctor'] = "{}".format(instance.doctor.get_full_name())
        obj['patient_id'] = instance.patient.id
        obj['medicalservice'] = instance.medicalservice.name
        return obj

class PatientVisitInvoiceSerializer(serializers.ModelSerializer):
    pt_fullname = serializers.CharField(source="patient.fullname",default="",read_only=True)
    #number_1=serializers.CharField(source="patient.number_1",default="",read_only=True)
    pt_code=serializers.CharField(source="patient.code",default="",read_only=True)
    ms_description = serializers.CharField(source="medicalservice.description",default="",read_only=True)
    #org_name= serializers.CharField(source="organization.name",default="",read_only=True)
    class Meta:
        model = PatientVisit
        fields="__all__"

class PatientSurgeryInvoiceSerializer(serializers.ModelSerializer):
    pt_fullname = serializers.CharField(source="patient.fullname",default="",read_only=True)
    #number_1=serializers.CharField(source="patient.number_1",default="",read_only=True)
    pt_code=serializers.CharField(source="patient.code",default="",read_only=True)
    ms_description = serializers.CharField(source="surgery.description",default="",read_only=True)
    #org_name= serializers.CharField(source="organization.name",default="",read_only=True)
    class Meta:
        model = PtSurgery
        fields="__all__"

class PatientVisitCustomSerializer(serializers.ModelSerializer):
    visit_status_string = serializers.SerializerMethodField()
    patient_id = serializers.SerializerMethodField()
    #patient_balance = serializers.SerializerMethodField()
    #visit_day = serializers.DateTimeField(format="%Y-%m-%d")
    class Meta:
        model = PatientVisit
        #fields=["id","patient","patient_id","medicalservice","entry_order","amount_remaining","visit_status","visit_status_string","visit_day","patient_balance"]
        fields=["id","patient","patient_id","medicalservice","entry_order","amount_remaining","amount_paid","visit_status","visit_status_string","visit_day","doctor","visit_type"]

    def get_visit_status_string(self, obj):
        return obj.get_visit_status_display()        
    def get_patient_id(self, obj):
        return obj.patient.id
    #def get_patient_balance(self, obj):
        #return obj.patient.balance
    def to_representation(self, instance):
        obj = super().to_representation(instance)
        obj['patient'] = instance.patient.fullname
        obj['medicalservice'] = instance.medicalservice.name
        obj['visit_day'] = instance.visit_day.strftime("%Y-%m-%d")
        obj['doctor'] = "{}".format(instance.doctor.get_full_name())
        return obj

class NextVisitSerializer(serializers.ModelSerializer):
    class Meta:
        model = NextVisit
        fields="__all__"

class AdvanceReservationSerializer(serializers.ModelSerializer):
    # creation_day= serializers.SerializerMethodField()
    # creation_time= serializers.SerializerMethodField()
    class Meta:
        model = AdvanceReservation
        fields="__all__"

class PatientVisitPrintSerializer(serializers.ModelSerializer):
    p_code = serializers.SerializerMethodField()
    p_age = serializers.SerializerMethodField()
    p_address = serializers.SerializerMethodField()
    p_dob = serializers.SerializerMethodField()
    p_job = serializers.SerializerMethodField()
    p_martial_status = serializers.SerializerMethodField()
    p_number_1 = serializers.SerializerMethodField()   
    ms_price = serializers.SerializerMethodField()
    class Meta:
        model = PatientVisit
        fields=["id","entry_order","patient","p_code","p_age","p_address","p_dob","p_job","p_number_1","p_martial_status","medicalservice","created_at","ms_price","amount_paid"]

    def get_p_martial_status(self, obj):
        return obj.patient.get_marital_status_display()        
    def get_p_code(self, obj):
        return obj.patient.code
    def get_p_age(self, obj):
        return ageCalculator(obj.patient.birth_date)
    def get_p_address(self, obj):
        return obj.patient.location.name
    def get_p_dob(self, obj):
        return obj.patient.birth_date.strftime("%Y-%m-%d")
    def get_p_job(self, obj):
        return obj.patient.p_job.name
    def get_p_number_1(self, obj):
        return obj.patient.number_1
    def get_ms_price(self, obj):
        return obj.medicalservice.price 
    def to_representation(self, instance):
        obj = super().to_representation(instance)
        obj['patient'] = instance.patient.fullname
        obj['medicalservice'] = instance.medicalservice.name
        obj['created_at'] = instance.created_at.strftime("%Y-%m-%d %I:%M%p")
        return obj
############## END PatientVisit%Module #################




