from django.shortcuts import render
from basic.models import *
from basic.serializers import *
from pregnancy_tools.serializers import *
from common.views import *
from rest_framework import generics
from PIL import Image
from django.core.files.base import ContentFile
import io
import json
from django.core.files import File
from django.http import JsonResponse

# Create your views here.


class ResizeImage:

    def resizeImage(self, filePath):
        djangoFile = None

        if os.path.exists(filePath):
            f = open(filePath, "rb")
            djangoFile = File(f)
        if djangoFile is not None:
            # Open image from Django file
            img = Image.open(djangoFile)

            # Resize to 128×128 (you can also use LANCZOS for better quality)
            img = img.resize((100, 100), Image.LANCZOS)

            # Save to in-memory buffer
            buffer = io.BytesIO()
            img.save(buffer, format="PNG")  # or JPEG, WEBP, etc.
            buffer.seek(0)

            # Create a Django ContentFile
            resized_file = ContentFile(buffer.read(), name=djangoFile.name)
            return resized_file

        return None

class ToolsInitial(generics.GenericAPIView):
    authentication_classes = [APIKeyAuthentication]

    def readPregnancyCare(self):
        with open(
            MEDIA_ROOT + "/add_data_json/pregnancy_care.json", "r", encoding="utf-8"
        ) as file:
            jsonData = json.load(file)
            jsonData = jsonData["pregnancy_care"]
            categoryMapList = jsonData["categories"]
            for categoryMap in categoryMapList:
                categoryMap["createdDate"] = datetime.now()
                categoryMap["updatedDate"] = datetime.now()
                categorySerializer = PregnancyCareCategorySerializer(data = categoryMap)
                if categorySerializer.is_valid():
                    categorySerializer.save()

                    if "id" in categorySerializer.data:
                        categoryLanguageMapList = categoryMap["languageList"]
                        for categoryLanguageMap in categoryLanguageMapList:
                            categoryLanguageMap["pregnancyCareCategoryId"] = categorySerializer.data["id"]
                            categoryLanguageMap["createdDate"] = datetime.now()
                            categoryLanguageMap["updatedDate"] = datetime.now()
                            categoryLanguageSerializer = PregnancyCareCategoryLanguageSerializer(data = categoryLanguageMap)
                            if categoryLanguageSerializer.is_valid():
                                categoryLanguageSerializer.save()
                        
                        itemMapList = categoryMap["itemList"]
                        for itemMap in itemMapList:
                            itemMap["pregnancyCareCategoryId"] = categorySerializer.data["id"]
                            itemMap["createdDate"] = datetime.now()
                            itemMap["updatedDate"] = datetime.now()
                            
                            itemSerializer = PregnancyCareItemSerializer(data = itemMap)
                            if itemSerializer.is_valid():
                                itemSerializer.save()
                                if "id" in itemSerializer.data:
                                    itemLanguageMapList = itemMap["languageList"]
                                    for itemLanguageMap in itemLanguageMapList:
                                        itemLanguageMap["pregnancyCareItemId"] = itemSerializer.data["id"]
                                        itemLanguageMap["createdDate"] = datetime.now()
                                        itemLanguageMap["updatedDate"] = datetime.now()
                                        itemLanguageSerializer = PregnancyCareItemLanguageSerializer(data = itemLanguageMap)
                                        if itemLanguageSerializer.is_valid():
                                            itemLanguageSerializer.save()

    
    def readPregnancyShopping(self):
        with open(
            MEDIA_ROOT + "/add_data_json/pregnancy_shopping.json", "r", encoding="utf-8"
        ) as file:
            jsonData = json.load(file)
            jsonData = jsonData["pregnancy_shopping"]
            categoryMapList = jsonData["categories"]
            for categoryMap in categoryMapList:
                categoryMap["createdDate"] = datetime.now()
                categoryMap["updatedDate"] = datetime.now()
                categorySerializer = PregnancyShoppingCategorySerializer(data = categoryMap)
                if categorySerializer.is_valid():
                    categorySerializer.save()

                    if "id" in categorySerializer.data:
                        categoryLanguageMapList = categoryMap["languageList"]
                        for categoryLanguageMap in categoryLanguageMapList:
                            categoryLanguageMap["pregnancyShoppingCategoryId"] = categorySerializer.data["id"]
                            categoryLanguageMap["createdDate"] = datetime.now()
                            categoryLanguageMap["updatedDate"] = datetime.now()
                            categoryLanguageSerializer = PregnancyShoppingCategoryLanguageSerializer(data = categoryLanguageMap)
                            if categoryLanguageSerializer.is_valid():
                                categoryLanguageSerializer.save()
                        
                        itemMapList = categoryMap["itemList"]
                        for itemMap in itemMapList:
                            itemMap["pregnancyShoppingCategoryId"] = categorySerializer.data["id"]
                            itemMap["createdDate"] = datetime.now()
                            itemMap["updatedDate"] = datetime.now()
                            
                            itemSerializer = PregnancyShoppingItemSerializer(data = itemMap)
                            if itemSerializer.is_valid():
                                itemSerializer.save()
                                if "id" in itemSerializer.data:
                                    itemLanguageMapList = itemMap["languageList"]
                                    for itemLanguageMap in itemLanguageMapList:
                                        itemLanguageMap["pregnancyShoppingItemId"] = itemSerializer.data["id"]
                                        itemLanguageMap["createdDate"] = datetime.now()
                                        itemLanguageMap["updatedDate"] = datetime.now()
                                        itemLanguageSerializer = PregnancyShoppingItemLanguageSerializer(data = itemLanguageMap)
                                        if itemLanguageSerializer.is_valid():
                                            itemLanguageSerializer.save()


    def post(self, request, *args, **kwargs):
        self.readPregnancyCare()
        self.readPregnancyShopping()
        return JsonResponse({"isSuccess": True, "error": ""}, safe=False)


