<?php
/**
 * Funciones de Envío de Correo vía PHPMailer
 */
require_once __DIR__ . '/PHPMailer/Exception.php';
require_once __DIR__ . '/PHPMailer/PHPMailer.php';
require_once __DIR__ . '/PHPMailer/SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

/**
 * Configura el transporte (mail() nativo o SMTP) sobre un PHPMailer.
 *
 * @param PHPMailer $mail     Instancia a configurar
 * @param string    $smtpHost Servidor SMTP (vacío = usar mail() nativo del hosting)
 * @param int       $smtpPort Puerto SMTP
 * @param string    $smtpUser Usuario SMTP (vacío = sin autenticación)
 * @param string    $smtpPass Contraseña SMTP
 */
function configure_mailer(PHPMailer $mail, string $smtpHost, int $smtpPort, string $smtpUser, string $smtpPass): void
{
    if ($smtpHost === '') {
        // Sin SMTP configurado: usar el mail() nativo de PHP del hosting
        // (seguro en cPanel con remitente del dominio). Evita intentar
        // conectar a servidores de prueba tipo Mailtrap en producción.
        if ($smtpUser !== '' || $smtpPass !== '') {
            // Hay credenciales pero no host: probablemente mala config.
            error_log('TechShop: SMTP_USER/SMTP_PASS definidos pero SMTP_HOST vacío — usando mail() nativo. Revisa la configuración en el panel.');
        }
        $mail->isMail();
        return;
    }

    $mail->isSMTP();
    $mail->Host       = $smtpHost;
    $mail->Port       = $smtpPort;
    // Auth solo si hay usuario configurado (algunos hosts no requieren).
    if ($smtpUser !== '') {
        $mail->SMTPAuth = true;
        $mail->Username = $smtpUser;
        $mail->Password = $smtpPass;
    }
    // Según el puerto se usa TLS o SMTPS (buena práctica: TLS en 587, SMTPS en 465).
    if ($mail->Port == 465) {
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    } elseif ($mail->Port == 587) {
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    }
}

/**
 * Envia un correo electrónico usando la configuración global.
 * 
 * @param string $to Email de destino
 * @param string $subject Asunto del correo
 * @param string $body Cuerpo del correo (HTML soportado)
 * @param string $altBody Texto plano alternativo (Opcional)
 * @return bool True si se envió, False si hubo error
 */
function send_email($to, $subject, $body, $altBody = '') {
    $mail = new PHPMailer(true);

    try {
        // Configuracion del servidor
        $smtpHost = defined('SMTP_HOST') ? (string) SMTP_HOST : '';
        $smtpUser = defined('SMTP_USER') ? (string) SMTP_USER : '';
        $smtpPass = defined('SMTP_PASS') ? (string) SMTP_PASS : '';
        $smtpPort = defined('SMTP_PORT') ? (int) SMTP_PORT : 587;
        configure_mailer($mail, $smtpHost, $smtpPort, $smtpUser, $smtpPass);

        $mail->CharSet = 'UTF-8';
        $fromEmail = defined('TIENDA_EMAIL') ? TIENDA_EMAIL : 'ventas@techshop.pe';
        $fromName = defined('TIENDA_NOMBRE') ? TIENDA_NOMBRE : 'TechShop Perú';
        $mail->setFrom($fromEmail, $fromName);
        
        // Destinatarios
        $mail->addAddress($to);

        // Contenido
        $mail->isHTML(true);
        $mail->Subject = $subject;
        $mail->Body    = $body;
        $mail->AltBody = $altBody ?: strip_tags(str_replace(['<br>', '</p>'], ["\r\n", "\r\n\r\n"], $body));

        $mail->send();
        return true;
    } catch (Exception $e) {
        // Loggear error si es necesario
        error_log("Error al enviar correo a {$to}: {$mail->ErrorInfo}");
        return false;
    }
}

/**
 * Envía un correo de prueba con la configuración SMTP indicada.
 *
 * Acepta parámetros explícitos (en lugar de las constantes globales) para
 * poder probar valores recién guardados sin redefinir constantes ya definidas.
 *
 * @param string $to       Destinatario del correo de prueba
 * @param string $smtpHost Servidor SMTP (vacío = mail() nativo)
 * @param int    $smtpPort Puerto SMTP
 * @param string $smtpUser Usuario SMTP
 * @param string $smtpPass Contraseña SMTP
 * @return array{ok: bool, error: string} ok=true si se envió; error con detalle si falló
 */
