from functools import lru_cache
from pathlib import Path

from django import template
from django.conf import settings
from django.templatetags.static import static


register = template.Library()


SCENIC_FALLBACKS = [
    "images/aarya-hero.png",
    "images/wayanad.jpg",
    "images/himachal.jpg",
    "images/kerala.jpg",
    "images/singapore.jpg",
]

PLACEHOLDER_IMAGE = "images/travel-placeholder.svg"


def _static_webp_candidate(path):
    candidate = Path(path)
    if candidate.suffix.lower() == ".webp":
        return static(str(candidate).replace("\\", "/"))

    webp_candidate = candidate.with_suffix(".webp")
    file_path = settings.BASE_DIR / "static" / webp_candidate
    if file_path.exists():
        return static(str(webp_candidate).replace("\\", "/"))

    return ""

DESTINATION_KEYWORDS = {
    "chikmagalur": "chikmagalur",
    "chikkamagaluru": "chikmagalur",
    "chikkamangaluru": "chikmagalur",
    "coorg": "coorg",
    "kodagu": "coorg",
    "mysore": "mysore",
    "ooty": "ooty",
    "hampi": "hampi",
    "dandeli": "dandeli",
    "kerala": "kerala",
    "goa": "goa",
    "himachal": "himachal",
    "kashmir": "kashmir",
    "darjeeling": "darjeeling-gangtok",
    "gangtok": "darjeeling-gangtok",
    "golden triangle": "golden-triangle",
    "bhutan": "bhutan",
    "thailand": "thailand",
    "singapore": "singapore",
    "malaysia": "malaysia",
    "dubai": "dubai",
    "bali": "bali",
    "andaman": "andaman",
    "rajasthan": "rajasthan",
}

DESTINATION_FILE_PREFIXES = {
    "chikmagalur": ["chikmagalur", "chikkamagaluru", "chikkamangaluru"],
    "coorg": ["coorg", "coorag"],
    "mysore": ["mysore"],
    "ooty": ["ooty"],
    "hampi": ["hampi"],
    "dandeli": ["dandeli"],
    "kerala": ["kerala"],
    "goa": ["goa"],
    "himachal": ["himachal"],
    "kashmir": ["kashmir", "ashmir"],
    "darjeeling-gangtok": ["darjeeling", "gangtok", "darjeeling himalayan railway", "darjeeling-himalayan-railway"],
    "golden-triangle": ["golden-triangle", "golden triangle", "golden", "triangle"],
    "bhutan": ["bhutan", "buthan", "butha"],
    "thailand": ["thailand", "bangkok", "pattaya"],
    "singapore": ["singapore"],
    "malaysia": ["malaysia"],
    "dubai": ["dubai"],
    "bali": ["bali"],
    "andaman": ["andaman"],
    "rajasthan": ["rajasthan"],
}

SERVICE_GROUPS = {
    "airport-pickup": ["images/cabs/etios-realistic.jpg", "images/cabs/dzire-realistic.jpg"],
    "airport-drop": ["images/cabs/dzire-realistic.jpg", "images/cabs/etios-realistic.jpg"],
    "local-cab": ["images/cabs/etios-realistic.jpg", "images/cabs/innova-realistic.jpeg"],
    "outstation-cab": ["images/cabs/innova-realistic.jpeg", "images/cabs/crysta-realistic.jpg"],
    "round-trip": ["images/cabs/dzire-realistic.jpg", "images/cabs/innova-realistic.jpeg"],
    "one-way": ["images/cabs/etios-realistic.jpg", "images/cabs/dzire-realistic.jpg"],
    "corporate-travel": ["images/cabs/crysta-realistic.jpg", "images/cabs/innova-realistic.jpeg"],
    "wedding-travel": ["images/cabs/crysta-realistic.jpg", "images/cabs/tempo-traveller-16.jpg"],
}

ALIAS_GROUPS = {
    "goa-beach-escape": "goa",
    "coorg-coffee-trails": "coorg",
    "ooty-hills-retreat": "ooty",
    "kerala-backwater-holiday": "kerala",
    "mysore-heritage-weekend": "mysore",
    "chikmagalur-scenic-break": "chikmagalur",
}