class MonthLyTipData:
    def saveMonthLyTip(self, current):
        monthlyTip = {
            "monthNumber": current["month"],
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
        }
        monthlyTipSer = MonthlyTipSerializer(data=monthlyTip)
        if monthlyTipSer.is_valid():
            monthlyTipSer.save()

            if "id" in monthlyTipSer.data:
                self.saveMonthlyTipLanguage(current, monthlyTipSer.data["id"], "en", 1)
                self.saveMonthlyTipLanguage(current, monthlyTipSer.data["id"], "ar", 2)
                self.saveTip(current, monthlyTipSer.data["id"], "en", 1)
                self.saveTip(current, monthlyTipSer.data["id"], "ar", 2)

    def saveMonthlyTipLanguage(self, current, monthlyTipId, lang, langId):
        monthlyTipLanguage = {
            "title": current["title_" + lang],
            "description": current["text_" + lang],
            "inspiration": current["inspiration_" + lang],
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
            "monthlyTipId": monthlyTipId,
            languageKey: langId,
        }
        monthlyTipLanguageSer = MonthlyTipLanguageSerializer(data=monthlyTipLanguage)
        if monthlyTipLanguageSer.is_valid():
            monthlyTipLanguageSer.save()

            if "id" in monthlyTipLanguageSer.data:
                return True

        return False

    def saveTip(self, current, monthlyTipId, lang, langId):
        if "tips_" + lang in current:
            for selected in current["tips_" + lang]:
                tip = {
                    "createdDate": datetime.now(),
                    "updatedDate": datetime.now(),
                    "monthlyTipId": monthlyTipId,
                }
                tipSer = TipSerializer(data=tip)
                if tipSer.is_valid():
                    tipSer.save()
                    if "id" in tipSer.data:
                        self.saveTipLanguage(selected, tipSer.data["id"], langId)

    def saveTipLanguage(self, description, tipId, langId):
        tipLanguage = {
            "description": description,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
            "tipId": tipId,
            languageKey: langId,
        }
        tipLanguageSer = TipLanguageSerializer(data=tipLanguage)
        if tipLanguageSer.is_valid():
            tipLanguageSer.save()
            if "id" in tipLanguageSer.data:
                return True
        return False

    def readData(self):
        with open(
            MEDIA_ROOT + "/add_data_json/monthly_tips.json", "r", encoding="utf-8"
        ) as file:
            jsonData = json.load(file)
            for monthTips in jsonData:
                self.saveMonthLyTip(monthTips)


class MonthlyTipDataInitial(generics.GenericAPIView):
    authentication_classes = [APIKeyAuthentication]
    queryset = []

    def post(self, request, *args, **kwargs):
        data = MonthLyTipData()
        data.readData()
        return JsonResponse({"isSuccess": True, "error": ""}, safe=False)


