<?php
ob_start(); // Buffer output to prevent warnings from corrupting JSON

// Importaciones de PHPMailer al nivel superior (requerido por PHP)
require_once __DIR__ . '/../lib/phpmailer/PHPMailer-6.9.3/src/Exception.php';
require_once __DIR__ . '/../lib/phpmailer/PHPMailer-6.9.3/src/PHPMailer.php';
require_once __DIR__ . '/../lib/phpmailer/PHPMailer-6.9.3/src/SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception as PHPMailerException;

require_once __DIR__ . '/../config/db_auto.php';
require_once __DIR__ . '/system_logger.php';
session_start();
header('Content-Type: application/json');

$logger = SystemLogger::getInstance();

// Validar usuario
if (!isset($_SESSION['user_id'])) {
    $logger->warning('Intento de crear citacion sin autenticación', 'IP: ' . ($_SERVER['REMOTE_ADDR'] ?? 'N/A'));
    http_response_code(401);
    ob_clean();
    echo json_encode(['success' => false, 'msg' => 'No autenticado']);
    exit;
}

$data = json_decode(file_get_contents('php://input'), true);

$alumno_id       = $data['alumno_id'] ?? null;
$familiar_id     = $data['familiar_id'] ?? null;
$fecha           = $data['fecha'] ?? null;
$hora            = $data['hora'] ?? null;
$motivo          = $data['motivo'] ?? null;
$comunicacion    = $data['comunicacion'] ?? null;
$enviar_email    = isset($data['enviar_email']) ? filter_var($data['enviar_email'], FILTER_VALIDATE_BOOLEAN) : false;
$enviar_whatsapp = isset($data['enviar_whatsapp']) ? filter_var($data['enviar_whatsapp'], FILTER_VALIDATE_BOOLEAN) : false;
$usuario_registro = $_SESSION['user_id'];

if (!$alumno_id || !$familiar_id || !$fecha || !$motivo || !$comunicacion) {
    ob_clean();
    echo json_encode(['success' => false, 'msg' => 'Faltan datos obligatorios (alumno, apoderado, fecha, motivo y comunicación son requeridos)']);
    exit;
}

// Combinar fecha y hora
$fecha_completa = $fecha . (!empty($hora) ? ' ' . $hora : ' 00:00:00');
$fecha_formateada = date('d-m-Y', strtotime($fecha));

// Inicializar estados
$estado_envio_email    = 'pendiente';
$estado_envio_whatsapp = $enviar_whatsapp ? 'pendiente' : 'no_aplica';
$whatsapp_url = null;

