

import datetime
import os
import time
from django.conf import settings
import requests
from django.db import transaction
from developer.models import Developer
from development.models import BuildingTypeTranslate, Development, FeatureTranslate, Flat, ONHArea, ONHDistrict, ONHPostcode, ONHStation, ONHZone, PaymentOptionTranslate
from development.utils import flat_bedroom_type
from geo_location.models import CityTranslate, Country, CountryTranslate
from .models import Faq, FilterElement, FilterList, FilterType, PromptChecker, SiteMap, SiteMapType
from main.models import FooterMenu, Language, RequestCallBack
from urllib.parse import urlparse, parse_qs
from data_scraper.utils import translate_text_by_google
from django.db.models import Q, Count, Max, Min
from openai import OpenAI
import environ
from main.utils import analyze_phone_number, log_func
env = environ.Env()
environ.Env.read_env()

openai_key = env.str('openai_key')
openai_pr_id = env.str('openai_pr_id')
openai_org_id = env.str('openai_org_id')

def send_lead():
    for rc in RequestCallBack.objects.filter(send_to_bitrix=False):
        message = rc.message
        utm_campaign = rc.utm_campaign
        utm_source = rc.utm_source
        utm_content = rc.utm_content
        utm_medium = rc.utm_medium
        uf_crm_country_code = None
        uf_crm_city_name = None
        source_id = 330 # Entralon.com - Request Call-Back Form
        if message is None:
            message = ""
        if rc.developer is not None:
            message += f"\r for developer {rc.developer.name} "
            if uf_crm_country_code is None:
                if rc.developer.country.code == "UAE":
                    uf_crm_country_code = 2336
                else: uf_crm_country_code = 94
            source_id = 860
            if uf_crm_city_name is None: uf_crm_city_name = rc.developer.city.name
        if rc.development is not None:
            message += f"\r for development {rc.development.title} "
            if rc.development.country.code == "UAE":
                uf_crm_country_code = 2336
            else: uf_crm_country_code = 94
            source_id = 858
            uf_crm_city_name = rc.development.city.name
        if rc.flat is not None:
            message += f"\r for flat bathrooms_num {rc.flat.bathrooms_num} "
        
        if rc.bedroom_num is not None:
            message += f"\r for bedroom {rc.bedroom_num} "
        if rc.budget is not None:
            message += f"\r for budget {rc.budget} "
        if rc.purpose is not None:
            message += f"\r for purpose {rc.purpose} "
        if rc.payment_method is not None:
            message += f"\r for payment method {rc.payment_method} "
        if rc.time_to_move is not None:
            message += f"\r for time to move {rc.time_to_move} "
        if rc.page_url is not None:
            message += f"\r for page url {rc.page_url} "
            parsed_url = urlparse(rc.page_url)
            query_params = parse_qs(parsed_url.query)
            if not utm_campaign: utm_campaign = query_params.get('utm_campaign', [None])[0]
            if not utm_source: utm_source = query_params.get('utm_source', [None])[0]
            if not utm_content: utm_content = query_params.get('utm_content', [None])[0]
            if not utm_medium: utm_medium = query_params.get('utm_medium', [None])[0]
            phone_number = rc.phone_number
        if not isinstance(phone_number, str):
            phone_number = str(phone_number)
        if not phone_number.startswith("+"):
            phone_number = f"+{phone_number}"
        uf_crm_1733589555558 = analyze_phone_number(phone_number)
        base_url = f"""https://entralon.bitrix24.com/rest/2826/av8cnzg5h89ojuca/crm.lead.add.json"""
        title = f"{rc.first_name} {rc.last_name} - New lead Entralon.com"
        params = {
                "FIELDS[TITLE]": title,
                "FIELDS[NAME]": rc.first_name,
                "FIELDS[LAST_NAME]": rc.last_name,
                "FIELDS[EMAIL][0][VALUE]": rc.email or 'null@email.com',
                "FIELDS[EMAIL][0][VALUE_TYPE]": "WORK",
                "FIELDS[PHONE][0][VALUE]": phone_number,
                "FIELDS[PHONE][0][VALUE_TYPE]": "WORK",
                "FIELDS[ASSIGNED_BY_ID]": 34,
                "FIELDS[SOURCE_ID]": source_id,
                "FIELDS[DATE]": rc.date,
                "FIELDS[LANGUAGE]": rc.language,
                "FIELDS[UF_CRM_1677243133]": 1676,
                "FIELDS[UF_CRM_1589211086364]": 122,
                "FIELDS[UF_CRM_1590508686034]": 2316,
                "FIELDS[UF_CRM_1733589555558]": uf_crm_1733589555558,
                "FIELDS[UF_CRM_1589201675]": uf_crm_country_code or 938,
                "FIELDS[UF_CRM_1589201755]": uf_crm_city_name or 'N/A',
                "FIELDS[UTM_CAMPAIGN]": utm_campaign or 'N/A',
                "FIELDS[UTM_SOURCE]": utm_source or 'N/A',
                "FIELDS[UTM_CONTENT]": utm_content or 'N/A',
                "FIELDS[UTM_MEDIUM]": utm_medium or 'N/A',
                "FIELDS[COMMENTS]": message,
        }
        try:
            req = requests.get(base_url, params=params, timeout=30)         
            if req.status_code == 200:
                rc.send_to_bitrix = True
                rc.send_time = time.time()
                rc.save()
            else:
                print(f"""error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : send lead [{rc.id}] request send: {req.text}""")
        except Exception as e:
            print(f"""error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : send lead [{rc.id}]: {e}""")
        
            
