from datetime import date
from xml.sax.saxutils import escape
import os

from django.apps import apps
from django.core.management.base import BaseCommand


class Command(BaseCommand):
    help = "Update sitemap.xml file"

    def handle(self, *args, **options):
        site_url = "https://www.getyourmenu.in"
        sitemap_path = "/home/getyourmenu/public_html/prodvenu/getyourmenu/menuApp/templates/sitemap.xml"
        today = date.today().isoformat()

        urls = []

        def add_url(loc, priority="0.8"):
            if not loc:
                return

            loc = str(loc).strip().replace("\n", "").replace("\r", "")
            loc_lower = loc.lower()

            blocked_words = [
                "ckeditor",
                "upload",
                "browse",
                "test",
                "header",
                "footer",
                "package-detail",
                "thanks-page",
            ]

            for word in blocked_words:
                if word in loc_lower:
                    return

            urls.append({
                "loc": loc,
                "lastmod": today,
                "changefreq": "daily",
                "priority": priority,
            })

        static_urls = [
            ("/", "1.0"),
            ("/aboutus/", "0.9"),
            ("/contactus/", "0.9"),
            ("/clientelle/", "0.9"),
            ("/function/", "0.9"),
            ("/occasions/", "0.9"),
            ("/culture/", "0.9"),
            ("/cuisine/", "0.9"),
            ("/portfolio/", "0.9"),
            ("/blog", "0.9"),
        ]

        for path, priority in static_urls:
            add_url(site_url + path, priority)

        slug_fields = [
            "slug",
            "Slug",
            "page_slug",
            "blog_slug",
            "category_slug",
            "function_slug",
            "occasion_slug",
            "culture_slug",
            "cuisine_slug",
            "url_slug",
            "seo_url",
            "seo_slug",
            "alias",
            "url",
        ]

        def get_model(model_name):
            try:
                return apps.get_model("menuApp", model_name)
            except Exception:
                return None

        def get_slug(obj):
            for field in slug_fields:
                value = getattr(obj, field, None)
                if value:
                    return str(value).strip().strip("/")
            return None

        def get_records(model_class):
            records = model_class.objects.all()
            field_names = [field.name for field in model_class._meta.fields]

            if "publish" in field_names:
                try:
                    records = records.filter(publish=True)
                except Exception:
                    pass

            if "status" in field_names:
                try:
                    records = records.filter(status=True)
                except Exception:
                    pass

            if "is_active" in field_names:
                try:
                    records = records.filter(is_active=True)
                except Exception:
                    pass

            return records

        def add_model_urls(model_name, prefix, priority):
            model_class = get_model(model_name)

            if not model_class:
                self.stdout.write("Model not found: {}".format(model_name))
                return

            count = 0

            for obj in get_records(model_class):
                slug = get_slug(obj)

                if slug:
                    add_url(site_url + "/" + prefix + "/" + slug + "/", priority)
                    count += 1

            self.stdout.write("{} URLs added from {}".format(count, model_class.__name__))

        # Correct model names from your project
        add_model_urls("FunctionModel", "function", "0.9")
        add_model_urls("myOccasion", "occasions", "0.8")
        add_model_urls("Culture", "culture", "0.8")
        add_model_urls("Cuisine", "cuisine", "0.8")
        add_model_urls("Post", "blog", "0.8")
        add_model_urls("BlogCategoryModel", "category", "0.8")

        unique_urls = []
        seen = set()

        for item in urls:
            if item["loc"] not in seen:
                unique_urls.append(item)
                seen.add(item["loc"])

        sitemap_content = '<?xml version="1.0" encoding="UTF-8"?>\n'
        sitemap_content += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'

        for item in unique_urls:
            sitemap_content += "  <url>\n"
            sitemap_content += "    <loc>{}</loc>\n".format(escape(item["loc"]))
            sitemap_content += "    <lastmod>{}</lastmod>\n".format(item["lastmod"])
            sitemap_content += "    <changefreq>{}</changefreq>\n".format(item["changefreq"])
            sitemap_content += "    <priority>{}</priority>\n".format(item["priority"])
            sitemap_content += "  </url>\n"

        sitemap_content += "</urlset>\n"

        folder = os.path.dirname(sitemap_path)

        if not os.path.exists(folder):
            os.makedirs(folder)

        with open(sitemap_path, "w", encoding="utf-8") as file:
            file.write(sitemap_content)

        self.stdout.write("Sitemap updated successfully: {}".format(sitemap_path))
        self.stdout.write("Total URLs added: {}".format(len(unique_urls)))
