# utilities/provider_fields.py
from typing import List, Dict, Optional

def _label(or_label: Optional[str], default: str) -> str:
    s = (or_label or "").strip()
    return s if s else default

def build_fields_for_operator(service: str, operator) -> List[Dict]:
    """
    Builds the app's dynamic 'fields' array for a given Operator row.
    Uses Operator.number_label / optional1_label when appropriate.
    """
    svc = (service or "").lower()

    # MOBILE POSTPAID
    if svc == "postpaid":
        return [{
            "key": "mobile",
            "label": _label(operator.number_label, "Mobile Number"),
            "type": "number",
            "required": True,
            "options": []
        }]

    # FASTAG
    if svc == "fastag":
        return [{
            "key": "vehicle_number",
            "label": _label(operator.number_label, "Vehicle Registration Number"),
            "type": "text",
            "required": True,
            "options": []
        }]

    # ELECTRICITY (typical USN/Account No/CA No)
    if svc == "electricity":
        return [{
            "key": "account_id",
            "label": _label(operator.number_label, "Unique Service Number"),
            "type": "text",
            "required": True,
            "options": []
        }]

    # LANDLINE (STD + Number)
    if svc == "landline":
        return [
            {
                "key": "std_code",
                "label": "STD Code",
                "type": "number",
                "required": True,
                "options": []
            },
            {
                "key": "phone_no",
                "label": _label(operator.number_label, "Landline Number"),
                "type": "number",
                "required": True,
                "options": []
            },
        ]

    # BROADBAND
    if svc == "broadband":
        return [{
            "key": "account_no",
            "label": _label(operator.number_label, "Account Number"),
            "type": "text",
            "required": True,
            "options": []
        }]

    # GAS (special: select + conditional fields)
    if svc == "gas":
        return [
            {
                "key": "book_using",
                "label": "Book Using",
                "type": "select",
                "required": True,
                "options": ["Mobile Number", "Consumer ID"]
            },
            {
                "key": "mobile",
                "label": _label(operator.number_label, "Mobile Number"),
                "type": "number",
                "required": False,
                "options": []
            },
            {
                "key": "consumer_id",
                "label": _label(operator.optional1_label, "Consumer ID"),
                "type": "text",
                "required": False,
                "options": []
            },
        ]

    # INSURANCE
    if svc == "insurance":
        return [{
            "key": "policy_no",
            "label": _label(operator.number_label, "Policy Number"),
            "type": "text",
            "required": True,
            "options": []
        }]

    # LOAN
    if svc == "loan":
        return [{
            "key": "loan_account_no",
            "label": _label(operator.number_label, "Loan Account Number"),
            "type": "text",
            "required": True,
            "options": []
        }]

    # WATER
    if svc == "water":
        return [{
            "key": "consumer_no",
            "label": _label(operator.number_label, "Consumer Number"),
            "type": "text",
            "required": True,
            "options": []
        }]

    # DTH (if you choose to run DTH via bills; else ignore)
    if svc == "dth":
        return [{
            "key": "subscriber_id",
            "label": _label(operator.number_label, "Subscriber ID"),
            "type": "text",
            "required": True,
            "options": []
        }]
    if svc == "lpg":
        return [
            {
                "key": "book_using",
                "label": "Book Using",
                "type": "select",
                "required": True,
                "options": ["Mobile Number", "Consumer ID"]
            },
            {
                "key": "mobile",
                "label": _label(operator.number_label, "Mobile Number"),
                "type": "number",
                "required": False,
                "options": []
            },
            {
                "key": "consumer_id",
                "label": _label(operator.optional1_label, "Consumer ID"),
                "type": "text",
                "required": False,
                "options": []
            },
        ]

    # PLAYCODE (simple “code” entry)
    if svc == "playcode":
        return [{
            "key": "play_code",
            "label": _label(operator.number_label, "Play Code"),
            "type": "text",
            "required": True,
            "options": []
        }]

    # fallback
    return [{
        "key": "identifier",
        "label": _label(operator.number_label, "Identifier"),
        "type": "text",
        "required": True,
        "options": []
    }]
