"""Polish car-part keyword lists and regex patterns for extraction."""

from __future__ import annotations

import re

# ---------------------------------------------------------------------------
# Intent signals
# ---------------------------------------------------------------------------

# Buying intent — post is a request for a part
BUY_KEYWORDS = [
    "szukam", "poszukuję", "poszukuje", "kupię", "kupie",
    "potrzebuję", "potrzebuje", "potrzebna", "potrzebny", "potrzebne",
    "ktoś ma", "ktos ma", "kto ma", "ma ktoś", "ma ktos",
    "namiary", "namiar", "poleci ktoś", "poleci ktos",
    "pilne", "pilnie", "na już", "na juz", "na wczoraj",
    "gdzie kupić", "gdzie kupic", "gdzie dostanę", "gdzie dostane",
    "jest gdzieś", "jest gdzies", "do kupienia",
    "looking for", "need", "wtb", "want to buy",
]

# Selling intent — post is selling, not buying → skip
SELL_KEYWORDS = [
    "sprzedam", "sprzedaż", "sprzedaz", "na sprzedaż", "na sprzedaz",
    "oddam", "oddaję", "oddaje", "do sprzedania",
    "oferuję", "oferuje", "cena", "do negocjacji",
    "nowa w opakowaniu", "nowe w opakowaniu",
    "for sale", "wts", "want to sell", "fs",
]

# Vehicle buyout / scrap — NOT part requests, should be rejected
SKUP_KEYWORDS = [
    "skup", "skupujemy", "skupuję", "skupuje",
    "skup aut", "skup samochodów", "skup pojazdów", "skup ciężarówek",
    "skup tirów", "skup naczep", "skup busów",
    "złomowanie", "kasacja", "auto złom", "autozłom",
]

_SKUP_RE = re.compile(
    r"\b(" + "|".join(re.escape(k) for k in sorted(SKUP_KEYWORDS, key=len, reverse=True)) + r")\b",
    re.IGNORECASE,
)

# Compile patterns for fast matching
_BUY_RE = re.compile(
    r"\b(" + "|".join(re.escape(k) for k in BUY_KEYWORDS) + r")\b",
    re.IGNORECASE,
)
_SELL_RE = re.compile(
    r"\b(" + "|".join(re.escape(k) for k in SELL_KEYWORDS) + r")\b",
    re.IGNORECASE,
)

# ---------------------------------------------------------------------------
# Car brands (with Polish colloquial forms)
# ---------------------------------------------------------------------------

BRAND_MAP: dict[str, str] = {
    # Standard
    "volvo": "VOLVO", "scania": "SCANIA", "man": "MAN", "daf": "DAF",
    "mercedes": "MERCEDES", "iveco": "IVECO", "renault": "RENAULT",
    "opel": "OPEL", "bmw": "BMW", "audi": "AUDI",
    "volkswagen": "VOLKSWAGEN", "vw": "VOLKSWAGEN",
    "fiat": "FIAT", "ford": "FORD", "peugeot": "PEUGEOT",
    "citroen": "CITROEN", "toyota": "TOYOTA", "skoda": "SKODA",
    "seat": "SEAT", "hyundai": "HYUNDAI", "kia": "KIA",
    "nissan": "NISSAN", "honda": "HONDA", "mazda": "MAZDA",
    "mitsubishi": "MITSUBISHI", "subaru": "SUBARU",
    # Colloquial PL
    "bumer": "BMW", "bimer": "BMW", "bemka": "BMW",
    "ople": "OPEL", "opelek": "OPEL",
    "merc": "MERCEDES", "mercedesek": "MERCEDES", "benz": "MERCEDES",
    "strucla": "OPEL", "strucli": "OPEL", "struclę": "OPEL",  # Astra nickname
    "passat": "VOLKSWAGEN", "passata": "VOLKSWAGEN",
    "ducato": "FIAT",
}

_BRAND_RE = re.compile(
    r"\b(" + "|".join(re.escape(k) for k in sorted(BRAND_MAP, key=len, reverse=True)) + r")\b",
    re.IGNORECASE,
)

# ---------------------------------------------------------------------------
# Part categories
# ---------------------------------------------------------------------------