try {
    // 1. Obtener información del alumno y familiar
    $stmt_info = $pdo->prepare("
        SELECT 
            CONCAT(a.nombre, ' ', a.ap_paterno, ' ', a.ap_materno) AS alumno_nombre,
            CONCAT(f.nombre, ' ', f.ap_paterno, ' ', f.ap_materno) AS familiar_nombre,
            f.email,
            f.telefono,
            f.telefono2
        FROM alumnos a, familiares f
        WHERE a.id = ? AND f.id = ?
    ");
    $stmt_info->execute([$alumno_id, $familiar_id]);
    $info = $stmt_info->fetch(PDO::FETCH_ASSOC);

    if (!$info) {
        throw new Exception("No se encontró la información del alumno o apoderado (IDs: alumno=$alumno_id, familiar=$familiar_id)");
    }
    // 2. Envío de Email con PHPMailer
    if ($enviar_email) {
        if (!empty($info['email'])) {
            require_once __DIR__ . '/../config/mail_auto.php';

            // Obtener configuración SMTP del usuario activo
            $stmt_u = $pdo->prepare("SELECT email_corporativo, smtp_pass FROM usuarios WHERE id = ?");
            $stmt_u->execute([$_SESSION['user_id']]);
            $u_conf = $stmt_u->fetch(PDO::FETCH_ASSOC);

            try {
                $from_email = MAIL_FROM_EMAIL;
                if (!empty($u_conf['email_corporativo'])) {
                    $from_email = trim($u_conf['email_corporativo']);
                }

                // --- LÓGICA DE ENVÍO VÍA API (PRODUCCIÓN/HOSTING BLOQUEADO) ---
                if (defined('MAIL_USE_API') && MAIL_USE_API === true && MAIL_SEND_REAL) {
                    $apiUrl = 'https://api.mailersend.com/v1/email';
                    $payload = [
                        'from' => [
                            'email' => $from_email,
                            'name'  => MAIL_FROM_NAME
                        ],
                        'to' => [[
                            'email' => $info['email'],
                            'name'  => $info['familiar_nombre']
                        ]],
                        'subject' => 'Citación Apoderado - Escuela CRN',
                        'html'    => "<h3>Estimado/a {$info['familiar_nombre']},</h3>
                                      <p>Se le cita a una reunión referente a su pupilo/a <b>{$info['alumno_nombre']}</b>.</p>
                                      <p><b>Fecha:</b> {$fecha_formateada} &nbsp;&nbsp; <b>Hora:</b> {$hora}</p>
                                      <p><b>Motivo:</b> {$motivo}</p><hr>
                                      <p><b>Comunicación:</b><br>" . nl2br(htmlspecialchars($comunicacion)) . "</p><hr>
                                      <p>Por favor, confirmar asistencia. Saludos cordiales.</p>",
                        'text'    => "Estimado/a {$info['familiar_nombre']}: Se le cita a una reunión para {$info['alumno_nombre']} el día {$fecha_formateada} a las {$hora}. Motivo: {$motivo}."
                    ];

                    $ch = curl_init($apiUrl);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
                    curl_setopt($ch, CURLOPT_HTTPHEADER, [
                        'Content-Type: application/json',
                        'X-Requested-With: XMLHttpRequest',
                        'Authorization: Bearer ' . MAIL_API_KEY
                    ]);

                    $response = curl_exec($ch);
                    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                    $curlError = curl_error($ch);
                    curl_close($ch);

                    if ($httpCode >= 200 && $httpCode < 300) {
                        $estado_envio_email = 'enviado';
                    } else {
                        throw new Exception("Error API MailerSend (HTTP $httpCode): " . $response . " " . $curlError);
                    }
                } else {
                    // --- LÓGICA DE ENVÍO VÍA SMTP (LOCAL O RELAY TRADICIONAL) ---
                    $mail = new PHPMailer(true);

                    $smtp_user = '';
                    $smtp_pass = '';

                    // Configurar Autenticación si el entorno lo requiere
                    if (MAIL_AUTH) {
                        // Si usamos SMTP2GO, forzamos la cuenta maestra para asegurar éxito
                        if (MAIL_HOST === 'mail.smtp2go.com' || MAIL_HOST === 'smtp.mailersend.net') {
                            $smtp_user = MAIL_USER;
                            $smtp_pass = MAIL_PASS;
                        }
                        // Si no, intentamos usar la configuración personal del usuario
                        elseif (!empty($u_conf['email_corporativo']) && !empty($u_conf['smtp_pass'])) {
                            $smtp_user = trim($u_conf['email_corporativo']);
                            $smtp_pass = trim($u_conf['smtp_pass']);
                        } else {
                            $smtp_user = MAIL_USER;
                            $smtp_pass = MAIL_PASS;
                        }

                        if (empty($smtp_user) || empty($smtp_pass)) {
                            throw new Exception("Configuración de correo incompleta para este entorno.");
                        }
                    }

                    $mail->isSMTP();
                    $mail->Host       = MAIL_HOST;
                    $mail->SMTPAuth   = MAIL_AUTH;
                    if (MAIL_AUTH) {
                        $mail->Username   = $smtp_user;
                        $mail->Password   = $smtp_pass;
                    }

                    $mail->SMTPSecure = (MAIL_SECURE === 'ssl') ? PHPMailer::ENCRYPTION_SMTPS : PHPMailer::ENCRYPTION_STARTTLS;
                    $mail->Port       = MAIL_PORT;

                    $mail->SMTPOptions = ['ssl' => [
                        'verify_peer'       => false,
                        'verify_peer_name'  => false,
                        'allow_self_signed' => true
                    ]];

                    $mail->setFrom($from_email, MAIL_FROM_NAME);
                    $mail->addAddress($info['email'], $info['familiar_nombre']);

                    // Configurar Reply-To para evitar respuestas a la cuenta de envío
                    $mail->addReplyTo('d.carrasco@paineduca.cl', 'Daniela Carrasco E., Encargada de Convivencia Educativa');
                    $mail->addReplyTo('b.mariquezz@paineduca.cl', 'Bárbara Manríquez Z., Trabajadora Social');
                    $mail->addReplyTo('c.cadiz@paineduca.cl', 'Carolina Cadiz S., Psicóloga');

                    $mail->isHTML(true);
                    $mail->CharSet = 'UTF-8';
                    $mail->Subject = 'Citación Apoderado - Escuela CRN';

                    $mail->Body    = "<h3>Estimado/a {$info['familiar_nombre']},</h3>
                                      <p>Se le cita a una reunión referente a su pupilo/a <b>{$info['alumno_nombre']}</b>.</p>
                                      <p><b>Fecha:</b> {$fecha} &nbsp;&nbsp; <b>Hora:</b> {$hora}</p>
                                      <p><b>Motivo:</b> {$motivo}</p><hr>
                                      <p><b>Comunicación:</b><br>" . nl2br(htmlspecialchars($comunicacion)) . "</p><hr>
                                      <p>Por favor, confirmar asistencia. Saludos cordiales.</p>
                                      <br><br>
                                      <p style='color: #666; font-size: 12px; border-top: 1px solid #ccc; padding-top: 10px;'>
                                        <i>Este es un mensaje automático generado por el Sistema Interno CRN. <br>
                                        <b>Puede responder a este correo directamente para confirmar su asistencia o realizar consultas.</b><br>
                                        Desarrollado por WMB Computación</i>
                                      </p>";

                    $mail->AltBody = strip_tags($mail->Body);

                    if (MAIL_SEND_REAL) {
                        $mail->send();
                        $estado_envio_email = 'enviado';
                    } else {
                        $logger->info("Simulación de envío (Relay) desde IP servidor para: " . $from_email);
                        $estado_envio_email = 'enviado';
                    }
                }
            } catch (Throwable $e) {
                $smtp_error = $mail->ErrorInfo;
                $exc_msg = $e->getMessage();
                // Asegurar que nunca devolvemos un mensaje vacío para poder diagnosticar
                $full_error = !empty($smtp_error) ? $smtp_error : (!empty($exc_msg) ? $exc_msg : "Error desconocido de conexión (posible puerto bloqueado)");

                $logger->error("Error al enviar citación (Usuario ID: {$_SESSION['user_id']}, From: $from_email)", "PHPMailer Error: $smtp_error | Exception: $exc_msg");
                throw new Exception("[$from_email] Error en envío: $full_error");
            }
        } else {
            $estado_envio_email = 'error'; // Sin email registrado
        }
    }

    // 3. Generar enlace WhatsApp (wa.me)
    if ($enviar_whatsapp) {
        $telefono = (!empty($info['telefono'])) ? $info['telefono'] : ((!empty($info['telefono2'])) ? $info['telefono2'] : '');

        if (!empty($telefono)) {
            $telefono = preg_replace('/[^\d+]/', '', $telefono);
            if (!str_starts_with($telefono, '+56') && !str_starts_with($telefono, '56')) {
                if (str_starts_with($telefono, '9') && strlen($telefono) === 9) {
                    $telefono = '56' . $telefono;
                } else {
                    $telefono = '569' . substr($telefono, -8);
                }
            }
            $mensaje = "*Citación - Escuela CRN*\n\nEstimado/a *{$info['familiar_nombre']}*,\n\nSe le cita a una reunión referente a su pupilo/a *{$info['alumno_nombre']}*.\n\n*Fecha:* {$fecha_formateada}\n*Hora:* {$hora}\n*Motivo:* {$motivo}\n\n*Comunicación:*\n{$comunicacion}\n\nPor favor, confirmar asistencia. Saludos cordiales.";
            $whatsapp_url = 'https://wa.me/' . $telefono . '?text=' . rawurlencode($mensaje);
            $estado_envio_whatsapp = 'enviado';
        } else {
            $estado_envio_whatsapp = 'error'; // Sin teléfono
        }
    }

    // 4. Guardar en base de datos
    $stmt = $pdo->prepare("
        INSERT INTO citaciones_apoderados 
            (alumno_id, familiar_id, fecha, motivo, comunicacion, estado_envio_email, estado_envio_whatsapp, usuario_registro, fecha_registro)
        VALUES 
            (:alumno_id, :familiar_id, :fecha_completa, :motivo, :comunicacion, :estado_envio_email, :estado_envio_whatsapp, :usuario_registro, NOW())
    ");
    $stmt->execute([
        ':alumno_id'             => $alumno_id,
        ':familiar_id'           => $familiar_id,
        ':fecha_completa'        => $fecha_completa,
        ':motivo'                => $motivo,
        ':comunicacion'          => $comunicacion,
        ':estado_envio_email'    => $estado_envio_email,
        ':estado_envio_whatsapp' => $estado_envio_whatsapp,
        ':usuario_registro'      => $usuario_registro
    ]);

    $citacion_id = $pdo->lastInsertId();
    $logger->data('Nueva citación de apoderado creada', "Citación ID: $citacion_id, Alumno: {$info['alumno_nombre']}, Familiar: {$info['familiar_nombre']}, Motivo: $motivo");

    ob_clean();
    echo json_encode([
        'success'      => true,
        'msg'          => 'Citación guardada correctamente',
        'whatsapp_url' => $whatsapp_url
    ]);
} catch (Throwable $e) {
    if (isset($logger)) {
        $logger->error('Error al guardar citación con apoderado', "Usuario ID: " . ($_SESSION['user_id'] ?? 'N/A') . ", Error: " . $e->getMessage());
    }
    http_response_code(500);
    if (ob_get_length()) ob_clean();
    echo json_encode([
        'success' => false,
        'msg' => 'Error crítico en el servidor: ' . $e->getMessage(),
        'file' => basename($e->getFile()),
        'line' => $e->getLine()
    ]);
}
ob_end_flush();
