<?php
require "../config/Conexion.php";

class AgendaAPI
{
    public function __construct()
    {
        $this->initTable();
    }

    private function initTable()
    {
        // Ejecutar creación directa sin verificaciones previas que pueden fallar en ciertos servidores.
        // Si la tabla ya existe, no pasa nada (IF NOT EXISTS).
        $sqlCreate = "CREATE TABLE IF NOT EXISTS agenda_local (
            id INT AUTO_INCREMENT PRIMARY KEY,
            booking_id VARCHAR(255) NOT NULL,
            estado_local VARCHAR(50) DEFAULT 'PENDIENTE',
            fecha_registro DATETIME DEFAULT CURRENT_TIMESTAMP,
            UNIQUE KEY unique_booking (booking_id)
        )";
        // Usamos @ para suprimir cualquier warning de PHP en caso de error de permisos DB
        @ejecutarConsulta($sqlCreate);
    }

    public function listarBookings($fechaInicio, $fechaFin)
    {
        $apiKey = defined('CALCOM_API_KEY') ? CALCOM_API_KEY : "";

        if (empty($apiKey) || $apiKey === "TU_API_KEY_AQUI" || $apiKey === "API KEY CLIENTE" || $apiKey === "cal") {
            return $this->mockData();
        }

        // Cal.com API v2 URL - Simplificamos parámetros para asegurar que devuelva algo
        $url = "https://api.cal.com/v2/bookings?afterStart=" . urlencode($fechaInicio);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        
        // Cabeceras requeridas para v2
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Authorization: Bearer " . $apiKey,
            "Content-Type: application/json"
        ]);

        $response = curl_exec($ch);
        error_log("RESPUESTA_CAL_COM: " . $response);

        if (curl_errno($ch)) {
            error_log("Error cURL en AgendaAPI: " . curl_error($ch));
            return $this->mockData();
        }

        curl_close($ch);

        $result = json_decode($response, true);

        // En v2 la respuesta exitosa tiene status: 'success'
        if (isset($result['status']) && $result['status'] === 'success') {
            $bookings = [];
            
            // Caso 1: Los datos están en result['data']['bookings']
            if (isset($result['data']['bookings']) && is_array($result['data']['bookings'])) {
                $bookings = $result['data']['bookings'];
            } 
            // Caso 2: Los datos están directamente en result['data']
            elseif (isset($result['data']) && is_array($result['data'])) {
                $bookings = $result['data'];
            }
            
            error_log("CANTIDAD_BOOKINGS_ENCONTRADOS: " . count($bookings));
            return $this->filtrarConEstadoLocal($bookings);
        }

        // Si hay error en la API o no hay datos, loguear para diagnóstico
        if (isset($result['status']) && $result['status'] === 'error') {
            error_log("Error API Cal.com: " . json_encode($result['error']));
        }

        return $this->mockData();
    }

    private function filtrarConEstadoLocal($bookings)
    {
        // Obtener estados locales
        $sql = "SELECT booking_id, estado_local FROM agenda_local";
        $localStates = @ejecutarConsulta($sql); // Suprimir error visual

        $mapaEstados = [];

        // CRUCIAL: Verificar que la consulta devolvió un objeto válido (no false)
        if ($localStates && !is_bool($localStates)) {
            while ($reg = $localStates->fetch_assoc()) {
                $mapaEstados[$reg['booking_id']] = $reg['estado_local'];
            }
        }

        $filteredBookings = [];
        foreach ($bookings as $booking) {
            // En v2 se prefiere 'uid', pero mantenemos fallback a 'id'
            $id = isset($booking['uid']) ? $booking['uid'] : (isset($booking['id']) ? $booking['id'] : null);
            
            if (!$id) continue;

            $estadoLocal = isset($mapaEstados[$id]) ? $mapaEstados[$id] : null;

            if ($estadoLocal == 'ELIMINADA') {
                continue; // No agregar a la lista
            }

            if ($estadoLocal == 'ATENDIDA') {
                $booking['status'] = 'ATENDIDA';
            }

            // Normalizar campos para compatibilidad con el resto del sistema (API v2 -> v1 style)
            $booking['id'] = $id;
            if (!isset($booking['startTime']) && isset($booking['start'])) {
                $booking['startTime'] = $booking['start'];
            }
            if (!isset($booking['endTime']) && isset($booking['end'])) {
                $booking['endTime'] = $booking['end'];
            }
            
            // Asegurar título
            if (!isset($booking['title']) && isset($booking['type'])) {
                $booking['title'] = $booking['type'];
            }

            $filteredBookings[] = $booking;
        }
        return $filteredBookings;
    }

    public function marcarAtendida($bookingId)
    {
        $check = "SELECT id FROM agenda_local WHERE booking_id='$bookingId'";
        $exists = ejecutarConsultaSimpleFila($check);

        if ($exists) {
            $sql = "UPDATE agenda_local SET estado_local='ATENDIDA' WHERE booking_id='$bookingId'";
        } else {
            $sql = "INSERT INTO agenda_local (booking_id, estado_local) VALUES ('$bookingId', 'ATENDIDA')";
        }
        return ejecutarConsulta($sql);
    }

    public function eliminarBooking($bookingId)
    {
        $check = "SELECT id FROM agenda_local WHERE booking_id='$bookingId'";
        $exists = ejecutarConsultaSimpleFila($check);

        if ($exists) {
            $sql = "UPDATE agenda_local SET estado_local='ELIMINADA' WHERE booking_id='$bookingId'";
        } else {
            $sql = "INSERT INTO agenda_local (booking_id, estado_local) VALUES ('$bookingId', 'ELIMINADA')";
        }
        return ejecutarConsulta($sql);
    }

    public function obtenerUltimasCitas()
    {
        // Obtener citas futuras para notificaciones
        $fechaInicio = date('Y-m-d') . 'T00:00:00Z';
        $fechaFin = date('Y-m-d', strtotime('+30 days')) . 'T23:59:59Z';

        // Reutilizamos listarBookings que ya filtra eliminados
        $bookings = $this->listarBookings($fechaInicio, $fechaFin);

        // Retornar solo las pendientes
        $pendientes = [];
        foreach ($bookings as $b) {
            if (!isset($b['status']) || ($b['status'] != 'CANCELLED' && $b['status'] != 'ATENDIDA')) {
                // Formatear para notificación
                $id = isset($b['uid']) ? $b['uid'] : (isset($b['id']) ? $b['id'] : '');
                $pendientes[] = [
                    'titulo' => isset($b['title']) ? $b['title'] : 'Sin título',
                    'hora' => date("d/m H:i", strtotime($b['startTime'])),
                    'id' => $id
                ];
            }
        }

        // Retornar max 5
        return array_slice($pendientes, 0, 5);
    }

    private function mockData()
    {
        // Simulación de datos para demostración visual
        // (Booking structure required: id, title, status, startTime, attendees, email)
        return [
            [
                'id' => 1,
                'title' => 'Consulta General - Demo',
                'startTime' => date('Y-m-d') . 'T10:00:00Z',
                'endTime' => date('Y-m-d') . 'T10:30:00Z',
                'attendees' => [
                    ['name' => 'Juan Pérez', 'email' => 'juan@example.com']
                ],
                'status' => 'ACCEPTED'
            ]
        ];
    }
}
?>