def footer_menu_translate():
    languages = Language.objects.exclude(code="en")
    base_language = Language.objects.get(code="en")
    fst = FooterMenu.objects.annotate(tr_num=Count('translates')).filter(tr_num__lt=languages.count()+1).first()
    if fst:
        try:
            fst.translates.get(language=base_language)
        except:
            fst.translates.create(language=base_language, name=fst.name)
        for lang in languages:
            try:
                fst.translates.get(language=lang)
            except:
                t_name = translate_text_by_google(fst.name, to_language=lang.code)
                fst.translates.create(language=lang, name=t_name)
    
def text_translate(text,language,model="gpt-4o-mini"):
    prompt = f"""
    translate the following text to {language} language without changing the meaning of the text:
    {text}
    """
    try:
        client = OpenAI(
            api_key=openai_key,
        )
        
        chat = client.chat.completions.create(
            model = model,
            messages = [{"role": "system", "content": "You are an experienced real estate consultant with deep market knowledge."},
                        {"role": "user", "content": prompt}],
            temperature = 0.7
        )
        generated_text = chat.choices[0].message.content
        generated_text = generated_text.replace("```html", "").replace("```", "")
        return {"error": False, "content":generated_text, "error_txt":None}
    except Exception as e:
        print(f'error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : in text translate error : ', e)
        return {"error": True, "content":None, "error_txt":f"{e}"}
    
def faq_translate():
    languages = Language.objects.exclude(code="en")
    base_language = Language.objects.get(code="en")
    fst = Faq.objects.annotate(tr_num=Count('translates')).filter(tr_num__lt=languages.count()+1).first()
    if fst:
        try:
            fst.translates.get(language=base_language)
        except:
            fst.translates.create(language=base_language, question=fst.question, answer=fst.answer)
        success = True
        for lang in languages:
            try:
                fst.translates.get(language=lang)
            except:
                answer = text_translate(fst.answer, lang.name)
                if answer["error"]:
                    print(f"error on {fst.id} translate answer to {lang.code} language")
                    success = False
                    continue
                question = text_translate(fst.question, lang.name)
                if question["error"]:
                    print(f"error on {fst.id} translate question to {lang.code} language")
                    success = False
                    continue
                fst.translates.create(language=lang, answer=answer["content"], question=question["content"])
        if success:
            fst.is_translated = True
            fst.save()
            
            
def prompt_checker():
    pc = PromptChecker.objects.filter(Q(response__isnull=True) | Q(response="")).first()
    if pc:
        messages = []
        prompt = pc.user_prompt
        if prompt:
            messages.append({"role": "user", "content": prompt})
        system_prompt = pc.system_prompt
        if system_prompt:
            messages.append({"role": "system", "content": system_prompt})
        ai_model = pc.ai_model
        temperature = pc.temperature
        try:
            client = OpenAI(
                api_key=openai_key,
            )
            
            chat = client.chat.completions.create(
                model = ai_model,
                messages = messages,
                temperature = temperature
            )
            generated_text = chat.choices[0].message.content
            pc.response = generated_text
            pc.save()
        except Exception as e:
            print(f'error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : prompt checker [{pc.id}] : ', e)
        
   
