"""Built-in draft and shadow-only profile definitions."""

from __future__ import annotations

from ..domain.models import ProfileVersion
from .models import (
    ProfileDefinition,
    ProfileLifecycleState,
    ProfileRegistry,
    ProfileRule,
    RuleEffect,
    RuleMatchMode,
)

_LEGACY_REPOSITORY = "lutzkind/osm-country-scraper"
_LEGACY_COMMIT = "43b3d6fb699276ede19fb633f75f1d31f5ff32d1"
_LEGACY_SELECTOR_BLOB = "7942e2c962485671b7eefa71eb9665e048ad6697"


def _include(
    rule_id: str,
    key: str,
    pattern: str,
    category: str,
    subcategory: str,
    *,
    evidence: tuple[str, ...] = (),
    priority: int = 0,
) -> ProfileRule:
    return ProfileRule(
        rule_id=rule_id,
        key=key,
        effect=RuleEffect.INCLUDE,
        match_mode=RuleMatchMode.REGEX,
        pattern=pattern,
        category=category,
        subcategory=subcategory,
        evidence=evidence,
        priority=priority,
    )


def _exclude(rule_id: str, key: str, pattern: str | None = None) -> ProfileRule:
    return ProfileRule(
        rule_id=rule_id,
        key=key,
        effect=RuleEffect.EXCLUDE,
        match_mode=RuleMatchMode.PRESENT if pattern is None else RuleMatchMode.REGEX,
        pattern=pattern,
        evidence=("lifecycle_or_scope_exclusion",),
    )


def _lifecycle_exclusions(prefix: str) -> tuple[ProfileRule, ...]:
    return tuple(
        _exclude(f"{prefix}.exclude.{key}", key)
        for key in (
            "abandoned",
            "construction",
            "demolished",
            "destroyed",
            "disused",
            "proposed",
            "removed",
        )
    )


def _luxeillum_draft() -> ProfileDefinition:
    rules = (
        _include(
            "luxeillum.hospitality.restaurant",
            "amenity",
            "^(restaurant|cafe|biergarten)$",
            "Hospitality",
            "Restaurant or cafe",
            evidence=("unapproved_draft_rule",),
            priority=10,
        ),
        _include(
            "luxeillum.hospitality.bar",
            "amenity",
            "^(bar|pub|nightclub)$",
            "Hospitality",
            "Bar or nightlife",
            evidence=("unapproved_draft_rule",),
            priority=20,
        ),
        _include(
            "luxeillum.hospitality.hotel",
            "tourism",
            "^(hotel|resort|guest_house|motel|hostel|apartment)$",
            "Hospitality",
            "Accommodation",
            evidence=("unapproved_draft_rule",),
            priority=30,
        ),
        _exclude(
            "luxeillum.exclude.fast_food",
            "amenity",
            "^(fast_food|food_court)$",
        ),
        *_lifecycle_exclusions("luxeillum"),
    )
    return ProfileDefinition(
        profile=ProfileVersion("luxeillum", "0.1.0-draft"),
        lifecycle_state=ProfileLifecycleState.DRAFT,
        rules=rules,
        provenance=(
            "draft_fixture:not_approved_for_targeting",
            "phase:2A.4",
        ),
    )


