# apps/aroflo_connector_app/zones/invoices/mutations.py
from __future__ import annotations

from typing import Any, Dict, List

from ..base import ZoneOperation, ParamSpec


def get_operations() -> List[ZoneOperation]:
    return [
        ZoneOperation(
            code="process_invoice",
            label="Process Invoice",
            description=(
                "Marca una invoice como processed vía POSTXML. "
                "Según AroFlo, esto también marca linkprocessed y puede archivar el task asociado."
            ),
            http_method="POST",
            side_effect="write",
            idempotent=False,
            params=[
                ParamSpec("invoiceid", "string", True, "InvoiceID codificado."),
                ParamSpec("status", "string", False, "Estado a setear (default: processed)."),
                ParamSpec("raw", "boolean", False, "Devuelve data + meta debug si true."),
            ],
            category="invoices",
            use_cases=["Enviar invoice a processed tras integración/contabilización"],
            risk_level="medium",
            requires_confirmation=True,
        ),
    ]


def supports(operation_code: str) -> bool:
    return any(op.code == operation_code for op in get_operations())


def execute(operation_code: str, client: Any, params: Dict[str, Any]) -> Any:
    if operation_code != "process_invoice":
        raise ValueError(f"[Invoices.mutations] Operación no soportada: {operation_code}")

    invoiceid = params["invoiceid"]
    status = params.get("status", "processed")
    raw = bool(params.get("raw", False))

    # POSTXML según doc
    postxml = (
        "<invoices>"
        "<invoice>"
        f"<invoiceid>{invoiceid}</invoiceid>"
        f"<status><![CDATA[ {status} ]]></status>"
        "</invoice>"
        "</invoices>"
    )

    form_params = {
        "zone": "invoices",
        "postxml": postxml,
    }

    resp = client.request(
        "",
        method="POST",
        params=form_params,       # tu client.request ya está armado para form-url-encoded
        var_string=None,
    )

    return {"data": resp, "meta": {"zone": "invoices", "postxml": postxml}} if raw else resp
