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

from typing import Any, Dict, List, Optional

from ..base import Zone, ZoneOperation
from . import base as base_section
from . import join_lineitems as join_lineitems_section
from . import join_project as join_project_section
from . import join_task as join_task_section
from . import join_trackingcentres as join_trackingcentres_section
from . import mutations as mutations_section
from . import post_processed as post_processed_section
from . import queries as queries_section

SECTIONS = [
    base_section,

    join_lineitems_section,
    join_project_section,
    join_task_section,
    join_trackingcentres_section,

    queries_section,

    mutations_section,
    post_processed_section,
]


class InvoicesZone(Zone):
    code = "invoices"
    label = "Invoices"
    description = "Operaciones relacionadas con invoices (facturación) en AroFlo."

    @property
    def operations(self) -> List[ZoneOperation]:
        ops: List[ZoneOperation] = []
        for section in SECTIONS:
            ops.extend(section.get_operations())
        return ops

    def execute(self, operation_code: str, params: Optional[Dict[str, Any]] = None) -> Any:
        params = params or {}
        for section in SECTIONS:
            if section.supports(operation_code):
                return section.execute(operation_code, self.client, params)
        raise ValueError(f"Operación '{operation_code}' no soportada en InvoicesZone")