@lru_cache(maxsize=1)
def _destination_image_groups():
    image_dir = settings.BASE_DIR / "static" / "images"
    if not image_dir.exists():
        return {}

    allowed_ext = {".jpg", ".jpeg", ".png", ".webp"}
    excluded_names = {"logo.jpeg", "logo-navbar.jpeg", "travel-placeholder.svg"}

    groups = {key: [] for key in DESTINATION_FILE_PREFIXES}
    image_paths = sorted(image_dir.iterdir(), key=lambda path: path.name.lower())
    for image_path in image_paths:
        name_lower = image_path.name.lower()
        if image_path.suffix.lower() not in allowed_ext or name_lower in excluded_names:
            continue

        stem = Path(name_lower).stem
        normalized = stem.replace("_", "-")
        for key, prefixes in DESTINATION_FILE_PREFIXES.items():
            for prefix in prefixes:
                if normalized == prefix or normalized.startswith(f"{prefix}-") or normalized.startswith(prefix):
                    groups[key].append(f"images/{image_path.name}")
                    break
            else:
                continue
            break

    return {key: value for key, value in groups.items() if value}


def _destination_key_for_item(item):
    slug = (getattr(item, "slug", "") or "").lower().replace("_", "-")
    title = (getattr(item, "title", "") or getattr(item, "name", "") or "").lower()
    location = (getattr(item, "location", "") or "").lower()
    haystack = " ".join([slug, title, location]).replace("&", "and")

    if slug in ALIAS_GROUPS:
        return ALIAS_GROUPS[slug]

    for keyword, destination_key in DESTINATION_KEYWORDS.items():
        if keyword in haystack:
            return destination_key

    return ""

PRICE_FALLBACKS = {
    "goa": "9,500",
    "goa-beach-escape": "9,500",
    "coorg": "8,500",
    "coorg-coffee-trails": "8,500",
    "kerala": "14,000",
    "kerala-backwater-holiday": "14,000",
    "rajasthan": "18,000",
    "andaman": "16,500",
    "chikmagalur": "7,500",
    "chikmagalur-scenic-break": "7,500",
    "hampi": "7,000",
    "dandeli": "7,800",
    "mauritius": "1,15,000",
    "bali": "1,00,000",
    "bangkok-pattaya": "63,000",
    "bangkok": "63,000",
    "pattaya": "63,000",
    "singapore-malaysia": "1,20,000",
    "singapore": "1,20,000",
    "malaysia": "1,20,000",
    "maldives": "95,000",
    "europe": "2,50,000",
    "manali": "22,000",
    "ooty": "12,500",
    "ooty-hills-retreat": "12,500",
    "mysore": "6,500",
    "mysore-heritage-weekend": "6,500",
}


def _sequence_for(item):
    slug = (getattr(item, "slug", "") or "").lower()
    if slug in SERVICE_GROUPS:
        return SERVICE_GROUPS[slug]

    destination_key = _destination_key_for_item(item)
    destination_groups = _destination_image_groups()
    if destination_key:
        if destination_key in destination_groups:
            return destination_groups[destination_key]
        return [PLACEHOLDER_IMAGE]

    return SCENIC_FALLBACKS


@register.simple_tag
def travel_image(item):
    image = getattr(item, "image", None)
    if image:
        try:
            return image.url
        except ValueError:
            pass

    sequence = _sequence_for(item)
    slug = getattr(item, "slug", "") or getattr(item, "title", "") or getattr(item, "name", "") or "travel"
    index = sum(ord(char) for char in slug) % len(sequence)
    return static(sequence[index])


@register.simple_tag
def travel_price(item):
    price = getattr(item, "price_from", None)
    if price:
        return f"{int(price):,}"

    slug = getattr(item, "slug", "") or ""
    title = getattr(item, "title", "") or getattr(item, "name", "") or ""
    location = getattr(item, "location", "") or ""
    haystack = f"{slug} {title} {location}".lower().replace("&", "and")

    for key, value in PRICE_FALLBACKS.items():
        normalized_key = key.replace("-", " ")
        if key in slug or normalized_key in haystack:
            return value

    return ""


@register.simple_tag
def static_webp(path):
    return _static_webp_candidate(path)


@register.simple_tag
def static_webp_srcset(path):
    candidate = Path(path)
    base_name = candidate.stem
    widths = [640, 1024]
    entries = []

    for width in widths:
        variant = candidate.with_name(f"{base_name}-{width}.webp")
        file_path = settings.BASE_DIR / "static" / variant
        if file_path.exists():
            entries.append(f"{static(str(variant).replace('\\', '/'))} {width}w")

    fallback = _static_webp_candidate(path)
    if fallback:
        entries.append(f"{fallback} 1350w")

    return ", ".join(entries)
