# apps/aroflo_connector_app/agent/cheap/router.py
from __future__ import annotations

from typing import Any, Dict, Optional, Tuple, List

from ..det_runner import list_operations
from .plan import Plan
from .extractors import detect_intent
from .zone_resolvers import tasks as tasks_resolver
from .zone_resolvers import users as users_resolver   # ✅ ADD
from .zone_resolvers import permissiongroups as permissiongroups_resolver
from .zone_resolvers import userpositions as userpositions_resolver
from .zone_resolvers import businessunits as businessunits_resolver
from .zone_resolvers import timesheets as timesheets_resolver



class RouterError(RuntimeError):
    pass


def _guess_zone(text: str) -> Tuple[str, bool]:
    t = (text or "").strip().lower()

    # -----------------------
    # Prefix explícito (hard)
    # -----------------------
    if ":" in t:
        prefix = t.split(":", 1)[0].strip()

        if prefix == "tasks":
            return "tasks", True

        if prefix in ("users", "user", "usuarios", "usuario"):
            return "users", True

        if prefix in ("permissiongroups", "permissiongroup", "permission-groups", "permission-group"):
            return "permissiongroups", True
        
        if prefix in ("userpositions", "userposition", "positions", "position", "posiciones", "posicion"):
            return "userpositions", True

        if prefix in ("businessunits", "businessunit", "business-units", "business-unit", "bu", "unidadnegocio", "unidadesnegocio"):
            return "businessunits", True
        
        if prefix in ("timesheets", "timesheet", "hojasdetiempo", "timesheet"):
            return "timesheets", True


        # prefijo explícito pero desconocido => no fallback
        return prefix, True

    # -----------------------
    # Keyword-based (soft)
    # -----------------------
    if "task" in t or "tasks" in t or "tarea" in t or "tareas" in t:
        return "tasks", False

    if "user" in t or "users" in t or "usuario" in t or "usuarios" in t:
        return "users", False

    if t.startswith("permissiongroups:") or t.startswith("permissiongroup:"):
        return "permissiongroups", True


    if "permissiongroup" in t or "permissiongroups" in t or "group" in t:
        return "permissiongroups"

    if (
        "permissiongroup" in t
        or "permission group" in t
        or "permissiongroups" in t
        or "permission groups" in t
        or "grupo de permisos" in t
        or "grupos de permisos" in t
    ):
        return "permissiongroups", False
    
    if any(w in t for w in ("position", "positions", "posicion", "posiciones", "userposition", "userpositions")):
        return "userpositions", False

    if any(w in t for w in ("businessunit", "businessunits", "business unit", "business units", "unidad de negocio", "unidades de negocio", "bu")):
        return "businessunits", False


    return "tasks", False


def _ops_set(zone_code: str) -> set[str]:
    _, ops = list_operations(zone_code)
    return set([o.get("code") for o in ops if o.get("code")])


def build_plan(question: str) -> Plan:
    zone, explicit = _guess_zone(question)
    intent = detect_intent(question)  # <- str

    # Prefijo explícito y zona no soportada => no fallback
    if explicit and zone not in ("tasks", "users", "permissiongroups", "userpositions", "businessunits", "timesheets"):
        raise RouterError(f"Zone '{zone}' is not supported by cheap agent yet (explicit prefix).")



    available = _ops_set(zone)

    if zone == "tasks":
        return tasks_resolver.build_plan(question=question, intent=intent, available_ops=available)

    if zone == "users":
        return users_resolver.build_plan(question=question, intent=intent, available_ops=available)

    if zone == "permissiongroups":
        return permissiongroups_resolver.build_plan(question=question, intent=intent, available_ops=available)

    if zone == "userpositions":
        return userpositions_resolver.build_plan(question=question, intent=intent, available_ops=available)

    if zone == "businessunits":
        return businessunits_resolver.build_plan(question=question, intent=intent, available_ops=available)

    if zone == "timesheets":
        return timesheets_resolver.build_plan(question=question, intent=intent, available_ops=available)


    raise RouterError(f"Zone '{zone}' is not supported by cheap agent yet.")
