<?php
// Prevent direct access
if (count(get_included_files()) === 1) {
    http_response_code(403);
    exit('Forbidden');
}

/**
 * ToolRegistry — las funciones que Vale puede ejecutar (Function Calling).
 * Hay DOS sets, según el modo, y NUNCA se mezclan:
 *   - 'atencion'   : Vale atiende clientes finales (crear_cita, capturar_lead).
 *   - 'onboarding' : Vale configura el negocio con el dueño (configurar_negocio, etc.).
 * Esto evita que un cliente final pueda reconfigurar el negocio.
 */
class ToolRegistry {
    public static function declarations(string $mode = 'atencion'): array {
        if ($mode === 'onboarding') {
            $tools = self::onboardingTools();
            $tools[] = self::ofrecerOpcionesTool();
        } elseif ($mode === 'owner') {
            $tools = self::ownerTools();
        } else {
            $tools = self::attentionTools();
            $tools[] = self::ofrecerOpcionesTool();
        }
        return $tools;
    }

    /** UI: muestra botones de respuesta rápida en vez de pedir que el usuario escriba. */
    private static function ofrecerOpcionesTool(): array {
        return [
            'name' => 'ofrecer_opciones',
            'description' => 'Muestra botones de respuesta rápida para que el usuario elija con un toque en lugar de escribir. Usalo cuando hay opciones claras (rubro, servicios, horarios, confirmar sí/no). Acompañá SIEMPRE con un texto breve.',
            'parameters' => [
                'type' => 'OBJECT',
                'properties' => [
                    'opciones' => [
                        'type' => 'ARRAY',
                        'items' => ['type' => 'STRING'],
                        'description' => 'Lista de 2 a 6 opciones cortas que se mostrarán como botones.',
                    ],
                ],
                'required' => ['opciones'],
            ],
        ];
    }