def filter_list(language, city):
    
    f = Q(city=city)
    
    developments = Development.objects.filter(f)
    fl, _ = FilterList.objects.get_or_create(language=language, city=city)
    city_slug = f"city-{city.slug}"
    l_code = language.code
    postcode = ONHPostcode.objects.values('name', 'slug').filter(f)
    el_type, _ = FilterType.objects.get_or_create(name="postcode")
    fl.postcode.clear()
    for postcode in postcode: 
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=postcode['name'], slug=f"zipcode-{postcode['slug']}", city=city_slug)
        fl.postcode.add(fe)
        
    area = ONHArea.objects.values('name', 'slug').filter(f)
    el_type, _ = FilterType.objects.get_or_create(name="area")
    fl.area.clear()
    for area in area:
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=area['name'], slug=f"area-{area['slug']}", city=city_slug)
        fl.area.add(fe)
        
    districts = ONHDistrict.objects.values('name', 'slug').filter(f)
    el_type, _ = FilterType.objects.get_or_create(name="district")
    fl.district.clear()
    for district in districts:
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=district['name'], slug=f"district-{district['slug']}", city=city_slug)
        fl.district.add(fe)
    zone = ONHZone.objects.values('name', 'slug').filter(f)
    el_type, _ = FilterType.objects.get_or_create(name="zone")
    fl.zone.clear()
    for zone in zone:
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=zone['name'], slug=f"{zone['slug']}", city=city_slug)
        fl.zone.add(fe)
    station = ONHStation.objects.values('name', 'slug').filter(f)
    el_type, _ = FilterType.objects.get_or_create(name="station")
    fl.station.clear()
    for station in station:
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=station['name'], slug=f"station-{station['slug']}", city=city_slug)
        fl.station.add(fe)
    
    payment_options = PaymentOptionTranslate.objects.select_related('language', "payment_option").values("name", "payment_option__slug").filter(language=language, payment_option__developments__in=developments).order_by('slug').distinct("slug")
    el_type, _ = FilterType.objects.get_or_create(name="payment_option")
    fl.payment_option.clear()
    for payment_option in payment_options:
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=payment_option['name'], slug=f"pay_opt-{payment_option['payment_option__slug']}", city=city_slug)
        fl.payment_option.add(fe)
    building_types = BuildingTypeTranslate.objects.select_related('language', "building_type").values("name", "building_type__slug").filter(language=language, building_type__developments__in=developments).order_by('slug').distinct("slug")
    el_type, _ = FilterType.objects.get_or_create(name="building_type")
    fl.building_type.clear()
    for building_type in building_types:
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=building_type['name'], slug=f"build_type-{building_type['building_type__slug']}", city=city_slug)
        fl.building_type.add(fe)
    features = FeatureTranslate.objects.select_related('language', "feature").values("name", "feature__slug", "feature__icon").filter(language=language, feature__development_features__development__in=developments).exclude(slug__in=["floors", "property-type", "flats"]).distinct()
    el_type, _ = FilterType.objects.get_or_create(name="feature")
    fl.key_feature.clear()
    for feature in features:
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=feature['name'], slug=f"key_feature-{feature['feature__slug']}", city=city_slug)
        fl.key_feature.add(fe)
    prices = Flat.objects.filter(development__in=developments,base_price__gt=0).aggregate(min_price=Min('base_price'), max_price=Max('base_price'))
    
    min_type, _ = FilterType.objects.get_or_create(name="min_price")
    max_type, _ = FilterType.objects.get_or_create(name="max_price")
    try:
        fe = FilterElement.objects.get(language=l_code, type=max_type, slug=f"price-max", city=city_slug)
        fe.name = f"{prices['max_price']}"
        fl.max_price = fe
    except Exception as e:
        fe = FilterElement.objects.create(language=l_code, type=max_type, name=f"{prices['max_price']}", slug=f"price-max", city=city_slug)
        fl.max_price = fe
    try:
        fe = FilterElement.objects.get(language=l_code, type=min_type, slug=f"price-min", city=city_slug)
        fe.name = f"{prices['min_price']}"
        fl.min_price = fe
    except Exception as e:
        fe = FilterElement.objects.create(language=l_code, type=min_type, name=f"{prices['min_price']}", slug=f"price-min", city=city_slug)
        fl.min_price = fe
        
    flats = Flat.objects.filter(development__in=developments, bedrooms_num__lt=10000).distinct()
    el_type, _ = FilterType.objects.get_or_create(name="bedroom")
    fl.bedroom.clear()
    l = sorted(set(list(flats.values_list('bedrooms_num', flat=True))))
    for l in l:
        b_name = flat_bedroom_type(l, l_code) if l < 1 else l
        b_slug = f"bedroom-{l}"
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=b_name, slug=b_slug, city=city_slug)
        fl.bedroom.add(fe)
        
    translates = {
        "en": "Ready To Move",
        "fa": "آماده سکونت",
        "ar": "جاهزة للسكن",
        "ru": "Готовая к переезду",
    }
    el_type, _ = FilterType.objects.get_or_create(name="completion_date")
    fl.completion_date.clear()
    fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=translates[l_code], slug="completion-ready-to-move", city=city_slug)
    fl.completion_date.add(fe)
    now = datetime.datetime.now()
    l = sorted(set(list(Development.objects.filter(completed_at__year__gte=now.year, city=city).values_list('completed_at__year', flat=True))))
    for l in l:
        fe, _ = FilterElement.objects.get_or_create(language=l_code, type=el_type, name=l, slug=f"completion-{l}", city=city_slug)
        fl.bedroom.add(fe)
        
        
def create_filter_list():
    languages = Language.objects.all()
    for language in languages:
        cities = city.objects.all()
        for city in cities:
            filter_list(language, city)


def translate_type(language, title):
    out = ''
    if language.code == "en":
        out = title
    else:
        out = translate_text_by_google(title, to_language=language.code)
    return out

