# /apps/aroflo_connector_app/zones/tasks/__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_assets as join_assets_section
from . import join_assignedhistory as join_assignedhistory_section
from . import join_customfields as join_customfields_section
from . import join_documentsandphotos as join_documentsandphotos_section
from . import join_expense as join_expense_section
from . import join_labour as join_labour_section
from . import join_location as join_location_section
from . import join_locationcustomfields as join_locationcustomfields_section
from . import join_material as join_material_section
from . import join_notes as join_notes_section
from . import join_project as join_project_section
from . import join_purchaseorders as join_purchaseorders_section
from . import join_quote as join_quote_section
from . import join_salesperson as join_salesperson_section
from . import join_substatus as join_substatus_section
from . import join_tasktotals as join_tasktotals_section
from . import mutations as mutations_section

SECTIONS = [
    base_section,
    join_assets_section,
    join_assignedhistory_section,
    join_customfields_section,
    join_documentsandphotos_section,
    join_expense_section,
    join_labour_section,
    join_location_section,
    join_locationcustomfields_section,
    join_material_section,
    join_notes_section,
    join_project_section,
    join_purchaseorders_section,
    join_quote_section,
    join_salesperson_section,
    join_substatus_section,
    join_tasktotals_section,
    mutations_section,
]


class TasksZone(Zone):
    code = "tasks"
    label = "Tasks"
    description = "Operaciones relacionadas con tasks en AroFlo (incluye joins y mutations)."

    @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 TasksZone")