function send_test_email(string $to, string $smtpHost = '', int $smtpPort = 587, string $smtpUser = '', string $smtpPass = ''): array
{
    $mail = new PHPMailer(true);

    try {
        configure_mailer($mail, $smtpHost, $smtpPort, $smtpUser, $smtpPass);

        $mail->CharSet = 'UTF-8';
        $fromEmail = defined('TIENDA_EMAIL') ? TIENDA_EMAIL : 'ventas@techshop.pe';
        $fromName  = defined('TIENDA_NOMBRE') ? TIENDA_NOMBRE : 'TechShop Perú';
        $mail->setFrom($fromEmail, $fromName);

        $mail->addAddress($to);
        $mail->isHTML(true);
        $mail->Subject = '🔔 Correo de prueba — TechShop Perú';
        $mail->Body = '
        <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e0e0e0; border-radius: 8px;">
            <h2 style="color: #2563eb; margin-top: 0;">✅ Correo de prueba</h2>
            <p>Si recibes este mensaje, la configuración de correo de <strong>' . htmlspecialchars($fromName, ENT_QUOTES, 'UTF-8') . '</strong> funciona correctamente.</p>
            <table style="width: 100%; border-collapse: collapse; margin: 16px 0;">
                <tr><td style="padding: 8px; border: 1px solid #e2e8f0;"><strong>Transporte</strong></td><td style="padding: 8px; border: 1px solid #e2e8f0;">' . ($smtpHost === '' ? 'mail() nativo del hosting' : 'SMTP: ' . htmlspecialchars($smtpHost, ENT_QUOTES, 'UTF-8') . ':' . (int) $smtpPort) . '</td></tr>
                <tr><td style="padding: 8px; border: 1px solid #e2e8f0;"><strong>Usuario</strong></td><td style="padding: 8px; border: 1px solid #e2e8f0;">' . htmlspecialchars($smtpUser !== '' ? $smtpUser : '(sin autenticación)', ENT_QUOTES, 'UTF-8') . '</td></tr>
                <tr><td style="padding: 8px; border: 1px solid #e2e8f0;"><strong>Fecha</strong></td><td style="padding: 8px; border: 1px solid #e2e8f0;">' . date('d/m/Y H:i') . '</td></tr>
            </table>
            <p style="color: #64748b; font-size: 13px;">Este correo fue enviado desde el panel de administración.</p>
        </div>';
        $mail->AltBody = 'Correo de prueba de ' . $fromName . '. Si recibes este mensaje, la configuración de correo funciona correctamente.';

        $mail->send();
        // Registrar el éxito también: el resultado del envío de prueba siempre
        // debe quedar en el log (antes solo se registraban los fallos).
        error_log("Correo de prueba enviado a {$to} (transporte: " . ($smtpHost === '' ? 'mail() nativo' : "SMTP {$smtpHost}:{$smtpPort}") . ')');
        return ['ok' => true, 'error' => ''];
    } catch (Exception $e) {
        $detail = $mail->ErrorInfo ?: $e->getMessage();
        error_log("Error al enviar correo de prueba a {$to}: {$detail}");
        return ['ok' => false, 'error' => $detail];
    }
}

/**
 * Genera y envía la plantilla de correo de confirmación de pedido.
 * 
 * @param int $pedido_id ID del pedido en la base de datos
 * @return bool
 */
function send_order_confirmation_email($pedido_id) {
    try {
        $db = db();
        $stmt = $db->prepare('SELECT p.*, u.email, CONCAT(u.nombres, COALESCE(CONCAT(" ", u.apellidos), "")) AS usuario_nombre FROM pedidos p JOIN usuarios u ON p.usuario_id = u.id WHERE p.id = ?');
        $stmt->execute([$pedido_id]);
        $pedido = $stmt->fetch();

        if (!$pedido) return false;

        $stmtDet = $db->prepare('SELECT * FROM detalles_pedido WHERE pedido_id = ?');
        $stmtDet->execute([$pedido_id]);
        $detalles = $stmtDet->fetchAll();

        $itemsHtml = '';
        foreach ($detalles as $det) {
            $itemsHtml .= '<tr>';
            $itemsHtml .= '<td style="padding: 8px; border-bottom: 1px solid #eee;">' . htmlspecialchars($det['nombre_producto']) . '</td>';
            $itemsHtml .= '<td style="padding: 8px; border-bottom: 1px solid #eee; text-align: center;">' . $det['cantidad'] . '</td>';
            $itemsHtml .= '<td style="padding: 8px; border-bottom: 1px solid #eee; text-align: right;">S/ ' . number_format($det['precio_unitario'], 2) . '</td>';
            $itemsHtml .= '<td style="padding: 8px; border-bottom: 1px solid #eee; text-align: right;">S/ ' . number_format($det['subtotal'], 2) . '</td>';
            $itemsHtml .= '</tr>';
        }

        $body = '
        <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e0e0e0; border-radius: 8px;">
            <h2 style="color: #4f46e5; text-align: center;">¡Gracias por tu compra en ' . htmlspecialchars(TIENDA_NOMBRE) . '!</h2>
            <p>Hola <strong>' . htmlspecialchars($pedido['usuario_nombre']) . '</strong>,</p>
            <p>Hemos recibido tu pedido <strong>#' . htmlspecialchars($pedido['numero_pedido']) . '</strong>. Tu pedido está en estado: <span style="font-weight:bold; color:#4f46e5;">' . strtoupper($pedido['estado']) . '</span>.</p>
            
            <h3 style="border-bottom: 2px solid #4f46e5; padding-bottom: 5px;">Resumen del Pedido</h3>
            <table style="width: 100%; border-collapse: collapse; margin-bottom: 20px;">
                <thead>
                    <tr style="background-color: #f8fafc; text-align: left;">
                        <th style="padding: 8px; border-bottom: 2px solid #ddd;">Producto</th>
                        <th style="padding: 8px; border-bottom: 2px solid #ddd; text-align: center;">Cant.</th>
                        <th style="padding: 8px; border-bottom: 2px solid #ddd; text-align: right;">Precio</th>
                        <th style="padding: 8px; border-bottom: 2px solid #ddd; text-align: right;">Total</th>
                    </tr>
                </thead>
                <tbody>
                    ' . $itemsHtml . '
                </tbody>
            </table>

            <div style="text-align: right; font-size: 14px; line-height: 1.6;">
                <p style="margin: 3px 0;">Subtotal: <strong>S/ ' . number_format($pedido['subtotal'], 2) . '</strong></p>
                ' . ($pedido['descuento'] > 0 ? '<p style="margin: 3px 0; color: #dc2626;">Descuento: <strong>-S/ ' . number_format($pedido['descuento'], 2) . '</strong></p>' : '') . '
                <p style="margin: 3px 0;">Envío: <strong>S/ ' . number_format($pedido['envio'], 2) . '</strong></p>
                <h3 style="margin: 10px 0 0 0; color: #1e293b;">Total Pagado: S/ ' . number_format($pedido['total'], 2) . '</h3>
            </div>

            <hr style="margin: 20px 0; border: none; border-top: 1px solid #eee;">
            <p style="font-size: 12px; color: #64748b; text-align: center;">Si tienes dudas sobre tu pedido, contáctanos a ' . htmlspecialchars(TIENDA_EMAIL) . ' o WhatsApp ' . htmlspecialchars(TIENDA_WHATSAPP) . '</p>
        </div>';

        return send_email($pedido['email'], 'Confirmación de Pedido #' . $pedido['numero_pedido'], $body);
    } catch (Exception $e) {
        error_log("Error al preparar correo de pedido: " . $e->getMessage());
        return false;
    }
}