def _saas_redesign_draft() -> ProfileDefinition:
    common_evidence = ("unapproved_draft_rule",)
    rules = (
        _include(
            "saas.local.amenity",
            "amenity",
            "^(restaurant|cafe|bar|pub|dentist|gym|lawyer|pest_control)$",
            "Local business",
            "Website redesign candidate",
            evidence=common_evidence,
        ),
        _include(
            "saas.local.tourism",
            "tourism",
            "^(hotel|guest_house|hostel|motel|resort|apartment)$",
            "Local business",
            "Website redesign candidate",
            evidence=common_evidence,
        ),
        _include(
            "saas.local.craft",
            "craft",
            "^(electrician|plumber|hvac|roofer|painter|landscaper|arborist|floorer|tiler|carpet_layer|fence_maker|paver|bricklayer|concrete|glazier)$",
            "Local business",
            "Website redesign candidate",
            evidence=common_evidence,
        ),
        _include(
            "saas.local.office",
            "office",
            "^(lawyer|notary|cleaning|dentist|orthodontist|solar|pest_control|roofing_contractor)$",
            "Local business",
            "Website redesign candidate",
            evidence=common_evidence,
        ),
        _include(
            "saas.local.shop",
            "shop",
            "^(flooring|windows|solar|pest_control|garage_door|roofing|swimming_pool)$",
            "Local business",
            "Website redesign candidate",
            evidence=common_evidence,
        ),
        _include(
            "saas.local.leisure",
            "leisure",
            "^(fitness_centre|sports_centre|gym)$",
            "Local business",
            "Website redesign candidate",
            evidence=common_evidence,
        ),
        *_lifecycle_exclusions("saas"),
    )
    return ProfileDefinition(
        profile=ProfileVersion("saas_redesign", "0.1.0-draft"),
        lifecycle_state=ProfileLifecycleState.DRAFT,
        rules=rules,
        provenance=(
            "draft_fixture:not_approved_for_targeting",
            "phase:2A.4",
        ),
    )


