# manual_agregator/parser/handlers/key.py
from .base import FieldHandler
from ..utils import resolve_missing_text

class KeyHandler(FieldHandler):
    """
    Map free-form text to a canonical key using keyMap:
      keyMap: {
        "miejskie": ["miejskie", "cieplik miejski", "z sieci"],
        "gazowe": ["gazowe", "piec gazowy"],
        ...
      }
    First matching variant wins. If no match, returns ifMissing/default.
    """
    def parse(self, field_name, config, soup, main_values, selectors, extracted):
        # Prefer raw from labelPair
        if "rawOverride" in config:
            txt = (config["rawOverride"] or "").strip()
            return self._map_value(txt, config)

        # Fallback: query DOM
        sel = config.get("selector")
        el = soup.select_one(sel) if sel else None
        if not el:
            return resolve_missing_text(config)
        content = el.get_text(" ", strip=True)
        return self._map_value(content, config)

    def _map_value(self, content: str, config: dict):
        content_low = content.lower()
        key_map = config.get("keyMap", {}) or {}
        for final_value, variants in key_map.items():
            for v in (variants or []):
                if str(v).lower() in content_low:
                    return final_value
        # if no match, use missing strategy
        return resolve_missing_text(config)