class FAQInitial(generics.GenericAPIView):
    authentication_classes = [APIKeyAuthentication]

    def readData(self):
        with open(
            MEDIA_ROOT + "/add_data_json/faq.json", "r", encoding="utf-8"
        ) as file:
            jsonData = json.load(file)
            jsonData = jsonData["faq"]
            for data in jsonData:
                
                qaMapList = []
                for qa in data["questions"]:
                    qaMapList.append(
                        {
                            "createdDate": datetime.now(),
                            "updatedDate": datetime.now(),
                            "faqCategoryId": -1,
                            "languageList": [
                                {
                                    "question": qa["q_en"],
                                    "answer": qa["a_en"],
                                    "faqId" : -1,
                                    "languageId": 1,
                                    "createdDate": datetime.now(),
                                    "updatedDate": datetime.now(),
                                },
                                {
                                    "question": qa["q_ar"],
                                    "answer": qa["a_ar"],
                                    "faqId" : -1,
                                    "languageId": 2,
                                    "createdDate": datetime.now(),
                                    "updatedDate": datetime.now(),
                                },
                            ],
                        }
                    )
                faqCategoryMap = {
                    "createdDate": datetime.now(),
                    "updatedDate": datetime.now(),
                    "languageList": [
                        {
                            "title": data["category_en"],
                            "faqCategoryId":-1,
                            "languageId": 1,
                            "createdDate": datetime.now(),
                            "updatedDate": datetime.now(),
                        },
                        {
                            "title": data["category_ar"],
                            "faqCategoryId":-1,
                            "languageId": 2,
                            "createdDate": datetime.now(),
                            "updatedDate": datetime.now(),
                        },
                    ],
                    "questionList":qaMapList
                }

                faqCategorySer = FAQCategorySerializer(data = faqCategoryMap)
                if faqCategorySer.is_valid():
                    faqCategorySer.save()
                    if "id" in faqCategorySer.data:
                        for faqCategoryLangMap in faqCategoryMap["languageList"]:
                            faqCategoryLangMap["faqCategoryId"] = faqCategorySer.data["id"]
                            faqCategoryLangSer = FAQCategoryLanguageSerializer(data = faqCategoryLangMap)
                            if faqCategoryLangSer.is_valid():
                                faqCategoryLangSer.save()
                        
                        for faqMap in faqCategoryMap["questionList"]:
                            faqMap["faqCategoryId"] = faqCategorySer.data["id"]
                            faqSer = FAQSerializer(data = faqMap)
                            if faqSer.is_valid():
                                faqSer.save()
                                if "id" in faqSer.data:
                                    for faqLanguageMap in faqMap["languageList"]:
                                        faqLanguageMap["faqId"] = faqSer.data["id"]
                                        faqLanguageSer = FAQLanguageSerializer(data = faqLanguageMap)
                                        if faqLanguageSer.is_valid():
                                            faqLanguageSer.save()

    def post(self, request, *args, **kwargs):
        self.readData()
        return JsonResponse({"isSuccess": True, "error": ""}, safe=False)