CATEGORY_MAP: dict[str, str] = {
    # PL
    "pompa": "pompa", "pompę": "pompa", "pompy": "pompa",
    "pompa wody": "pompa wody", "pompę wody": "pompa wody", "pompy wody": "pompa wody",
    "pompa paliwa": "pompa paliwa", "pompę paliwa": "pompa paliwa",
    "filtr": "filtr", "filtra": "filtr", "filtry": "filtr",
    "filtr oleju": "filtr oleju", "filtr powietrza": "filtr powietrza",
    "alternator": "alternator", "alternatora": "alternator", "alternatory": "alternator",
    "rozrusznik": "rozrusznik", "rozrusznika": "rozrusznik",
    "turbo": "turbo", "turbina": "turbo", "turbiny": "turbo", "turbosprężarka": "turbo", "turbinę": "turbo",
    "klocki": "klocki hamulcowe", "klocki hamulcowe": "klocki hamulcowe",
    "tarcze": "tarcze hamulcowe", "tarcze hamulcowe": "tarcze hamulcowe",
    "amortyzator": "amortyzator", "amortyzatory": "amortyzator",
    "sprzęgło": "sprzęgło", "sprzeglo": "sprzęgło",
    "chłodnica": "chłodnica", "chlodnica": "chłodnica",
    "głowica": "głowica", "glowica": "głowica",
    "wał": "wał", "wał korbowy": "wał korbowy",
    "tłok": "tłok", "tlok": "tłok",
    "uszczelka": "uszczelka", "uszczelki": "uszczelka",
    "pasek": "pasek", "pasek rozrządu": "pasek rozrządu",
    "łożysko": "łożysko", "lożysko": "łożysko", "lozysko": "łożysko",
    "wahacz": "wahacz", "zwrotnica": "zwrotnica",
    "siłownik": "siłownik", "silownik": "siłownik",
    "sprężarka": "sprężarka", "sprezarka": "sprężarka", "kompresor": "kompresor",
    "licznik": "licznik", "prędkościomierz": "licznik",
    "predkosciomierz": "licznik",
    "zderzak": "zderzak", "lampa": "lampa", "reflektor": "reflektor",
    "lusterko": "lusterko", "drzwi": "drzwi",
    "skrzynia": "skrzynia biegów", "skrzynia biegów": "skrzynia biegów",
    "skrzynia biegow": "skrzynia biegów",
    "most": "most napędowy", "dyferencjał": "dyferencjał",
    # Additional PL
    "osuszacz": "osuszacz", "osuszacza": "osuszacz",
    "katalizator": "katalizator", "katalizatora": "katalizator",
    "szyba": "szyba", "szybę": "szyba", "szyby": "szyba",
    "szyba przednia": "szyba", "szybę przednią": "szyba",
    "przewód": "przewód", "przewodu": "przewód", "wąż": "przewód",
    "wtryskiwacz": "wtryskiwacz", "wtryskiwacza": "wtryskiwacz",
    "tłumik": "tłumik", "tłumika": "tłumik",
    "separator": "separator", "separatora": "separator",
    "koło pasowe": "koło pasowe",
    # EN (for eBay titles)
    "pump": "pompa", "filter": "filtr", "alternator": "alternator",
    "starter": "rozrusznik", "turbo": "turbo", "brake": "klocki hamulcowe",
    "clutch": "sprzęgło", "radiator": "chłodnica",
    "air dryer": "osuszacz",
    "catalytic converter": "katalizator",
    "windscreen": "szyba", "windshield": "szyba",
    "hose": "przewód", "pipe": "przewód",
    "injector": "wtryskiwacz", "nozzle": "wtryskiwacz",
    "silencer": "tłumik", "exhaust": "tłumik",
    "pulley": "koło pasowe",
    "separator": "separator",
}

_CATEGORY_RE = re.compile(
    r"\b(" + "|".join(re.escape(k) for k in sorted(CATEGORY_MAP, key=len, reverse=True)) + r")\b",
    re.IGNORECASE,
)

# ---------------------------------------------------------------------------
# Engine code patterns
# ---------------------------------------------------------------------------

# Matches codes like: C18NZ, D13A, N47D20, 1.9TDI, BKC, AVF, OM471
ENGINE_CODE_RE = re.compile(
    r"\b([A-Z]{1,3}\d{1,3}[A-Z]{0,3}\d{0,2})\b"
    r"|\b(\d\.\d\s?[A-Z]{2,4})\b",
    re.IGNORECASE,
)

# Minimum length to avoid false positives
ENGINE_CODE_MIN_LEN = 3

# ---------------------------------------------------------------------------
# OE/catalog number pattern
# ---------------------------------------------------------------------------

# OE numbers are typically 6-15 chars, alphanumeric with optional separators
OE_NUMBER_RE = re.compile(
    r"\b(\d{2,3}[\s.\-]?\d{4,6}[\s.\-]?\d{0,6})\b"  # numeric: 51.06500-6408
    r"|\b([A-Z]{1,3}\d{5,12})\b"                       # alpha-prefix: A0001802701
    r"|\b(\d{6,15})\b",                                 # pure numeric: 20744939
)


def has_buy_intent(text: str) -> bool:
    """Check if text contains buying intent keywords."""
    return bool(_BUY_RE.search(text))


def has_sell_intent(text: str) -> bool:
    """Check if text contains selling intent keywords."""
    return bool(_SELL_RE.search(text))


def has_skup_intent(text: str) -> bool:
    """Check if text is a vehicle buyout/scrap ad (not a part request)."""
    return bool(_SKUP_RE.search(text))


def extract_brand(text: str) -> str | None:
    """Extract first recognized car brand from text."""
    m = _BRAND_RE.search(text)
    if m:
        return BRAND_MAP.get(m.group(1).lower())
    return None


def extract_category(text: str) -> str | None:
    """Extract first recognized part category from text."""
    m = _CATEGORY_RE.search(text)
    if m:
        return CATEGORY_MAP.get(m.group(1).lower())
    return None


def extract_engine_codes(text: str) -> list[str]:
    """Extract engine codes from text."""
    results = []
    for m in ENGINE_CODE_RE.finditer(text):
        code = (m.group(1) or m.group(2) or "").strip()
        if code and len(code) >= ENGINE_CODE_MIN_LEN:
            results.append(code.upper().replace(" ", ""))
    return results


def extract_oe_numbers(text: str) -> list[str]:
    """Extract OE/catalog numbers from text."""
    results = []
    for m in OE_NUMBER_RE.finditer(text):
        num = (m.group(1) or m.group(2) or m.group(3) or "").strip()
        cleaned = re.sub(r"[\s.\-/]", "", num)
        if cleaned and len(cleaned) >= 6:
            results.append(cleaned.upper())
    return results