def create_site_map():
    languages = Language.objects.all()
    
    for l in languages:
        try: type_1 = SiteMapType.objects.get(language=l, name="general_page")
        except: type_1 = SiteMapType.objects.create(language=l, name="general_page", title=translate_type(l, "general pages"))
        
        main_pages = [
            SiteMap(type=type_1, language=l, name=translate_type(l, name), 
                    url=f"/{l.code}/{url}", priority=1, change_frequency=freq)
            for name, url, freq in [
                ("Home", "", "daily"),
                ("Privacy Policy", "privacy", "monthly"),
                ("Terms Of Use", "terms", "monthly"),
                ("FAQ", "faq", "monthly"),
                ("About Us", "about", "monthly"),
                ("Contact Us", "contact", "monthly")
            ]
        ]
        SiteMap.objects.bulk_create(main_pages, ignore_conflicts=True)

        
        try: type_4 = SiteMapType.objects.get(language=l, name="development")
        except: type_4 = SiteMapType.objects.create(language=l, name="development", title=translate_type(l, "property list"))
        
        developments = Development.objects.filter(
            is_active=True, 
            developer__is_active=True
        ).select_related('country', 'city', 'developer').prefetch_related('payment_option', 'key_features')
        
        development_maps = [
            SiteMap(type=type_4, language=l, name=dev.title,
                    url=f"/{l.code}/property-{dev.slug}",
                    priority=0.9, change_frequency="daily")
            for dev in developments
        ]
        SiteMap.objects.bulk_create(development_maps, ignore_conflicts=True)
        
        
        try: type_5 = SiteMapType.objects.get(language=l, name="developer")
        except: type_5 = SiteMapType.objects.create(language=l, name="developer", title=translate_type(l, "developers list"))
        
        developer_maps = [
            SiteMap(type=type_5, language=l, name=dev.name,
                    url=f"/{l.code}/developer-{dev.slug}",
                    priority=0.9, change_frequency="daily")
            for dev in Developer.objects.filter(is_active=True)
        ]
        SiteMap.objects.bulk_create(developer_maps, ignore_conflicts=True)
        
        try: type_3 = SiteMapType.objects.get(language=l, name="city")
        except: type_3 = SiteMapType.objects.create(language=l, name="city", title=translate_type(l, "cities list"))
        
        try: type_6 = SiteMapType.objects.get(language=l, name="district")
        except: type_6 = SiteMapType.objects.create(language=l, name="district", title=translate_type(l, "districts list"))
        try: type_7 = SiteMapType.objects.get(language=l, name="area")
        except: type_7 = SiteMapType.objects.create(language=l, name="area", title=translate_type(l, "area list"))
        try: type_8 = SiteMapType.objects.get(language=l, name="postcode")
        except: type_8 = SiteMapType.objects.create(language=l, name="postcode", title=translate_type(l, "postcode list"))
        try: type_9 = SiteMapType.objects.get(language=l, name="zone")
        except: type_9 = SiteMapType.objects.create(language=l, name="zone", title=translate_type(l, "zone list"))
        try: type_10 = SiteMapType.objects.get(language=l, name="station")
        except: type_10 = SiteMapType.objects.create(language=l, name="station", title=translate_type(l, "station list"))
        try: type_11 = SiteMapType.objects.get(language=l, name="bedrooms")
        except: type_11 = SiteMapType.objects.create(language=l, name="bedrooms", title=translate_type(l, "bedrooms list"))
        try: type_12 = SiteMapType.objects.get(language=l, name="feature")
        except: type_12 = SiteMapType.objects.create(language=l, name="feature", title=translate_type(l, "feature list"))
        try: type_13 = SiteMapType.objects.get(language=l, name="payment_option")
        except: type_13 = SiteMapType.objects.create(language=l, name="payment_option", title=translate_type(l, "payment option list"))
        
        try: type_14 = SiteMapType.objects.get(language=l, name="district_area")
        except: type_14 = SiteMapType.objects.create(language=l, name="district_area", title=translate_type(l, "list of district and area filter"))
        try: type_15 = SiteMapType.objects.get(language=l, name="district_postcode")
        except: type_15 = SiteMapType.objects.create(language=l, name="district_postcode", title=translate_type(l, "list of district and postcode filter"))
        try: type_16 = SiteMapType.objects.get(language=l, name="district_zone")
        except: type_16 = SiteMapType.objects.create(language=l, name="district_zone", title=translate_type(l, "list of district and zone filter"))
        try: type_17 = SiteMapType.objects.get(language=l, name="district_station")
        except: type_17 = SiteMapType.objects.create(language=l, name="district_station", title=translate_type(l, "list of district and station filter"))
        try: type_18 = SiteMapType.objects.get(language=l, name="district_bedrooms")
        except: type_18 = SiteMapType.objects.create(language=l, name="district_bedrooms", title=translate_type(l, "list of district and bedrooms filter"))
        try: type_19 = SiteMapType.objects.get(language=l, name="district_feature")
        except: type_19 = SiteMapType.objects.create(language=l, name="district_feature", title=translate_type(l, "list of district and feature filter"))
        try: type_20 = SiteMapType.objects.get(language=l, name="district_payment_option")
        except: type_20 = SiteMapType.objects.create(language=l, name="district_payment_option", title=translate_type(l, "list of district and payment option filter"))
        
        try: type_21 = SiteMapType.objects.get(language=l, name="area_postcode")
        except: type_21 = SiteMapType.objects.create(language=l, name="area_postcode", title=translate_type(l, "list of area and postcode filter"))
        try: type_22 = SiteMapType.objects.get(language=l, name="area_zone")
        except: type_22 = SiteMapType.objects.create(language=l, name="area_zone", title=translate_type(l, "list of area and zone filter"))
        try: type_23 = SiteMapType.objects.get(language=l, name="area_station")
        except: type_23 = SiteMapType.objects.create(language=l, name="area_station", title=translate_type(l, "list of area and station filter"))
        try: type_24 = SiteMapType.objects.get(language=l, name="area_bedrooms")
        except: type_24 = SiteMapType.objects.create(language=l, name="area_bedrooms", title=translate_type(l, "list of area and bedrooms filter"))
        try: type_25 = SiteMapType.objects.get(language=l, name="area_feature")
        except: type_25 = SiteMapType.objects.create(language=l, name="area_feature", title=translate_type(l, "list of area and feature filter"))
        try: type_26 = SiteMapType.objects.get(language=l, name="area_payment_option")
        except: type_26 = SiteMapType.objects.create(language=l, name="area_payment_option", title=translate_type(l, "list of area and payment option filter"))
        
        try: type_27 = SiteMapType.objects.get(language=l, name="postcode_zone")
        except: type_27 = SiteMapType.objects.create(language=l, name="postcode_zone", title=translate_type(l, "list of postcode and zone filter"))
        try: type_28 = SiteMapType.objects.get(language=l, name="postcode_station")
        except: type_28 = SiteMapType.objects.create(language=l, name="postcode_station", title=translate_type(l, "list of postcode and station filter"))
        try: type_29 = SiteMapType.objects.get(language=l, name="postcode_bedrooms")
        except: type_29 = SiteMapType.objects.create(language=l, name="postcode_bedrooms", title=translate_type(l, "list of postcode and bedrooms filter"))
        try: type_30 = SiteMapType.objects.get(language=l, name="postcode_feature")
        except: type_30 = SiteMapType.objects.create(language=l, name="postcode_feature", title=translate_type(l, "list of postcode and feature filter"))
        try: type_31 = SiteMapType.objects.get(language=l, name="postcode_payment_option")
        except: type_31 = SiteMapType.objects.create(language=l, name="postcode_payment_option", title=translate_type(l, "list of postcode and payment option filter"))
        
        try: type_32 = SiteMapType.objects.get(language=l, name="zone_station")
        except: type_32 = SiteMapType.objects.create(language=l, name="zone_station", title=translate_type(l, "list of zone and station filter"))
        try: type_33 = SiteMapType.objects.get(language=l, name="zone_bedrooms")
        except: type_33 = SiteMapType.objects.create(language=l, name="zone_bedrooms", title=translate_type(l, "list of zone and bedrooms filter"))
        try: type_34 = SiteMapType.objects.get(language=l, name="zone_feature")
        except: type_34 = SiteMapType.objects.create(language=l, name="zone_feature", title=translate_type(l, "list of zone and feature filter"))
        try: type_35 = SiteMapType.objects.get(language=l, name="zone_payment_option")
        except: type_35 = SiteMapType.objects.create(language=l, name="zone_payment_option", title=translate_type(l, "list of zone and payment option filter"))
        
        try: type_36 = SiteMapType.objects.get(language=l, name="station_bedrooms")
        except: type_36 = SiteMapType.objects.create(language=l, name="station_bedrooms", title=translate_type(l, "list of station and bedrooms filter"))
        try: type_37 = SiteMapType.objects.get(language=l, name="station_feature")
        except: type_37 = SiteMapType.objects.create(language=l, name="station_feature", title=translate_type(l, "list of station and feature filter"))
        try: type_38 = SiteMapType.objects.get(language=l, name="station_payment_option")
        except: type_38 = SiteMapType.objects.create(language=l, name="station_payment_option", title=translate_type(l, "list of station and payment option filter"))
        
        try: type_39 = SiteMapType.objects.get(language=l, name="bedrooms_feature")
        except: type_39 = SiteMapType.objects.create(language=l, name="bedrooms_feature", title=translate_type(l, "list of bedrooms and feature filter"))
        try: type_40 = SiteMapType.objects.get(language=l, name="bedrooms_payment_option")
        except: type_40 = SiteMapType.objects.create(language=l, name="bedrooms_payment_option", title=translate_type(l, "list of bedrooms and payment option filter"))
        
        try: type_41 = SiteMapType.objects.get(language=l, name="feature_payment_option")
        except: type_41 = SiteMapType.objects.create(language=l, name="feature_payment_option", title=translate_type(l, "list of feature and payment option filter"))
        
        cities = CityTranslate.objects.filter(language=l, city__is_featured=True).select_related('city')
        for city in cities:
            city_url = f"/{l.code}/city-{city.slug}"
            
            city_developments = developments.filter(city=city.city)
            payment_options = PaymentOptionTranslate.objects.filter(
                language=l,
                payment_option__developments__in=city_developments
            ).values('name', 'payment_option__slug').distinct()

            features = FeatureTranslate.objects.filter(
                language=l,
                feature__development_features__development__in=city_developments
            ).exclude(
                slug__in=["floors", "property-type", "flats"]
            ).values('name', 'feature__slug').distinct()

            bedrooms = sorted(set(
                Flat.objects.filter(
                    development__in=city_developments,
                    bedrooms_num__lt=10000
                ).values_list('bedrooms_num', flat=True)
            ))

            # Create batches of sitemaps
            sitemap_batch = []
            # name = translate_type(l, f"new property in {city.name}")
            sitemap_batch.append(SiteMap(type=type_3, language=l, name=f"new property in {city.name}", url=f"{city_url}", priority=0.6, change_frequency="daily"))
            for district in ONHDistrict.objects.filter(city=city.city):
                district_url = f"{city_url}/district-{district.slug}"
                sitemap_batch.append(SiteMap(type=type_6, language=l, name=f"new property in {district.name}", url=f"{district_url}", priority=0.6, change_frequency="daily"))
                
                # for area in ONHArea.objects.filter(city=city.city):
                #     area_url = f"{district_url}/area-{area.slug}"
                #     sitemap_batch.append(SiteMap(type=type_14, language=l, name=f"new property in {district.name} and {area.name}", url=f"{area_url}", priority=0.4, change_frequency="daily"))
                # for postcode in ONHPostcode.objects.filter(city=city.city):
                #     postcode_url = f"{district_url}/zipcode-{postcode.slug}"
                #     sitemap_batch.append(SiteMap(type=type_15, language=l, name=f"new property in {district.name} and {postcode.name}", url=f"{postcode_url}", priority=0.4, change_frequency="daily"))
                # for zone in ONHZone.objects.filter(city=city.city):
                #     zone_url = f"{district_url}/{zone.slug}"
                #     sitemap_batch.append(SiteMap(type=type_16, language=l, name=f"new property in {district.name} and {zone.name}", url=f"{zone_url}", priority=0.4, change_frequency="daily"))
                # for station in ONHStation.objects.filter(city=city.city):
                #     station_url = f"{district_url}/station-{station.slug}"
                #     sitemap_batch.append(SiteMap(type=type_17, language=l, name=f"new property in {district.name} and {station.name}", url=f"{station_url}", priority=0.4, change_frequency="daily"))
                # for bn in bedrooms:
                #     bedrooms_url = f"{district_url}/bedroom-{bn}"
                #     sitemap_batch.append(SiteMap(type=type_18, language=l, name=f"new property in {district.name} with {flat_bedroom_type(bn, l.code)}", url=f"{bedrooms_url}", priority=0.4, change_frequency="daily"))
                # for feature in features:
                #     feature_url = f"{district_url}/key_feature-{feature['feature__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_19, language=l, name=f"new property in {district.name} with {feature['name']}", url=f"{feature_url}", priority=0.4, change_frequency="daily"))
                # for payment_option in payment_options:
                #     payment_option_url = f"{district_url}/pay_opt-{payment_option['payment_option__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_20, language=l, name=f"new property in {district.name} by {payment_option['name']}", url=f"{payment_option_url}", priority=0.4, change_frequency="daily"))
        
            for area in ONHArea.objects.filter(city=city.city):
                area_url = f"{city_url}/area-{area.slug}"
                sitemap_batch.append(SiteMap(type=type_7, language=l, name=f"new property in {area.name}", url=f"{area_url}", priority=0.6, change_frequency="daily"))
                
                # for postcode in ONHPostcode.objects.filter(city=city.city):
                #     postcode_url = f"{area_url}/zipcode-{postcode.slug}"
                #     sitemap_batch.append(SiteMap(type=type_21, language=l, name=f"new property in {area.name} and {postcode.name}", url=f"{postcode_url}", priority=0.4, change_frequency="daily"))
                # for zone in ONHZone.objects.filter(city=city.city):
                #     zone_url = f"{area_url}/{zone.slug}"
                #     sitemap_batch.append(SiteMap(type=type_22, language=l, name=f"new property in {area.name} and {zone.name}", url=f"{zone_url}", priority=0.4, change_frequency="daily"))
                # for station in ONHStation.objects.filter(city=city.city):
                #     station_url = f"{area_url}/station-{station.slug}"
                #     sitemap_batch.append(SiteMap(type=type_23, language=l, name=f"new property in {area.name} and {station.name}", url=f"{station_url}", priority=0.4, change_frequency="daily"))
                # for bn in bedrooms:
                #     bedrooms_url = f"{area_url}/bedroom-{bn}"
                #     sitemap_batch.append(SiteMap(type=type_24, language=l, name=f"new property in {area.name} with {flat_bedroom_type(bn, l.code)}", url=f"{bedrooms_url}", priority=0.4, change_frequency="daily"))
                # for feature in features:
                #     feature_url = f"{area_url}/key_feature-{feature['feature__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_25, language=l, name=f"new property in {area.name} with {feature['name']}", url=f"{feature_url}", priority=0.4, change_frequency="daily"))
                # for payment_option in payment_options:
                #     payment_option_url = f"{area_url}/pay_opt-{payment_option['payment_option__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_26, language=l, name=f"new property in {area.name} by {payment_option['name']}", url=f"{payment_option_url}", priority=0.4, change_frequency="daily"))
                
            for postcode in ONHPostcode.objects.filter(city=city.city):
                postcode_url = f"{city_url}/zipcode-{postcode.slug}"
                sitemap_batch.append(SiteMap(type=type_8, language=l, name=f"new property in {postcode.name}", url=f"{postcode_url}", priority=0.6, change_frequency="daily"))
                
                # for zone in ONHZone.objects.filter(city=city.city):
                #     zone_url = f"{postcode_url}/{zone.slug}"
                #     sitemap_batch.append(SiteMap(type=type_27, language=l, name=f"new property in {postcode.name} and {zone.name}", url=f"{zone_url}", priority=0.4, change_frequency="daily"))
                # for station in ONHStation.objects.filter(city=city.city):
                #     station_url = f"{postcode_url}/station-{station.slug}"
                #     sitemap_batch.append(SiteMap(type=type_28, language=l, name=f"new property in {postcode.name} and {station.name}", url=f"{station_url}", priority=0.4, change_frequency="daily"))
                # for bn in bedrooms:
                #     bedrooms_url = f"{postcode_url}/bedroom-{bn}"
                #     sitemap_batch.append(SiteMap(type=type_29, language=l, name=f"new property in {postcode.name} with {flat_bedroom_type(bn, l.code)}", url=f"{bedrooms_url}", priority=0.4, change_frequency="daily"))
                # for feature in features:
                #     feature_url = f"{postcode_url}/key_feature-{feature['feature__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_30, language=l, name=f"new property in {postcode.name} with {feature['name']}", url=f"{feature_url}", priority=0.4, change_frequency="daily"))
                # for payment_option in payment_options:
                #     payment_option_url = f"{postcode_url}/pay_opt-{payment_option['payment_option__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_31, language=l, name=f"new property in {postcode.name} by {payment_option['name']}", url=f"{payment_option_url}", priority=0.4, change_frequency="daily"))
                
            for zone in ONHZone.objects.filter(city=city.city):
                zone_url = f"{city_url}/{zone.slug}"
                sitemap_batch.append(SiteMap(type=type_9, language=l, name=f"new property in {zone.name}", url=f"{zone_url}", priority=0.6, change_frequency="daily"))
                
                # for station in ONHStation.objects.filter(city=city.city):
                #     station_url = f"{zone_url}/station-{station.slug}"
                #     sitemap_batch.append(SiteMap(type=type_32, language=l, name=f"new property in {zone.name} and {station.name}", url=f"{station_url}", priority=0.4, change_frequency="daily"))
                # for bn in bedrooms:
                #     bedrooms_url = f"{zone_url}/bedroom-{bn}"
                #     sitemap_batch.append(SiteMap(type=type_33, language=l, name=f"new property in {zone.name} with {flat_bedroom_type(bn, l.code)}", url=f"{bedrooms_url}", priority=0.4, change_frequency="daily"))
                # for feature in features:
                #     feature_url = f"{zone_url}/key_feature-{feature['feature__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_34, language=l, name=f"new property in {zone.name} with {feature['name']}", url=f"{feature_url}", priority=0.4, change_frequency="daily"))
                # for payment_option in payment_options:
                #     payment_option_url = f"{zone_url}/pay_opt-{payment_option['payment_option__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_35, language=l, name=f"new property in {zone.name} by {payment_option['name']}", url=f"{payment_option_url}", priority=0.4, change_frequency="daily"))
                
            for station in ONHStation.objects.filter(city=city.city):
                station_url = f"{city_url}/station-{station.slug}"
                sitemap_batch.append(SiteMap(type=type_10, language=l, name=f"new property in {station.name}", url=f"{station_url}", priority=0.6, change_frequency="daily"))
            
                # for bn in bedrooms:
                #     bedrooms_url = f"{station_url}/bedroom-{bn}"
                #     sitemap_batch.append(SiteMap(type=type_36, language=l, name=f"new property in {station.name} with {flat_bedroom_type(bn, l.code)}", url=f"{bedrooms_url}", priority=0.4, change_frequency="daily"))
                # for feature in features:
                #     feature_url = f"{station_url}/key_feature-{feature['feature__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_37, language=l, name=f"new property in {station.name} with {feature['name']}", url=f"{feature_url}", priority=0.4, change_frequency="daily"))
                # for payment_option in payment_options:
                #     payment_option_url = f"{station_url}/pay_opt-{payment_option['payment_option__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_38, language=l, name=f"new property in {station.name} by {payment_option['name']}", url=f"{payment_option_url}", priority=0.4, change_frequency="daily"))
                
            for bn in bedrooms:
                bedrooms_url = f"{city_url}/bedroom-{bn}"
                sitemap_batch.append(SiteMap(type=type_11, language=l, name=f"new property with {flat_bedroom_type(bn, l.code)}", url=f"{bedrooms_url}", priority=0.6, change_frequency="daily"))
                
                # for feature in features:
                #     feature_url = f"{bedrooms_url}/key_feature-{feature['feature__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_39, language=l, name=f"new property with {flat_bedroom_type(bn, l.code)} and {feature['name']}", url=f"{feature_url}", priority=0.4, change_frequency="daily"))
                # for payment_option in payment_options:
                #     payment_option_url = f"{bedrooms_url}/pay_opt-{payment_option['payment_option__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_40, language=l, name=f"new property with {flat_bedroom_type(bn, l.code)} and {payment_option['name']}", url=f"{payment_option_url}", priority=0.4, change_frequency="daily"))
                
            for feature in features:
                feature_url = f"{city_url}/key_feature-{feature['feature__slug']}"
                sitemap_batch.append(SiteMap(type=type_12, language=l, name=f"new property with {feature['name']}", url=f"{feature_url}", priority=0.6, change_frequency="daily"))
                
                # for payment_option in payment_options:
                #     payment_option_url = f"{feature_url}/pay_opt-{payment_option['payment_option__slug']}"
                #     sitemap_batch.append(SiteMap(type=type_41, language=l, name=f"new property with {feature['name']} and {payment_option['name']}", url=f"{payment_option_url}", priority=0.4, change_frequency="daily"))
                
            for payment_option in payment_options:
                payment_option_url = f"{city_url}/pay_opt-{payment_option['payment_option__slug']}"
                sitemap_batch.append(SiteMap(type=type_13, language=l, name=f"new property with {payment_option['name']}", url=f"{payment_option_url}", priority=0.6, change_frequency="daily"))
                
            if sitemap_batch:
                SiteMap.objects.bulk_create(
                    sitemap_batch,
                    ignore_conflicts=True,
                    batch_size=1000
                )
                
    
