from rest_framework import serializers
#from mainApp.models import * 
#from mainApp.serializers import * 
from .models import * 
#from django.db.models import Max
#from financeApp.models import PtSurgery
#from mainApp.models import Patient

class SurgeryDoctorSerializer(serializers.ModelSerializer):
    class Meta:
        model = SurgeryDoctor
        fields=["surgery","doctor_price"]

class SurgerySerializer(serializers.ModelSerializer):
    class Meta:
        model = Surgery
        fields="__all__"

class SurgeryMiniSerializer(serializers.ModelSerializer):
    class Meta:
        model = Surgery
        fields=("id",'name')

class SurgeryDoctorSerializer(serializers.ModelSerializer):
    class Meta:
        model = SurgeryDoctor
        fields=["surgery","doctor_price"]

class PtSurgeryForInvSerializer(serializers.ModelSerializer):
    class Meta:
        model = PtSurgery
        fields="__all__"

class PtSurgeryDoctorSerializer(serializers.ModelSerializer):
    creation_day= serializers.SerializerMethodField()
    creation_time= serializers.SerializerMethodField()
    dr_name = serializers.CharField(source="doctor.get_full_name",read_only=True)
    #visit_type_val= serializers.SerializerMethodField()
    #visit_type= ChoiceField(choices=VISIT_TYPES_CHOICES)
    class Meta:
        model = PtSurgery
        #fields=("patient","amount_required","creation_day","creation_time","visit_type")
        fields=("patient","amount_required","creation_day","creation_time","surgery","dr_name")
    def get_creation_day(self, obj):
        return obj.created_at.strftime("%Y-%m-%d")
    def get_creation_time(self, obj):
        return obj.created_at.strftime("%H:%M")
    # def get_visit_type_val(self, obj):
    #     return obj.visit_type
    def to_representation(self, instance):
        obj = super().to_representation(instance)
        obj['patient'] = instance.patient.fullname
        obj['doctor'] = instance.doctor.get_full_name()
        obj['surgery'] = instance.surgery.name
        #obj['visit_type']= instance.patient.get_displa
        return obj

class PtSurgerySerializer(serializers.ModelSerializer):
    visit_status_string = serializers.SerializerMethodField()
    patient_string = serializers.SerializerMethodField()
    surgery_string = serializers.SerializerMethodField()
    surgery_value = serializers.SerializerMethodField()
    entry_datetime = serializers.DateTimeField(format="%d/%m/%Y %H:%M")
    created_at = serializers.DateTimeField(format="%d-%m-%Y %H:%M")

    class Meta:
        model = PtSurgery
        fields="__all__"
        read_only_fields = ('visit_status_string', 'patient_string',"surgery_string","surgery_value","dr_name")

    def get_visit_status_string(self, obj):
        return obj.get_visit_status_display()        
    def get_patient_string(self, obj):
        return obj.patient.fullname
    def get_surgery_string(self, obj):
        return obj.surgery.name
    def get_surgery_value(self, obj):
        return obj.surgery.price
    
class PtDetailSurgerySerializer(serializers.ModelSerializer):
    def create(self, validated_data):
        amount_paid = int(validated_data['amount_paid'])
        amount_required = int(validated_data['amount_required'])
        amount_remaining = amount_required - amount_paid
        patient_=validated_data['patient']
        lastVisitObjToday = PtSurgery.objects.filter(visit_day=validated_data["visit_day"]).aggregate(Max('entry_order'))
        entry_order = (int(lastVisitObjToday["entry_order__max"]))+1 if lastVisitObjToday["entry_order__max"] else 1
        visitObj = PtSurgery(
        patient=patient_,
        surgery=validated_data['surgery'],
        amount_paid=amount_paid,
        amount_required=amount_required,
        amount_remaining = amount_remaining,
        visit_day = validated_data["visit_day"],
        visit_status = validated_data["visit_status"],
        entry_datetime = validated_data["entry_datetime"],
        doctor_discount=validated_data["doctor_discount"],
        entry_order = entry_order,
        created_by = validated_data["created_by"])
        patient_.last_visit = timezone.now()
        # if amount_remaining > 0 :
        #     patient_balance  = patient_.debt
        #     patient_.debt = patient_balance + amount_remaining
        # if amount_paid > amount_required : 
        #     patient_balance  = patient_.debt
        #     patient_.debt = patient_balance -  (amount_paid - amount_required)
        patient_.save()
        visitObj.save()
        return visitObj
        
    class Meta:
        model = PtSurgery
        fields="__all__"
    
class PtSurgeryCreateSerializer(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 = PtSurgery(
        patient=patient_,
        surgery=validated_data['surgery'],
        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 = PtSurgery.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 = PtSurgery
        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['surgery'] = instance.surgery.name
        return obj

class PtSurgeryMiniSerializer(serializers.ModelSerializer):
    surgery_string = serializers.SerializerMethodField()

    class Meta:
        model = PtSurgery
        fields="__all__"
        read_only_fields = ("id",'visit_day', 'doctor_notes',"surgery_string","doctor","visit_type")

    def get_surgery_string(self, obj):
        return obj.surgery.name
    def to_representation(self, instance):
        obj = super().to_representation(instance)
        obj['doctor'] = instance.doctor.get_full_name()
        return obj
    
class PtSurgeryCustomSerializer(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 = PtSurgery
        #fields=["id","patient","patient_id","medicalservice","entry_order","amount_remaining","visit_status","visit_status_string","visit_day","patient_balance"]
        fields=["id","patient","patient_id","surgery","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['surgery'] = instance.surgery.name
        obj['visit_day'] = instance.visit_day.strftime("%Y-%m-%d")
        obj['doctor'] = "{}".format(instance.doctor.get_full_name())
        return obj