class PregnancyData:

    def saveWeek(self, current):
        filePath = MEDIA_ROOT + "/" + current["image"]
        resizedFile = None
        resizeImage = ResizeImage()
        resizedFile = resizeImage.resizeImage(filePath)

        week = {
            "id": current["week"],
            "keyName": "week_" + str(current["week"]),
            "weekNumber": current["week"],
            "trimester": current["trimester"],
            "image": resizedFile,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
        }
        selectedSer = PregnancyWeekDetailSerializer(data=week)
        if selectedSer.is_valid():
            selectedSer.save()

        if "id" in selectedSer.data:
            if selectedSer.data["id"] > 0:
                val1 = self.saveWeekLanguage(
                    current["fetal_development"], selectedSer.data["id"], "en", 1
                )
                val2 = self.saveWeekLanguage(
                    current["fetal_development"], selectedSer.data["id"], "ar", 2
                )
                val3 = self.saveSymptomList(current["symptoms"], selectedSer.data["id"])
                val4 = self.saveCheckList(current["checklist"], selectedSer.data["id"])
                val5 = self.saveNutritionList(
                    current["nutrition"], selectedSer.data["id"]
                )
                val6 = self.saveBabySize(
                    current["baby_size"],
                    selectedSer.data["id"],
                    MEDIA_ROOT
                    + "/add_baby_size/"
                    + "week_"
                    + str(current["week"])
                    + ".png",
                )
                if val1 and val2 and val3 and val4 and val5 and val6:
                    return True

        return False

    def saveWeekLanguage(self, current, weekId, langKey, langId):
        isCheck = False
        countError = 0

        weekLanguage = {
            "fetalDevelopment": current[langKey],
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
            "pregnancyWeekId": weekId,
            languageKey: langId,
        }
        selectedSer = PregnancyWeekLanguageSerializer(data=weekLanguage)
        if selectedSer.is_valid():
            selectedSer.save()
            if "id" in selectedSer.data:
                if selectedSer.data["id"] < 0:
                    countError = countError + 1
        if countError == 0:
            isCheck = True
        return isCheck

    # Symptom
    def saveSymptomList(self, current, weekId):
        enList = current["en"]
        arList = current["ar"]
        if enList.__len__() == arList.__len__():
            for i in range(0, enList.__len__(), 1):
                self.saveSymptom(enList[i], arList[i], weekId)

    def saveSymptom(self, descriptionEN, descriptionAR, weekId):
        symptom = {
            "pregnancyWeekId": weekId,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
        }
        selectedSer = PregnancySymptomSerializer(data=symptom)
        if selectedSer.is_valid():
            selectedSer.save()
            if "id" in selectedSer.data:
                val1 = self.saveSymptomLanguage(
                    descriptionEN, selectedSer.data["id"], 1
                )
                val2 = self.saveSymptomLanguage(
                    descriptionAR, selectedSer.data["id"], 2
                )
                if val1 == True and val2 == True:
                    return True
        return False

    def saveSymptomLanguage(self, description, symptomId, langId):
        isCheck = False
        countError = 0
        symptomLanguage = {
            "description": description,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
            "pregnancySymptomId": symptomId,
            "languageId": langId,
        }
        selectedSer = PregnancySymptomLanguageSerializer(data=symptomLanguage)
        if selectedSer.is_valid():
            selectedSer.save()
            if selectedSer.data["id"] < 0:
                countError = countError + 1

        if countError == 0:
            isCheck = True

        return isCheck

    # CheckList
    def saveCheckList(self, current, weekId):
        enList = current["en"]
        arList = current["ar"]
        if enList.__len__() == arList.__len__():
            for i in range(0, enList.__len__(), 1):
                self.saveCheckItem(enList[i], arList[i], weekId)

    def saveCheckItem(self, descriptionEN, descriptionAR, weekId):
        checklist = {
            "pregnancyWeekId": weekId,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
        }
        selectedSer = PregnancyCheckListSerializer(data=checklist)
        if selectedSer.is_valid():
            selectedSer.save()
            if "id" in selectedSer.data:
                val1 = self.saveCheckItemLanguage(
                    descriptionEN, selectedSer.data["id"], 1
                )
                val2 = self.saveCheckItemLanguage(
                    descriptionAR, selectedSer.data["id"], 2
                )
                if val1 == True and val2 == True:
                    return True
        return False

    def saveCheckItemLanguage(self, current, symptomId, langId):
        isCheck = False
        countError = 0
        checkListLanguage = {
            "description": current,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
            "pregnancyCheckListId": symptomId,
            "languageId": langId,
        }
        selectedSer = PregnancyCheckListLanguageSerializer(data=checkListLanguage)
        if selectedSer.is_valid():
            selectedSer.save()
            if selectedSer.data["id"] < 0:
                countError = countError + 1

        if countError == 0:
            isCheck = True

        return isCheck

    # Nutrition
    def saveNutritionList(self, current, weekId):
        enList = current["en"]
        arList = current["ar"]
        if enList.__len__() == arList.__len__():
            for i in range(0, enList.__len__(), 1):
                self.saveNutrition(enList[i], arList[i], weekId)

    def saveNutrition(self, descriptionEN, descriptionAR, weekId):
        nutrition = {
            "pregnancyWeekId": weekId,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
        }
        selectedSer = PregnancyNutritionSerializer(data=nutrition)
        if selectedSer.is_valid():
            selectedSer.save()
            if "id" in selectedSer.data:
                val1 = self.saveNutritionLanguage(
                    descriptionEN, selectedSer.data["id"], 1
                )
                val2 = self.saveNutritionLanguage(
                    descriptionAR, selectedSer.data["id"], 2
                )
                if val1 == True and val2 == True:
                    return True
        return False

    def saveNutritionLanguage(self, current, symptomId, langId):
        isCheck = False
        countError = 0

        nutritionLanguage = {
            "description": current,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
            "pregnancyNutritionId": symptomId,
            "languageId": langId,
        }
        selectedSer = PregnancyNutritionLanguageSerializer(data=nutritionLanguage)
        if selectedSer.is_valid():
            selectedSer.save()
            if selectedSer.data["id"] < 0:
                countError = countError + 1

        if countError == 0:
            isCheck = True

        return isCheck

    # BabySize
    def saveBabySize(self, current, weekId, imagePath):
        filePath = imagePath
        djangoFile = None

        resizedFile = None
        resizeImage = ResizeImage()

        if os.path.exists(filePath):
            resizedFile = resizeImage.resizeImage(filePath)
        else:
            filePath = MEDIA_ROOT + "/add_baby_size/" + "week_2.png"
            resizedFile = resizeImage.resizeImage(filePath)

        babySize = {
            "keyName": "week_" + str(weekId),
            "pregnancyWeekId": weekId,
            "image": resizedFile,
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
        }
        selectedSer = PregnancyBabySizeDetailSerializer(data=babySize)
        if selectedSer.is_valid():
            selectedSer.save()
            if "id" in selectedSer.data:
                val1 = self.saveBabySizeLanguage(
                    current, selectedSer.data["id"], "en", 1
                )
                val2 = self.saveBabySizeLanguage(
                    current, selectedSer.data["id"], "ar", 2
                )
                if val1 == True and val2 == True:
                    return True
        return False

    def saveBabySizeLanguage(self, current, babySizeId, langKey, langId):
        isCheck = False
        countError = 0

        weekLanguage = {
            "description": current[langKey],
            "createdDate": datetime.now(),
            "updatedDate": datetime.now(),
            "pregnancyBabySizeId": babySizeId,
            languageKey: langId,
        }
        selectedSer = PregnancyBabySizeLanguageSerializer(data=weekLanguage)
        if selectedSer.is_valid():
            selectedSer.save()
            if "id" in selectedSer.data:
                if selectedSer.data["id"] < 0:
                    countError = countError + 1

        if countError == 0:
            isCheck = True
        return isCheck

    def readData(self):
        with open(
            MEDIA_ROOT + "/add_data_json/pregnancy_weeks_v3.json", "r", encoding="utf-8"
        ) as file:
            jsonData = json.load(file)
            if "weeks" in jsonData:
                for week in jsonData["weeks"]:
                    self.saveWeek(week)