/**
 * Envía notificación automática de reabastecimiento de stock a los usuarios suscritos.
 * 
 * @param int $producto_id ID del producto con nuevo stock
 * @return int Número de correos enviados con éxito
 */
function send_stock_alert_email($producto_id) {
    try {
        $db = db();

        // Verificar stock y datos del producto
        $stmtP = $db->prepare('SELECT id, nombre, slug, precio, precio_oferta, stock, imagen_principal FROM productos WHERE id = ? AND activo = 1 AND stock > 0');
        $stmtP->execute([$producto_id]);
        $producto = $stmtP->fetch();

        if (!$producto) return 0;

        // Obtener suscriptores no notificados
        $stmtS = $db->prepare('SELECT id, email FROM suscripciones_stock WHERE producto_id = ? AND notificado = 0');
        $stmtS->execute([$producto_id]);
        $suscriptores = $stmtS->fetchAll();

        if (empty($suscriptores)) return 0;

        $precioFinal = precio_final($producto);
        $urlProducto = BASE_URL . '/pages/detalle.php?slug=' . $producto['slug'];

        $enviados = 0;
        foreach ($suscriptores as $sub) {
            $body = '
            <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e0e0e0; border-radius: 8px; background-color: #ffffff;">
                <div style="text-align: center; margin-bottom: 20px;">
                    <h2 style="color: #2563eb; margin-bottom: 5px;">¡' . htmlspecialchars($producto['nombre']) . ' ya está disponible!</h2>
                    <p style="color: #64748b; font-size: 14px;">El producto que estabas esperando vuelve a tener stock en ' . htmlspecialchars(TIENDA_NOMBRE) . '.</p>
                </div>
                <div style="background-color: #f8fafc; padding: 15px; border-radius: 8px; text-align: center; margin-bottom: 20px;">
                    <h3 style="margin: 0 0 10px 0; color: #0f172a;">' . htmlspecialchars($producto['nombre']) . '</h3>
                    <p style="font-size: 20px; font-weight: bold; color: #2563eb; margin: 0 0 15px 0;">S/ ' . number_format($precioFinal, 2) . '</p>
                    <a href="' . $urlProducto . '" style="background-color: #2563eb; color: #ffffff; padding: 12px 24px; text-decoration: none; border-radius: 6px; font-weight: bold; display: inline-block;">Comprar Ahora</a>
                </div>
                <p style="font-size: 12px; color: #94a3b8; text-align: center;">Recibiste este correo porque solicitaste que te avisáramos cuando hubiera stock disponible en TechShop Perú.</p>
            </div>';

            if (send_email($sub['email'], '¡Stock disponible!: ' . $producto['nombre'], $body)) {
                $db->prepare('UPDATE suscripciones_stock SET notificado = 1 WHERE id = ?')->execute([$sub['id']]);
                $enviados++;
            }
        }
        return $enviados;
    } catch (Exception $e) {
        error_log("Error en send_stock_alert_email: " . $e->getMessage());
        return 0;
    }
}