def _legacy_parity_rules() -> tuple[ProfileRule, ...]:
    source = (f"source:{_LEGACY_REPOSITORY}@{_LEGACY_COMMIT}:src/concept-selectors.js",)
    return (
        _include(
            "legacy.restaurant.amenity",
            "amenity",
            "restaurant|fast[_ -]*food|cafe|food[_ -]*court|ice[_ -]*cream|biergarten",
            "Legacy parity",
            "Restaurants",
            evidence=source,
        ),
        _include(
            "legacy.restaurant.shop",
            "shop",
            "^(bakery|coffee|tea)$",
            "Legacy parity",
            "Restaurants",
            evidence=source,
        ),
        _include(
            "legacy.hotel.tourism",
            "tourism",
            "hotel|guest[_ -]*house|hostel|motel|apartment|resort|chalet|lodg(e|ing)",
            "Legacy parity",
            "Hotels",
            evidence=source,
        ),
        _include(
            "legacy.hotel.office",
            "office",
            "hotel|hospitality|accommodation",
            "Legacy parity",
            "Hotels",
            evidence=source,
        ),
        _include(
            "legacy.bar.amenity",
            "amenity",
            "bar|pub|biergarten|nightclub|taproom",
            "Legacy parity",
            "Bars",
            evidence=source,
        ),
        _include(
            "legacy.bar.club",
            "club",
            "nightclub|social_club",
            "Legacy parity",
            "Bars",
            evidence=source,
        ),
        _include(
            "legacy.dentist.amenity",
            "amenity",
            "dentist|dental[_ -]*clinic|orthodontist",
            "Legacy parity",
            "Dentists",
            evidence=source,
        ),
        _include(
            "legacy.dentist.healthcare",
            "healthcare",
            "dentist|dental[_ -]*clinic|orthodontist|oral[_ -]*surgery",
            "Legacy parity",
            "Dentists",
            evidence=source,
        ),
        _include(
            "legacy.dentist.office",
            "office",
            "dentist|dental[_ -]*clinic|orthodontist|oral[_ -]*surgery",
            "Legacy parity",
            "Dentists",
            evidence=source,
        ),
        _include(
            "legacy.legal.office",
            "office",
            "lawyer|attorney|law[_ -]*office|legal[_ -]*service|notary",
            "Legacy parity",
            "Legal services",
            evidence=source,
        ),
        _include(
            "legacy.legal.amenity",
            "amenity",
            "lawyer|attorney|legal[_ -]*service",
            "Legacy parity",
            "Legal services",
            evidence=source,
        ),
        _include(
            "legacy.cleaning.office",
            "office",
            "cleaning|janitorial|maid[_ -]*service|house[_ -]*cleaning",
            "Legacy parity",
            "Cleaning services",
            evidence=source,
        ),
        _include(
            "legacy.cleaning.craft",
            "craft",
            "cleaning|janitorial|maid[_ -]*service|house[_ -]*cleaning",
            "Legacy parity",
            "Cleaning services",
            evidence=source,
        ),
        _include(
            "legacy.gym.leisure",
            "leisure",
            "fitness[_ -]*centre|fitness[_ -]*center|sports[_ -]*centre|gym|health[_ -]*club",
            "Legacy parity",
            "Gyms",
            evidence=source,
        ),
        _include(
            "legacy.gym.sport", "sport", "fitness|gym", "Legacy parity", "Gyms", evidence=source
        ),
        _include(
            "legacy.painting.craft",
            "craft",
            "painter|painting",
            "Legacy parity",
            "Painting",
            evidence=source,
        ),
        _include(
            "legacy.painting.office",
            "office",
            "painter|painting",
            "Legacy parity",
            "Painting",
            evidence=source,
        ),
        _include(
            "legacy.landscaping.craft",
            "craft",
            "landscap(er|ing)|gardener|lawn[_ -]*care|garden[_ -]*maintenance",
            "Legacy parity",
            "Landscaping",
            evidence=source,
        ),
        _include(
            "legacy.landscaping.office",
            "office",
            "landscap(er|ing)|gardener|lawn[_ -]*care|garden[_ -]*maintenance",
            "Legacy parity",
            "Landscaping",
            evidence=source,
        ),
        _include(
            "legacy.tree.craft",
            "craft",
            "arborist|tree[_ -]*surgeon|tree[_ -]*service|tree[_ -]*removal|tree[_ -]*trimming",
            "Legacy parity",
            "Tree service",
            evidence=source,
        ),
        _include(
            "legacy.pressure_washing",
            "office",
            "pressure[_ -]*wash(ing)?|power[_ -]*washing|house[_ -]*washing",
            "Legacy parity",
            "Pressure washing",
            evidence=source,
        ),
        _include(
            "legacy.junk_removal",
            "office",
            "junk[_ -]*removal|rubbish[_ -]*removal|waste[_ -]*removal|waste[_ -]*management",
            "Legacy parity",
            "Junk removal",
            evidence=source,
        ),
        _include(
            "legacy.fencing",
            "craft",
            "fence[_ -]*maker|fencing[_ -]*contractor|fence[_ -]*contractor|fence[_ -]*builder",
            "Legacy parity",
            "Fencing",
            evidence=source,
        ),
        _include(
            "legacy.flooring",
            "craft",
            "floorer|tiler|carpet[_ -]*layer|flooring[_ -]*contractor|epoxy[_ -]*flooring",
            "Legacy parity",
            "Flooring",
            evidence=source,
        ),
        _include(
            "legacy.flooring.shop",
            "shop",
            "flooring|flooring[_ -]*contractor|epoxy[_ -]*flooring",
            "Legacy parity",
            "Flooring",
            evidence=source,
        ),
        _include(
            "legacy.solar.craft",
            "craft",
            "solar|photovoltaic",
            "Legacy parity",
            "Solar installation",
            evidence=source,
        ),
        _include(
            "legacy.solar.office",
            "office",
            "solar|photovoltaic",
            "Legacy parity",
            "Solar installation",
            evidence=source,
        ),
        _include(
            "legacy.solar.shop",
            "shop",
            "solar|photovoltaic|energy",
            "Legacy parity",
            "Solar installation",
            evidence=source,
        ),
        _include(
            "legacy.gutter.craft",
            "craft",
            "gutter|gutters|guttering|gutter[_ -]*cleaner|gutter[_ -]*repair|roofer",
            "Legacy parity",
            "Gutter services",
            evidence=source,
        ),
        _include(
            "legacy.paving.craft",
            "craft",
            "paver|paving[_ -]*contractor|driveway[_ -]*paving",
            "Legacy parity",
            "Paving",
            evidence=source,
        ),
        _include(
            "legacy.bathroom",
            "craft",
            "bathroom[_ -]*renovat(or|ion)|bathroom[_ -]*remodel(ling|ing)|plumber|tiler",
            "Legacy parity",
            "Bathroom renovation",
            evidence=source,
        ),
        _include(
            "legacy.kitchen",
            "craft",
            "kitchen[_ -]*renovat(or|ion)|kitchen[_ -]*fitter|kitchen|carpenter",
            "Legacy parity",
            "Kitchen renovation",
            evidence=source,
        ),
        _include(
            "legacy.window",
            "craft",
            "window[_ -]*construction|window[_ -]*installer|window[_ -]*installation|glazier",
            "Legacy parity",
            "Window installation",
            evidence=source,
        ),
        _include(
            "legacy.pool_building",
            "shop",
            "swimming[_ -]*pool[_ -]*construction|swimming[_ -]*pool|pool[_ -]*builder|pool[_ -]*installer",
            "Legacy parity",
            "Pool building",
            evidence=source,
        ),
        _include(
            "legacy.pool_cleaning",
            "craft",
            "pool[_ -]*clean(er|ing)|pool[_ -]*maintenance|cleaning",
            "Legacy parity",
            "Pool cleaning",
            evidence=source,
        ),
        _include(
            "legacy.pest",
            "office",
            "pest[_ -]*control|exterminator|termite[_ -]*treatment",
            "Legacy parity",
            "Pest control",
            evidence=source,
        ),
        _include(
            "legacy.deck",
            "craft",
            "deck[_ -]*builder|deck[_ -]*building|deck|pergola[_ -]*builder|carpenter",
            "Legacy parity",
            "Deck building",
            evidence=source,
        ),
        _include(
            "legacy.brick",
            "craft",
            "bricklayer|brick[_ -]*mason|brickwork|stonemason|masonry[_ -]*contractor",
            "Legacy parity",
            "Bricklaying",
            evidence=source,
        ),
        _include(
            "legacy.concrete",
            "craft",
            "concrete|concreter|concreting|concrete[_ -]*contractor",
            "Legacy parity",
            "Concreting",
            evidence=source,
        ),
        _include(
            "legacy.electrical",
            "craft",
            "^electrician$",
            "Legacy parity",
            "Electrical",
            evidence=source,
        ),
        _include(
            "legacy.plumbing", "craft", "^plumber$", "Legacy parity", "Plumbing", evidence=source
        ),
        _include("legacy.hvac", "craft", "^hvac$", "Legacy parity", "HVAC", evidence=source),
        _include(
            "legacy.garage",
            "shop",
            "garage[_ -]*door|garage[_ -]*doors|electric[_ -]*garage[_ -]*doors",
            "Legacy parity",
            "Garage door services",
            evidence=source,
        ),
        _include(
            "legacy.roofing",
            "craft",
            "roofer|roofing|roofing[_ -]*contractor|roof[_ -]*repair",
            "Legacy parity",
            "Roofing",
            evidence=source,
        ),
        *_lifecycle_exclusions("legacy"),
    )


def _legacy_parity() -> ProfileDefinition:
    return ProfileDefinition(
        profile=ProfileVersion("legacy_parity", "2026-06-19-curated"),
        lifecycle_state=ProfileLifecycleState.DRAFT,
        rules=_legacy_parity_rules(),
        provenance=(
            f"repository:{_LEGACY_REPOSITORY}",
            f"commit:{_LEGACY_COMMIT}",
            f"selector_blob:{_LEGACY_SELECTOR_BLOB}",
            "coverage:curated_manual_selectors_and_custom_regex",
            "dynamic_ontology_alias_expansion:not_snapshotted",
            "activation_blocked:complete_compiled_selector_snapshot_required",
        ),
        shadow_only=True,
    )


def builtin_profile_registry() -> ProfileRegistry:
    """Return the immutable built-in profile registry."""

    return ProfileRegistry(
        (
            _legacy_parity(),
            _luxeillum_draft(),
            _saas_redesign_draft(),
        )
    )
