<?php
/**
 * SolicitudService - Manejo de solicitudes de soporte técnico
 * 
 * @package CTNet\WhatsApp
 */

class SolicitudService
{
    private ?mysqli $connSolicitudes = null;
    private ?mysqli $connNominas = null;

    /**
     * Maneja respuesta a solicitud de soporte
     */
    public function handleResponse(string $accion, string $telefono, string $contextId, array $tecnico): array
    {
        $this->connect();
        
        // Buscar solicitud por context_id
        $solicitud = $this->findSolicitud($contextId, $telefono);
        
        if (!$solicitud) {
            return ['success' => false, 'message' => '⚠️ No se encontró la solicitud asociada.'];
        }

        $tecnicoNombre = $tecnico['nombres'] . ' ' . $tecnico['apellidos'];
        $result = ['success' => false, 'message' => ''];
        $evento = '';

        switch ($accion) {
            case 'aceptar':
                $result = $this->acceptSolicitud($solicitud, $tecnico, $telefono);
                $evento = $result['evento'] ?? '';
                break;
                
            case 'rechazar':
                $result = $this->rejectSolicitud($solicitud, $tecnico, $telefono);
                $evento = $result['evento'] ?? '';
                break;
                
            default:
                return ['success' => false, 'message' => '⚠️ Acción no reconocida.'];
        }

        // Guardar en historial
        if ($evento) {
            $this->logHistorial($solicitud['solicitud_id'], $evento, $tecnicoNombre);
        }

        return $result;
    }

    /**
     * Acepta una solicitud
     */
    public function acceptSolicitud(array $solicitud, array $tecnico, string $telefono): array
    {
        $tecnicoNombre = $tecnico['nombres'] . ' ' . $tecnico['apellidos'];
        $nroControl = $solicitud['nro_control'];

        // Verificar estado actual
        if ($solicitud['estado_aceptacion'] === 'No Disponible') {
            return [
                'success' => false,
                'message' => '⚠️ La solicitud ya ha sido aceptada por otro técnico.',
                'evento' => "El técnico $tecnicoNombre intentó aceptar la solicitud #$nroControl, pero ya ha sido aceptada por otro técnico."
            ];
        }

        if ($solicitud['estado_aceptacion'] === 'Aceptada') {
            return [
                'success' => true,
                'message' => '✅ Esta solicitud se te asignó directamente desde plataforma.',
                'evento' => "El técnico $tecnicoNombre confirmó la aceptación previa de la solicitud #$nroControl."
            ];
        }

        if ($solicitud['estado_aceptacion'] !== 'Pendiente') {
            return [
                'success' => false,
                'message' => '⚠️ Esta solicitud ya no está disponible.',
                'evento' => ''
            ];
        }

        // Iniciar transacción
        $this->connSolicitudes->begin_transaction();

        try {
            // Actualizar solicitud
            $stmt = $this->connSolicitudes->prepare(
                "UPDATE solicitudes SET estado_aceptacion = 'Aceptada', tecnico_id = ? WHERE id = ?"
            );
            $stmt->bind_param("si", $tecnico['id_empleado'], $solicitud['solicitud_id']);
            $stmt->execute();

            // Actualizar envío del técnico
            $stmt2 = $this->connSolicitudes->prepare(
                "UPDATE envios_tecnicos SET estado_aceptacion = 'Aceptada' 
                 WHERE numero_tecnico = ? AND nro_control = ?"
            );
            $stmt2->bind_param("ss", $telefono, $nroControl);
            $stmt2->execute();

            // Marcar otros técnicos como no disponible
            $stmt3 = $this->connSolicitudes->prepare(
                "UPDATE envios_tecnicos SET estado_aceptacion = 'No Disponible' 
                 WHERE numero_tecnico != ? AND nro_control = ?"
            );
            $stmt3->bind_param("ss", $telefono, $nroControl);
            $stmt3->execute();

            $this->connSolicitudes->commit();

            return [
                'success' => true,
                'message' => '✅ Has aceptado la solicitud, la misma estará asignada a tu nombre por un lapso no mayor a 48 horas.',
                'evento' => "El técnico $tecnicoNombre aceptó la solicitud #$nroControl."
            ];

        } catch (Exception $e) {
            $this->connSolicitudes->rollback();
            return [
                'success' => false,
                'message' => "❌ Error al aceptar la solicitud #$nroControl.",
                'evento' => "El técnico $tecnicoNombre intentó aceptar la solicitud #$nroControl, pero ocurrió un error."
            ];
        }
    }

    /**
     * Rechaza una solicitud
     */
    public function rejectSolicitud(array $solicitud, array $tecnico, string $telefono): array
    {
        $tecnicoNombre = $tecnico['nombres'] . ' ' . $tecnico['apellidos'];
        $nroControl = $solicitud['nro_control'];

        $stmt = $this->connSolicitudes->prepare(
            "UPDATE envios_tecnicos SET estado_aceptacion = 'Rechazada' 
             WHERE numero_tecnico = ? AND estado_aceptacion != 'Aceptada' AND nro_control = ?"
        );
        $stmt->bind_param("ss", $telefono, $nroControl);
        $stmt->execute();

        if ($stmt->affected_rows === 0) {
            return [
                'success' => false,
                'message' => "❌ No puedes rechazar la solicitud #$nroControl porque ya la habías aceptado.",
                'evento' => "El técnico $tecnicoNombre intentó rechazar la solicitud #$nroControl, pero ya había sido aceptada por él mismo."
            ];
        }

        return [
            'success' => true,
            'message' => '❌ Has rechazado la solicitud.',
            'evento' => "El técnico $tecnicoNombre rechazó la solicitud #$nroControl."
        ];
    }

    /**
     * Busca solicitud por context_id
     */
    public function findSolicitud(string $contextId, string $telefono): ?array
    {
        $this->connect();
        
        $stmt = $this->connSolicitudes->prepare("
            SELECT et.*, s.id as solicitud_id
            FROM envios_tecnicos et
            LEFT JOIN solicitudes s ON et.nro_control = s.nro_control
            WHERE et.message_id = ? AND et.numero_tecnico = ?
            LIMIT 1
        ");
        $stmt->bind_param("ss", $contextId, $telefono);
        $stmt->execute();
        $result = $stmt->get_result();
        
        return $result->fetch_assoc() ?: null;
    }

    /**
     * Registra evento en historial
     */
    private function logHistorial(int $solicitudId, string $evento, string $usuario): void
    {
        $stmt = $this->connSolicitudes->prepare(
            "INSERT INTO historial_solicitudes (solicitud_id, evento, usuario) VALUES (?, ?, ?)"
        );
        $stmt->bind_param("iss", $solicitudId, $evento, $usuario);
        $stmt->execute();
    }

    /**
     * Conecta a las bases de datos usando el core centralizado
     */
    private function connect(): void
    {
        // Cargar core si no está cargado
        if (!function_exists('db_mysqli')) {
            require_once $_SERVER['DOCUMENT_ROOT'] . '/core/autoload.php';
        }
        
        if ($this->connSolicitudes === null) {
            $this->connSolicitudes = db_mysqli('ctnet');
        }

        if ($this->connNominas === null) {
            $this->connNominas = db_mysqli('nominasP');
        }
    }

    public function __destruct()
    {
        if ($this->connSolicitudes) $this->connSolicitudes->close();
        if ($this->connNominas) $this->connNominas->close();
    }
}
