from rest_framework import serializers

from common.common import getLanguage, isValidData, validateParentId
from mama_care_api.settings import languageKey

from .models import (
    DiaperTrackerGroup,
    DiaperTrackerRow,
    DiaperTrackerType,
    DiaperTrackerTypeLanguage,
    GrowthTracker,
)


class GrowthTrackerSerializer(serializers.ModelSerializer):
    isAuthorized = serializers.SerializerMethodField()

    class Meta:
        model = GrowthTracker
        fields = [
            "id",
            "date",
            "weight",
            "height",
            "headCircumference",
            "notes",
            "createdDate",
            "updatedDate",
            "medicalProfileId",
            "isAuthorized",
        ]

    def get_isAuthorized(self, instance):
        return bool(isValidData(self, instance.medicalProfileId.childId.id))

    def validate(self, data):
        medical_profile = data.get("medicalProfileId")
        if medical_profile is None and self.instance is not None:
            medical_profile = self.instance.medicalProfileId

        if medical_profile is None:
            raise serializers.ValidationError(
                {"error": ["Medical Profile Id does not exist"]}
            )

        validateParentId(self, medical_profile.childId.parentId.id)
        return data


class DiaperTrackerTypeSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = DiaperTrackerType
        fields = [
            "id",
            "keyName",
            "createdDate",
            "updatedDate",
            "name",
        ]

    def get_name(self, instance):
        languageId = getLanguage(self)
        if languageId is not None:
            diaperTrackerTypeLanguageList = DiaperTrackerTypeLanguage.objects.filter(
                diaperTrackerTypeId=instance.id,
                languageId=languageId,
            )
            if diaperTrackerTypeLanguageList.exists():
                return diaperTrackerTypeLanguageList.first().name
        return None


class DiaperTrackerTypeLanguageSerializer(serializers.ModelSerializer):
    class Meta:
        model = DiaperTrackerTypeLanguage
        fields = [
            "id",
            "name",
            "diaperTrackerTypeId",
            languageKey,
        ]


class DiaperTrackerGroupSerializer(serializers.ModelSerializer):
    isAuthorized = serializers.SerializerMethodField()
    diaperTrackerRowList = serializers.SerializerMethodField()

    class Meta:
        model = DiaperTrackerGroup
        fields = [
            "id",
            "date",
            "time",
            "note",
            "createdDate",
            "updatedDate",
            "medicalProfileId",
            "diaperTrackerRowList",
            "isAuthorized",
        ]

    def get_isAuthorized(self, instance):
        if isValidData(self, instance.medicalProfileId.childId.id):
            return True
        return False

    def validate(self, data):
        errorMessage = ""
        isCheck = False
        if "medicalProfileId" in data:
            isCheck = validateParentId(
                self, data["medicalProfileId"].childId.parentId.id
            )
        else:
            errorMessage = "Parent Id does not exit"

        if isCheck:
            return data
        if errorMessage:
            raise serializers.ValidationError({"error": [errorMessage]})
        return data

    def get_diaperTrackerRowList(self, instance):
        languageId = getLanguage(self)
        dataList = DiaperTrackerRow.objects.filter(diaperTrackerGroupId=instance.id)
        return DiaperTrackerRowSerializer(
            dataList,
            many=True,
            context={languageKey: languageId},
        ).data


class DiaperTrackerRowSerializer(serializers.ModelSerializer):
    isAuthorized = serializers.SerializerMethodField()
    diaperTrackerType = serializers.SerializerMethodField()

    class Meta:
        model = DiaperTrackerRow
        fields = [
            "id",
            "createdDate",
            "updatedDate",
            "diaperTrackerTypeId",
            "diaperTrackerGroupId",
            "diaperTrackerType",
            "isAuthorized",
        ]

    def get_isAuthorized(self, instance):
        if isValidData(
            self, instance.diaperTrackerGroupId.medicalProfileId.childId.id
        ):
            return True
        return False

    def validate(self, data):
        errorMessage = ""
        isCheck = False
        if "diaperTrackerGroupId" in data:
            isCheck = validateParentId(
                self,
                data[
                    "diaperTrackerGroupId"
                ].medicalProfileId.childId.parentId.id,
            )
        else:
            errorMessage = "Parent Id does not exit"

        if isCheck:
            return data
        if errorMessage:
            raise serializers.ValidationError({"error": [errorMessage]})
        return data

    def get_diaperTrackerType(self, instance):
        languageId = getLanguage(self)
        return DiaperTrackerTypeSerializer(
            instance.diaperTrackerTypeId,
            context={languageKey: languageId},
        ).data