class PregnancyDataInitial(generics.GenericAPIView):
    authentication_classes = [APIKeyAuthentication]
    queryset = []

    def post(self, request, *args, **kwargs):
        data = PregnancyData()
        data.readData()
        return JsonResponse({"isSuccess": True, "error": ""}, safe=False)


# Setup
class SetupInitial(generics.GenericAPIView):
    authentication_classes = [APIKeyAuthentication]
    queryset = []

    #Done
    def addTokenTypeList(self,jsonData):
        countError = 0

        dataList = jsonData

        for i in dataList:
            tokenTypeSerializer = TokenTypeSerializer(data=i)
            if tokenTypeSerializer.is_valid():
                tokenTypeSerializer.save()
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False

    #Done
    def addLanguageList(self,jsonData):
        countError = 0

        dataList = jsonData

        for i in dataList:
            languageSerializer = LanguageSerializer(data=i)
            if languageSerializer.is_valid():
                languageSerializer.save()
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False
    
    #Done
    def addChildTypeList(self,jsonData):
        countError = 0
        dataList = jsonData

        for i in dataList:
            childTypeSerializer = ChildTypeSerializer(data=i)
            if childTypeSerializer.is_valid():
                childTypeSerializer.save()

                if "id" in childTypeSerializer.data:
                    for j in i["languageList"]:
                        temp = {}
                        temp["name"] = j["name"]
                        temp["childTypeId"] = childTypeSerializer.data["id"]
                        temp["languageId"] = j["languageId"]

                        childTypeLanguageSerializer = ChildTypeLanguageSerializer(
                            data=temp
                        )
                        if childTypeLanguageSerializer.is_valid():
                            childTypeLanguageSerializer.save()
                        else:
                            countError = countError + 1
                else:
                    countError = countError + 1
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False

    #Done
    def addGenderList(self,jsonData):
        countError = 0
        dataList = jsonData

        for i in dataList:
            genderSerializer = GenderSerializer(data=i)
            if genderSerializer.is_valid():
                genderSerializer.save()

                if "id" in genderSerializer.data:
                    for j in i["languageList"]:
                        temp = {}
                        temp["name"] = j["name"]
                        temp["genderId"] = genderSerializer.data["id"]
                        temp["languageId"] = j["languageId"]

                        genderLanguageSerializer = GenderLanguageSerializer(data=temp)
                        if genderLanguageSerializer.is_valid():
                            genderLanguageSerializer.save()
                        else:
                            countError = countError + 1
                else:
                    countError = countError + 1
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False

    #Done
    def addSymptomList(self,jsonData):
        countError = 0
        
        dataList = jsonData

        for i in dataList:
            i["imagePath"] = MEDIA_ROOT+"/"+i["imagePath"]
            if os.path.exists(i["imagePath"]):
                f = open(i["imagePath"], "rb")
                djangoFile = File(f)
                i["image"] = djangoFile

            symptomTypeSerializer = SymptomTypeSerializer(data=i, partial=True)
            if symptomTypeSerializer.is_valid():
                symptomTypeSerializer.save()

                if "id" in symptomTypeSerializer.data:
                    for j in i["languageList"]:
                        temp = {}
                        temp["name"] = j["name"]
                        temp["symptomTypeId"] = symptomTypeSerializer.data["id"]
                        temp["languageId"] = j["languageId"]

                        symptomTypeLanguageSerializer = SymptomTypeLanguageSerializer(
                            data=temp
                        )
                        if symptomTypeLanguageSerializer.is_valid():
                            symptomTypeLanguageSerializer.save()
                        else:
                            countError = countError + 1
                else:
                    countError = countError + 1
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False

    #Done
    def addKickTrackerStatusList(self,jsonData):
        countError = 0
        dataList = jsonData

        for i in dataList:
            kickTrackerStatusSerializer = KickTrackerStatusSerializer(data=i)
            if kickTrackerStatusSerializer.is_valid():
                kickTrackerStatusSerializer.save()

                if "id" in kickTrackerStatusSerializer.data:
                    for j in i["languageList"]:
                        temp = {}
                        temp["name"] = j["name"]
                        temp["description"] = j["description"]
                        temp["kickTrackerStatusId"] = kickTrackerStatusSerializer.data[
                            "id"
                        ]
                        temp["languageId"] = j["languageId"]

                        kickTrackerStatusLanguageSerializer = (
                            KickTrackerStatusLanguageSerializer(data=temp)
                        )
                        if kickTrackerStatusLanguageSerializer.is_valid():
                            kickTrackerStatusLanguageSerializer.save()
                        else:
                            countError = countError + 1
                else:
                    countError = countError + 1
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False

    #Done
    def addBMICaseList(self,jsonData):
        
        bmiMapList = jsonData

        for bmiMapCase in bmiMapList:
            bmiCaseTypeSerializer = BMICaseTypeSerializer(data=bmiMapCase)
            if bmiCaseTypeSerializer.is_valid():
                bmiCaseTypeSerializer.save()

                if "id" in bmiCaseTypeSerializer.data:
                    for bmiCaseTypeLanguage in bmiMapCase["languageList"]:
                        bmiCaseTypeLanguage["bmiCaseTypeId"] = (
                            bmiCaseTypeSerializer.data["id"]
                        )
                        bmiCaseTypeLanguageSerializer = BMICaseTypeLanguageSerializer(
                            data=bmiCaseTypeLanguage
                        )
                        if bmiCaseTypeLanguageSerializer.is_valid():
                            bmiCaseTypeLanguageSerializer.save()

                    for bmiCase in bmiMapCase["caseList"]:
                        bmiCase["bmiCaseTypeId"] = bmiCaseTypeSerializer.data["id"]
                        bmiCaseSerializer = BMICaseSerializer(data=bmiCase)
                        if bmiCaseSerializer.is_valid():
                            bmiCaseSerializer.save()
                            if "id" in bmiCaseSerializer.data:
                                for bmiCaseLanguage in bmiCase["languageList"]:
                                    bmiCaseLanguage["bmiCaseId"] = (
                                        bmiCaseSerializer.data["id"]
                                    )
                                    bmiCaseLanguageSerializer = (
                                        BMICaseLanguageSerializer(data=bmiCaseLanguage)
                                    )
                                    if bmiCaseLanguageSerializer.is_valid():
                                        bmiCaseLanguageSerializer.save()

                                weightGain = bmiCase["weightGain"]
                                weightGain["bmiCaseId"] = bmiCaseSerializer.data["id"]
                                bmiCaseWeightGainSerializer = (
                                    BMICaseWeightGainSerializer(data=weightGain)
                                )
                                if bmiCaseWeightGainSerializer.is_valid():
                                    bmiCaseWeightGainSerializer.save()

        return True

    #Done
    def addCalculationMethodList(self,jsonData):
        countError = 0
        dataList = jsonData

        for i in dataList:
            i["createdDate"] = datetime.now()
            i["updatedDate"] = datetime.now()
            calculateMethodSerializer = CalculationMethodSerializer(data=i)
            if calculateMethodSerializer.is_valid():
                calculateMethodSerializer.save()

                if "id" in calculateMethodSerializer.data:
                    for j in i["languageList"]:
                        temp = {}
                        temp["name"] = j["name"]
                        temp["calculationMethodId"] = calculateMethodSerializer.data[
                            "id"
                        ]
                        temp["languageId"] = j["languageId"]

                        calculationMethodLanguageSerializer = (
                            CalculationMethodLanguageSerializer(data=temp)
                        )
                        if calculationMethodLanguageSerializer.is_valid():
                            calculationMethodLanguageSerializer.save()
                        else:
                            countError = countError + 1
                else:
                    countError = countError + 1
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False

    #Done
    def addDeviceOSTypeList(self,jsonData):

        dataList = jsonData

        countError = 0
        for i in dataList:
            i["createdDate"] = datetime.now()
            i["updatedDate"] = datetime.now()
            deviceOSTypeSerializer = DeviceOSTypeSerializer(data=i)
            if deviceOSTypeSerializer.is_valid():
                deviceOSTypeSerializer.save()
            else:
                countError = countError + 1
        if countError == 0:
            return True
        return False

    def addCheckUpStatusList(self,jsonData):
        countError = 0
        dataList = jsonData

        for i in dataList:
            i["createdDate"] = datetime.now()
            i["updatedDate"] = datetime.now()
            checkUpStatusSerializer = CheckUpStatusSerializer(data=i)
            if checkUpStatusSerializer.is_valid():
                checkUpStatusSerializer.save()

                if "id" in checkUpStatusSerializer.data:
                    for j in i["languageList"]:
                        temp = {}
                        temp["title"] = j["title"]
                        temp["description"] = j["description"]
                        temp["createdDate"] = datetime.now()
                        temp["updatedDate"] = datetime.now()
                        temp["checkUpStatusId"] = checkUpStatusSerializer.data[
                            "id"
                        ]
                        temp["languageId"] = j["languageId"]

                        checkUpStatusLanguageSerializer = (
                            CheckUpStatusLanguageSerializer(data=temp)
                        )
                        if checkUpStatusLanguageSerializer.is_valid():
                            checkUpStatusLanguageSerializer.save()
                        else:
                            countError = countError + 1
                else:
                    countError = countError + 1
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False

    def addSubscriptionPlanList(self,jsonData):
        countError = 0
        dataList = jsonData

        for i in dataList:
            i["createdDate"] = datetime.now()
            i["updatedDate"] = datetime.now()
            subscriptionPlanSerializer = SubscriptionPlanSerializer(data=i)
            if subscriptionPlanSerializer.is_valid():
                subscriptionPlanSerializer.save()

                if "id" in subscriptionPlanSerializer.data:
                    for j in i["languageList"]:
                        temp = {}
                        temp["title"] = j["title"]
                        temp["description"] = j["description"]
                        temp["createdDate"] = datetime.now()
                        temp["updatedDate"] = datetime.now()
                        temp["subscriptionPlanId"] = subscriptionPlanSerializer.data[
                            "id"
                        ]
                        temp["languageId"] = j["languageId"]

                        subscriptionPlanLanguageSerializer = (
                            SubscriptionPlanLanguageSerializer(data=temp)
                        )
                        if subscriptionPlanLanguageSerializer.is_valid():
                            subscriptionPlanLanguageSerializer.save()
                        else:
                            countError = countError + 1
                    
                    for j in i["detailList"]:
                        temp = {}
                        temp["createdDate"] = j["createdDate"]
                        temp["updatedDate"] = j["updatedDate"]
                        temp["subscriptionPlanId"] = subscriptionPlanSerializer.data[
                            "id"
                        ]
                        subscriptionPlanDetailSerializer = SubscriptionPlanDetailSerializer(data=temp)
                        if subscriptionPlanDetailSerializer.is_valid():
                            subscriptionPlanDetailSerializer.save()
                            if "id" in subscriptionPlanDetailSerializer.data:
                                for sj in j["languageList"]:
                                    temp = {}
                                    temp["description"] = sj["description"]
                                    temp["createdDate"] = datetime.now()
                                    temp["updatedDate"] = datetime.now()
                                    temp["subscriptionPlanDetailId"] = subscriptionPlanDetailSerializer.data[
                                        "id"
                                    ]
                                    temp["languageId"] = sj["languageId"]

                                    subscriptionPlanDetailLanguageSerializer = (
                                        SubscriptionPlanDetailLanguageSerializer(data=temp)
                                    )
                                    if subscriptionPlanDetailLanguageSerializer.is_valid():
                                        subscriptionPlanDetailLanguageSerializer.save()
                                    else:
                                        countError = countError + 1                                
                else:
                    countError = countError + 1
            else:
                countError = countError + 1

        if countError == 0:
            return True

        return False

    def addParent(self):
        selected = Language.objects.get(id=1)
        parent = Parent(
            phone="+201019340601",
            password="123456",
            languageId=selected,
            createdDate=datetime.now(),
            updatedDate=datetime.now(),
        )
        parent.save()
        if parent.id is not None:
            parentDetail = ParentDetail(
                firstName="Test1",
                lastName="Test1",
                email="test_1@gmail.com",
                createdDate=datetime.now(),
                updatedDate=datetime.now(),
                parentId=parent,
            )
            parentDetail.save()
            return True
        return False

    def post(self, request, *args, **kwargs):
        jsonData = None

        with open(
            MEDIA_ROOT + "/add_data_json/basic_data.json", "r", encoding="utf-8"
        ) as file:
            jsonData = json.load(file)

        if jsonData is not None:
            jsonData = jsonData["setup_initial_seed"]
            isAdded = self.addTokenTypeList(jsonData["tokenTypeList"])

            if isAdded:
                isAdded = self.addLanguageList(jsonData["languageList"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Token Types list is not added"},
                    safe=False,
                    status=404,
                )

            if isAdded:
                isAdded = self.addChildTypeList(jsonData["childTypeList"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Language list is not added"},
                    safe=False,
                    status=404,
                )

            if isAdded:
                isAdded = self.addGenderList(jsonData["genderList"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Child Type list is not added"},
                    safe=False,
                    status=404,
                )

            if isAdded:
                isAdded = self.addSymptomList(jsonData["symptomTypeList"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Gender list is not added"},
                    safe=False,
                    status=404,
                )

            if isAdded:
                isAdded = self.addKickTrackerStatusList(jsonData["kickTrackerStatusList"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Symptom Types list is not added"},
                    safe=False,
                    status=404,
                )

            if isAdded:
                isAdded = self.addBMICaseList(jsonData["bmiCaseTypeList"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Track Status list is not added"},
                    safe=False,
                    status=404,
                )

            if isAdded:
                isAdded = self.addCalculationMethodList(jsonData["calculationMethodList"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "BMI Case list is not added"},
                    safe=False,
                    status=404,
                )

            if isAdded:
                isAdded = self.addDeviceOSTypeList(jsonData["deviceOSTypeList"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Calculation method list is not added"},
                    safe=False,
                    status=404,
                )
            
            if isAdded:
                isAdded = self.addCheckUpStatusList(jsonData["pregnancy_vital_ranges"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Checkup status list is not added"},
                    safe=False,
                    status=404,
                )
            
            if isAdded:
                isAdded = self.addSubscriptionPlanList(jsonData["subscription_plans"])
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Subscription Plan list is not added"},
                    safe=False,
                    status=404,
                )

            if isAdded:
                isAdded = self.addParent()
            else:
                return JsonResponse(
                    {"isSuccess": False, "error": "Device OS Type List is not Added"},
                    safe=False,
                    status=404,
                )

            if isAdded == False:
                return JsonResponse(
                    {"isSuccess": False, "error": "Can not add Parent"},
                    safe=False,
                    status=404,
                )

        return JsonResponse({"isSuccess": True, "error": ""}, safe=False)
