# manual_agregator/parser/handlers/label_pair.py
from .base import FieldHandler
from ..utils import extract_value_by_label, resolve_missing_bool, resolve_missing_text
from .number import parse_number_from_text
from .bool import BoolHandler
from .bool_key import BoolKeyHandler
from .text import TextHandler
from .key import KeyHandler

class LabelPairHandler(FieldHandler):
    def parse(self, field_name, config, soup, main_values, selectors, extracted):
        # 1) Wyciągnij raw wg labela (zawsze przekaż selector, jeśli jest)
        value_extractor = config.get("valueExtractor")
        if not value_extractor:
            value_extractor = {
                "label": config.get("label"),
                "selector": config.get("selector"),
            }
            if "altLabels" in config:
                value_extractor["altLabels"] = config.get("altLabels", [])
            for opt_key in (
                "match",
                "labelPosition",
                "valueTags",
                "parentFallback",
                "valueClasses",
                "caseInsensitive",
            ):
                opt_val = config.get(opt_key)
                if opt_val is not None:
                    value_extractor[opt_key] = opt_val
        raw = extract_value_by_label(soup, value_extractor) if value_extractor.get("label") else None

        vtype = (config.get("valueType") or "text").lower()

        # 2) Delegacja do odpowiednich handlerów z rawOverride, aby NIE grzebały już w DOM
        if vtype == "number":
            return parse_number_from_text(field_name, raw, config, extracted)

        if vtype == "bool":
            return BoolHandler().parse(field_name, {**config, "rawOverride": raw}, soup, main_values, selectors, extracted)

        if vtype == "bool_key":
            return BoolKeyHandler().parse(field_name, {**config, "rawOverride": raw}, soup, main_values, selectors, extracted)

        if vtype == "key":
            return KeyHandler().parse(field_name, {**config, "rawOverride": raw}, soup, main_values, selectors, extracted)

        # default: text
        return TextHandler().parse(field_name, {**config, "rawOverride": raw}, soup, main_values, selectors, extracted)
