<?php

namespace App\Libraries;

use Dompdf\Dompdf;
use Dompdf\Options;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\SvgWriter;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception as PHPMailerException;

class BoletoGenerator
{
    public function generarBoleto($id_reserva)
    {
        $db = \db_connect();
        $reserva = $db->query("SELECT r.*, p.referencia, p.metodo, p.fecha_pago, u.nombres, u.apellidos, u.email
            FROM reserva r
            JOIN pago p ON p.id_reserva = r.id_reserva
            JOIN usuario u ON u.id_usuario = r.id_usuario
            WHERE r.id_reserva = ?", [$id_reserva])->getRow();

        $detalles = $db->query("SELECT dr.*, a.fila, a.numero, a.tipo AS asiento_tipo, f.fecha, f.hora_inicio, pel.titulo AS pelicula_titulo, s.nombre AS sala_nombre, l.nombre AS local_nombre
            FROM detalle_reserva dr
            JOIN asiento a ON a.id_asiento = dr.id_asiento
            JOIN funcion f ON f.id_funcion = dr.id_funcion
            JOIN pelicula pel ON pel.id_pelicula = f.id_pelicula
            JOIN sala s ON s.id_sala = f.id_sala
            JOIN local l ON l.id_local = s.id_local
            WHERE dr.id_reserva = ?", [$id_reserva])->getResult();

        $productos = $db->query("SELECT rp.*, pr.nombre, pr.descripcion, pr.categoria, pr.imagen_url
            FROM reserva_producto rp
            JOIN producto pr ON pr.id_producto = rp.id_producto
            WHERE rp.id_reserva = ?", [$id_reserva])->getResult();

        $viewData = [
            'reserva' => $reserva,
            'detalles' => $detalles,
            'productos' => $productos,
        ];

        if (count($productos) > 0 && count($detalles) === 0) {
            $html = view('home/reserva/boleta_alimentos_pdf', $viewData);
        } else {
            $textoQr = "Reserva: " . $reserva->referencia . "\nCliente: " . $reserva->nombres . " " . $reserva->apellidos . "\nTotal: S/ " . number_format($reserva->total, 2);
            $qrBase64 = $this->obtenerQrBase64($textoQr);
            $viewData['qrBase64'] = $qrBase64;
            $html = view('home/reserva/boleto_pdf', $viewData);
        }

        $options = new Options();
        $options->set('isHtml5ParserEnabled', true);
        $options->set('isRemoteEnabled', true);
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($html);
        $dompdf->setPaper('A4', 'portrait');
        $dompdf->render();

        $dir = WRITEPATH . 'boletos/';
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
        }

        $filePath = $dir . 'Boleto-' . $reserva->referencia . '.pdf';
        file_put_contents($filePath, $dompdf->output());

        return $filePath;
    }

    private function obtenerQrBase64($texto)
    {
        // Usar SvgWriter que NO requiere la extensión GD de PHP
        // Dompdf puede renderizar SVG embebido en base64 sin problemas
        try {
            $qr = new QrCode($texto);
            $writer = new SvgWriter();
            $result = $writer->write($qr);
            return $result->getDataUri(); // Devuelve data:image/svg+xml;base64,...
        } catch (\Throwable $e) {
            log_message('error', 'Error generando QR SVG: ' . $e->getMessage());
            return ''; // En caso de error, el PDF se genera sin imagen QR
        }
    }

    public function enviarPorCorreo($destinatario, $nombre_destinatario, $referencia, $pdfPath, $tipo = 'entrada')
    {
        // Cargar configuración de correo
        $config = config('Email');

        $mail = new PHPMailer(true);

        try {
            // Servidor SMTP local o PHP mail function
            if (!empty($config->SMTPHost)) {
                $mail->isSMTP();
                $mail->Host       = $config->SMTPHost;
                $mail->SMTPAuth   = !empty($config->SMTPUser);
                $mail->Username   = $config->SMTPUser;
                $mail->Password   = $config->SMTPPass;
                $mail->SMTPSecure = $config->SMTPCrypto;
                $mail->Port       = $config->SMTPPort;
            } else {
                $mail->isMail();
            }

            // Destinatarios
            $mail->setFrom($config->fromEmail, $config->fromName);
            $mail->addAddress($destinatario, $nombre_destinatario);

            // Archivos adjuntos
            if (file_exists($pdfPath)) {
                $fileName = $tipo === 'alimentos' ? "Boleta-Alimentos-{$referencia}.pdf" : "Boleto-Digital-{$referencia}.pdf";
                $mail->addAttachment($pdfPath, $fileName);
            }

            // Contenido
            $mail->isHTML(true);
            if ($tipo === 'alimentos') {
                $mail->Subject = "Tu boleta de compra de alimentos - CinePlex";
                $welcomeText = "Gracias por tu compra de alimentos y bebidas en <strong>CinePlex</strong>.";
                $detailsText = "Adjunto encontrarás tu boleta en PDF con el resumen de la compra.";
            } else {
                $mail->Subject = "Tu boleto digital para la función - CinePlex";
                $welcomeText = "Gracias por comprar tus entradas en <strong>CinePlex</strong>. Tu pago ha sido aprobado de manera exitosa.";
                $detailsText = "Adjunto a este correo encontrarás tu boleto en formato PDF. Contiene tu código QR para el ingreso directo a la sala.";
            }

            $mail->Body = "
                <div style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #eee; border-radius: 8px;'>
                    <h2 style='color: #ff9800; text-align: center;'>¡Compra confirmada!</h2>
                    <p>Hola <strong>{$nombre_destinatario}</strong>,</p>
                    <p>{$welcomeText}</p>
                    <div style='background-color: #f9f9f9; padding: 15px; border-left: 4px solid #ff9800; margin: 20px 0;'>
                        <p style='margin: 5px 0;'><strong>Código de referencia:</strong> {$referencia}</p>
                        <p style='margin: 5px 0;'><strong>Fecha de operación:</strong> " . date('d/m/Y H:i:s') . "</p>
                    </div>
                    <p>{$detailsText}</p>
                    <p style='color: #777; font-size: 0.9em;'>Por favor, conserva este correo como comprobante de tu compra.</p>
                    <hr style='border: none; border-top: 1px solid #eee; margin: 20px 0;'>
                    <p style='text-align: center; color: #ff9800; font-weight: bold;'>¡Disfruta tu experiencia en el cine!</p>
                </div>
            ";

            $mail->send();
            return true;
        } catch (PHPMailerException $e) {
            log_message('error', "PHPMailer Error: {$mail->ErrorInfo}");
            return false;
        }
    }
}