def create_sitemap_file():
    # Main sitemap index file
    main_sitemap = '<?xml version="1.0" encoding="UTF-8"?>\n'
    main_sitemap += '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'
    main_dir = settings.BASE_DIR / "../sitemaps"
    if not os.path.exists(main_dir):
        os.makedirs(main_dir)
    # Generate app-specific sitemaps
    sitemap_types = SiteMapType.objects.all()
    base_url = "https://entralon.com"
    
    for map_type in sitemap_types:
        type_name = map_type.name
        l_code = map_type.language.code
        # Add reference to each type's sitemap in the index
        main_sitemap += f'  <sitemap>\n'
        main_sitemap += f'    <loc>{base_url}/sitemaps/sitemap_{l_code}_{type_name}.xml</loc>\n'
        main_sitemap += f'    <lastmod>{datetime.datetime.now().strftime("%Y-%m-%d")}</lastmod>\n'
        main_sitemap += f'  </sitemap>\n'
        
        # Create individual sitemap files for each type
        type_sitemap = '<?xml version="1.0" encoding="UTF-8"?>\n'
        type_sitemap += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'
        
        for sitemap in SiteMap.objects.filter(type=map_type):
            type_sitemap += '  <url>\n'
            type_sitemap += f'    <loc>{base_url}{sitemap.url}</loc>\n'
            type_sitemap += f'    <changefreq>{sitemap.change_frequency}</changefreq>\n'
            type_sitemap += f'    <priority>{sitemap.priority}</priority>\n'
            type_sitemap += '  </url>\n'
        
        type_sitemap += '</urlset>'
        
        # Write type-specific sitemap file
        with open(f'{main_dir}/sitemap_{l_code}_{type_name}.xml', 'w', encoding='utf-8') as f:
            f.write(type_sitemap)
    
    main_sitemap += '</sitemapindex>'
    
    # Write main sitemap index file
    with open(f'{main_dir}/sitemap.xml', 'w', encoding='utf-8') as f:
        f.write(main_sitemap)