    private static function attentionTools(): array {
        return [
            [
                'name' => 'get_availability',
                'description' => 'Consulta el Google Calendar del negocio y devuelve los horarios libres para una fecha. Llamar SIEMPRE antes de proponer horarios para una cita o cuando el cliente pregunta disponibilidad.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'fecha' => ['type' => 'STRING', 'description' => 'Fecha a consultar en formato YYYY-MM-DD.'],
                    ],
                    'required' => ['fecha'],
                ],
            ],
            [
                'name' => 'escalate_to_owner',
                'description' => 'Escala la conversación al dueño cuando hay una queja, reclamo, solicitud de reembolso, o cualquier situación que Vale no puede resolver sola. Después de llamar esta función Vale le dice al cliente "dejame confirmarlo con el equipo y te aviso". Usar solo cuando sea genuinamente necesario.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'motivo'  => ['type' => 'STRING', 'description' => 'Categoría del escalado: queja, reembolso, reclamo, consulta_especial, otro.'],
                        'resumen' => ['type' => 'STRING', 'description' => 'Resumen breve de lo que el cliente necesita, para que el dueño entienda sin leer toda la conversación.'],
                    ],
                    'required' => ['motivo', 'resumen'],
                ],
            ],
            [
                'name' => 'crear_cita',
                'description' => 'Agenda una cita/turno para el cliente cuando pide reservar un servicio. Usar SOLO cuando ya se tiene el servicio y una fecha/hora concreta.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'servicio' => ['type' => 'STRING', 'description' => 'Nombre del servicio solicitado.'],
                        'fecha_hora' => ['type' => 'STRING', 'description' => 'Fecha y hora en formato YYYY-MM-DD HH:MM (24h), ya resuelta.'],
                        'nombre_cliente' => ['type' => 'STRING', 'description' => 'Nombre del cliente si lo menciona.'],
                        'notas' => ['type' => 'STRING', 'description' => 'Notas o pedidos especiales.'],
                    ],
                    'required' => ['servicio', 'fecha_hora'],
                ],
            ],
            [
                'name' => 'capturar_lead',
                'description' => 'Registra a un cliente interesado que NO agenda una cita ahora, para seguimiento posterior.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'interes' => ['type' => 'STRING', 'description' => 'Qué quiere o necesita el cliente.'],
                        'nombre' => ['type' => 'STRING', 'description' => 'Nombre del cliente si lo menciona.'],
                        'valor_estimado' => ['type' => 'NUMBER', 'description' => 'Valor estimado del negocio potencial.'],
                    ],
                    'required' => ['interes'],
                ],
            ],
            [
                'name' => 'actualizar_perfil_cliente',
                'description' => 'Guarda un dato útil del cliente detectado en la conversación. Llamar solo cuando el cliente menciona algo de forma natural (email, cumpleaños, preferencia, restricción). NO interrumpir para pedirlo — solo guardar si surge solo.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'email'    => ['type' => 'STRING', 'description' => 'Email del cliente si lo menciona o lo da para confirmar la cita.'],
                        'telefono' => ['type' => 'STRING', 'description' => 'Número de teléfono del cliente si lo menciona o lo da para confirmar la cita.'],
                        'birthday' => ['type' => 'STRING', 'description' => 'Cumpleaños en formato YYYY-MM-DD si lo menciona.'],
                        'notas'    => ['type' => 'STRING', 'description' => 'Nota libre: preferencia, restricción, algo que le gusta o no le gusta.'],
                        'clave'    => ['type' => 'STRING', 'description' => 'Nombre de la preferencia a guardar (ej: horario_preferido, tipo_corte, barba, alergia).'],
                        'valor'    => ['type' => 'STRING', 'description' => 'Valor de esa preferencia (ej: mañanas, fade, sí, látex).'],
                    ],
                    'required' => [],
                ],
            ],
        ];
    }

    private static function ownerTools(): array {
        return [
            [
                'name' => 'agregar_servicio',
                'description' => 'Agrega un nuevo servicio al perfil del negocio. Confirmar siempre con el dueño antes de llamar.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'nombre'      => ['type' => 'STRING', 'description' => 'Nombre del servicio.'],
                        'duracion_min'=> ['type' => 'NUMBER', 'description' => 'Duración en minutos.'],
                        'precio'      => ['type' => 'NUMBER', 'description' => 'Precio del servicio.'],
                        'descripcion' => ['type' => 'STRING', 'description' => 'Descripción corta opcional.'],
                    ],
                    'required' => ['nombre'],
                ],
            ],
            [
                'name' => 'editar_servicio',
                'description' => 'Edita los datos de un servicio existente (nombre, precio o duración). Mostrar qué va a cambiar antes de llamar.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'id'          => ['type' => 'NUMBER', 'description' => 'ID del servicio a editar.'],
                        'nombre'      => ['type' => 'STRING', 'description' => 'Nuevo nombre (opcional).'],
                        'duracion_min'=> ['type' => 'NUMBER', 'description' => 'Nueva duración en minutos (opcional).'],
                        'precio'      => ['type' => 'NUMBER', 'description' => 'Nuevo precio (opcional).'],
                        'descripcion' => ['type' => 'STRING', 'description' => 'Nueva descripción corta (opcional).'],
                    ],
                    'required' => ['id'],
                ],
            ],
            [
                'name' => 'eliminar_servicio',
                'description' => 'Archiva (desactiva) un servicio del negocio. Pedir confirmación explícita antes de llamar.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'id' => ['type' => 'NUMBER', 'description' => 'ID del servicio a eliminar.'],
                    ],
                    'required' => ['id'],
                ],
            ],
            [
                'name' => 'actualizar_horarios',
                'description' => 'Actualiza los horarios de atención del negocio.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'horarios' => ['type' => 'STRING', 'description' => 'Horarios en texto claro, ej. "Lun–Sáb 9–18, Dom cerrado".'],
                    ],
                    'required' => ['horarios'],
                ],
            ],
            [
                'name' => 'actualizar_info',
                'description' => 'Actualiza los datos del negocio: nombre, ciudad, dirección, teléfono o descripción. Usá esta tool cuando el dueño quiera cambiar cualquier dato del perfil del negocio.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'nombre'      => ['type' => 'STRING', 'description' => 'Nuevo nombre del negocio.'],
                        'ciudad'      => ['type' => 'STRING', 'description' => 'Ciudad donde opera el negocio (ej: Managua, Granada).'],
                        'direccion'   => ['type' => 'STRING', 'description' => 'Dirección física del negocio.'],
                        'telefono'    => ['type' => 'STRING', 'description' => 'Teléfono de contacto.'],
                        'descripcion' => ['type' => 'STRING', 'description' => 'Descripción corta del negocio (aparece en la página pública).'],
                    ],
                    'required' => [],
                ],
            ],
            [
                'name' => 'agregar_staff',
                'description' => 'Agrega un integrante del equipo al perfil del negocio.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'nombre' => ['type' => 'STRING', 'description' => 'Nombre del integrante.'],
                        'rol'    => ['type' => 'STRING', 'description' => 'Rol o cargo (ej. barbero, odontólogo, estilista).'],
                    ],
                    'required' => ['nombre'],
                ],
            ],
            [
                'name' => 'listar_servicios',
                'description' => 'Devuelve la lista de servicios activos del negocio. Llamar antes de editar o eliminar para conocer los IDs.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => (object)[],
                    'required' => [],
                ],
            ],
        ];
    }

    private static function onboardingTools(): array {
        return [
            [
                'name' => 'guardar_contacto_dueno',
                'description' => 'Guarda los datos de contacto del DUEÑO del negocio (la persona que está configurando, no un cliente final). Llamar al principio, apenas tengas su nombre completo y teléfono.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'nombre_completo' => ['type' => 'STRING', 'description' => 'Nombre y apellido del dueño.'],
                        'telefono' => ['type' => 'STRING', 'description' => 'Teléfono o WhatsApp del dueño.'],
                    ],
                    'required' => ['nombre_completo'],
                ],
            ],
            [
                'name' => 'configurar_negocio',
                'description' => 'Guarda los datos base del negocio durante la configuración. Llamar cuando ya tengas el nombre y el rubro.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'nombre' => ['type' => 'STRING', 'description' => 'Nombre real del negocio.'],
                        'rubro' => ['type' => 'STRING', 'description' => 'Clave del rubro: barberia, restaurante, tienda, clinica, domicilio u otro.'],
                        'profile_kind' => ['type' => 'STRING', 'description' => 'cita, reserva, pedido, lead o generic (según el rubro).'],
                        'tono' => ['type' => 'STRING', 'description' => 'Tono de Vale para este negocio (ej. calido, amigable, profesional).'],
                        'saludo' => ['type' => 'STRING', 'description' => 'Saludo de bienvenida que Vale usará con los clientes.'],
                    ],
                    'required' => ['nombre', 'rubro', 'profile_kind'],
                ],
            ],
            [
                'name' => 'agregar_servicio',
                'description' => 'Agrega un servicio/producto que ofrece el negocio. Llamar una vez por cada servicio.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'nombre' => ['type' => 'STRING', 'description' => 'Nombre del servicio o producto.'],
                        'duracion_min' => ['type' => 'NUMBER', 'description' => 'Duración en minutos (si aplica).'],
                        'precio_min' => ['type' => 'NUMBER', 'description' => 'Precio o precio desde.'],
                        'precio_max' => ['type' => 'NUMBER', 'description' => 'Precio máximo si es un rango.'],
                        'descripcion' => ['type' => 'STRING', 'description' => 'Descripción corta.'],
                    ],
                    'required' => ['nombre'],
                ],
            ],
            [
                'name' => 'set_horarios',
                'description' => 'Guarda los horarios de atención del negocio.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'horarios' => ['type' => 'STRING', 'description' => 'Horarios en texto claro, ej. "Lun-Vie 9-18, Sáb 9-13".'],
                    ],
                    'required' => ['horarios'],
                ],
            ],
            [
                'name' => 'finalizar_onboarding',
                'description' => 'Marca el negocio como configurado y listo. Llamar SOLO después de mostrar un resumen y que el dueño lo apruebe explícitamente.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'confirmado' => ['type' => 'BOOLEAN', 'description' => 'true si el dueño aprobó el resumen.'],
                    ],
                    'required' => ['confirmado'],
                ],
            ],
            [
                'name' => 'inferir_rubro',
                'description' => 'Clasifica el rubro del negocio por su nombre usando IA. Llamar en cuanto tengas el nombre del negocio, antes de preguntar el rubro manualmente. Devuelve rubro canónico, especialidad y confianza.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'nombre' => ['type' => 'STRING', 'description' => 'Nombre del negocio a clasificar.'],
                    ],
                    'required' => ['nombre'],
                ],
            ],
            [
                'name' => 'set_rubro',
                'description' => 'Guarda el rubro canónico y la especialidad del negocio en la base de datos. Llamar después de confirmar el rubro con el dueño.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'rubro'       => ['type' => 'STRING', 'description' => 'Rubro canónico: barberia, odontologia, belleza o general.'],
                        'especialidad' => ['type' => 'STRING', 'description' => 'Especialidad en texto libre, o null si no aplica.'],
                    ],
                    'required' => ['rubro'],
                ],
            ],
            [
                'name' => 'sugerir_servicios',
                'description' => 'Obtiene los servicios semilla típicos del rubro para ofrecérselos al dueño como sugerencia. Llamar después de confirmar el rubro, antes de preguntar los servicios.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'rubro'       => ['type' => 'STRING', 'description' => 'Rubro canónico del negocio.'],
                        'especialidad' => ['type' => 'STRING', 'description' => 'Especialidad si aplica, para afinar las sugerencias.'],
                    ],
                    'required' => ['rubro'],
                ],
            ],
            [
                'name' => 'guardar_memoria',
                'description' => 'Guarda un dato clave sobre el negocio en la memoria de Vale. Llamar después de confirmar cada dato importante: rubro, ciudad, servicios_count, horarios, preferencias del dueño. Esta memoria se inyecta en futuras conversaciones para que Vale "recuerde" al cliente.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'clave' => ['type' => 'STRING', 'description' => 'Nombre del dato (ej: rubro_confirmado, ciudad, horarios_configurados, servicios_count, registro_idioma, fecha_inicio).'],
                        'valor' => ['type' => 'STRING', 'description' => 'Valor del dato como string.'],
                    ],
                    'required' => ['clave', 'valor'],
                ],
            ],
            [
                'name' => 'actualizar_info',
                'description' => 'Actualiza datos del perfil del negocio durante el onboarding: ciudad, dirección, teléfono, descripción.',
                'parameters' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'ciudad'      => ['type' => 'STRING', 'description' => 'Ciudad donde opera el negocio.'],
                        'direccion'   => ['type' => 'STRING', 'description' => 'Dirección física.'],
                        'telefono'    => ['type' => 'STRING', 'description' => 'Teléfono de contacto.'],
                        'descripcion' => ['type' => 'STRING', 'description' => 'Descripción corta del negocio.'],
                    ],
                    'required' => [],
                ],
            ],
        ];
    }
}
