<?php
/**
 * Correo centralizado (PHPMailer) + bitácora de envíos.
 */
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once __DIR__ . '/../config.php';
require_once __DIR__ . '/../lib/PHPMailer/Exception.php';
require_once __DIR__ . '/../lib/PHPMailer/PHPMailer.php';
require_once __DIR__ . '/../lib/PHPMailer/SMTP.php';

/**
 * Correo de desarrollo: arma el mensaje completo (adjuntos e imágenes
 * incluidos) pero en vez de entregarlo al SMTP lo guarda como archivo .eml
 * en correos_locales/. Se abre con doble clic en cualquier cliente de correo.
 */
class MailerLocal extends PHPMailer {
    public function postSend() {
        $dir = __DIR__ . '/../correos_locales';
        if (!is_dir($dir)) {
            mkdir($dir, 0775, true);
        }
        $slug = preg_replace('/[^A-Za-z0-9]+/', '_', $this->Subject);
        $archivo = $dir . '/' . date('Ymd_His') . '_' . substr(trim($slug, '_'), 0, 50) . '.eml';
        file_put_contents($archivo, $this->MIMEHeader . $this->mailHeader . $this->MIMEBody);
        return true;
    }
}

function nuevoMailer() {
    $mail = MAIL_ENVIO_REAL ? new PHPMailer(true) : new MailerLocal(true);

    if (!MAIL_ENVIO_REAL) {
        $mail->CharSet = 'UTF-8';
        $mail->setFrom(SMTP_USER, SMTP_FROM_NAME);
        $mail->isHTML(true);
        return $mail;
    }

    $mail->isSMTP();
    $mail->Host       = SMTP_HOST;
    $mail->SMTPAuth   = true;
    $mail->Username   = SMTP_USER;
    $mail->Password   = SMTP_PASS;
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port       = SMTP_PORT;
    $mail->CharSet    = 'UTF-8';
    // Sin esto, si el servidor de correo no responde el formulario queda
    // colgado los 300 s que trae PHPMailer por defecto.
    $mail->Timeout    = 20;
    $mail->setFrom(SMTP_USER, SMTP_FROM_NAME);
    $mail->isHTML(true);
    return $mail;
}

/**
 * Plantilla HTML moderna para todos los correos del sistema.
 * $bloques: HTML ya armado para el cuerpo.
 */
function plantillaCorreo($titulo, $bloques, $subtitulo = '') {
    $anno = date('Y');
    $sub  = $subtitulo !== '' ? "<p style='margin:6px 0 0;font-size:14px;color:#c7d2fe'>$subtitulo</p>" : '';
    return "
    <!DOCTYPE html>
    <html lang='es'>
    <head><meta charset='UTF-8'></head>
    <body style='margin:0;padding:0;background:#eef2f7;font-family:Segoe UI,Arial,sans-serif;'>
      <div style='max-width:640px;margin:24px auto;background:#ffffff;border-radius:14px;overflow:hidden;
                  box-shadow:0 4px 18px rgba(15,23,42,.08);'>
        <div style='background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;padding:26px 30px'>
          <h1 style='margin:0;font-size:22px;letter-spacing:.3px'>$titulo</h1>
          $sub
        </div>
        <div style='padding:28px 30px;color:#1e293b;font-size:15px;line-height:1.6'>
          $bloques
        </div>
        <div style='background:#f8fafc;border-top:1px solid #e2e8f0;padding:16px 30px;
                    font-size:12px;color:#64748b'>
          Mensaje automático de <strong>" . APP_NOMBRE . "</strong> · " . CONDOMINIO_NOMBRE . " · $anno<br>
          Por favor no responder este correo.
        </div>
      </div>
    </body>
    </html>";
}

/** Fila etiqueta/valor para usar dentro de los correos. */
function filaDato($etiqueta, $valor) {
    return "<tr>
        <td style='padding:7px 12px;background:#f1f5f9;border-radius:6px 0 0 6px;font-weight:600;
                   white-space:nowrap;color:#475569;font-size:13px'>$etiqueta</td>
        <td style='padding:7px 12px;background:#f8fafc;border-radius:0 6px 6px 0;font-size:14px'>$valor</td>
    </tr><tr><td style='height:6px' colspan='2'></td></tr>";
}

/**
 * Registra el envío en la bitácora (tolerante a fallos:
 * si la tabla o el enum no calzan, no rompe el flujo).
 */
function registrarBitacora(mysqli $conn, $id_arrendatario, $email, $tipo, $asunto, $enviado_por = 'sistema') {
    try {
        /* Los avisos al propietario pueden ir a varios correos a la vez:
           recortamos para no pasarnos del largo de la columna. */
        $email  = mb_substr($email, 0, 150);
        $asunto = mb_substr($asunto, 0, 255);
        $stmt = $conn->prepare("INSERT INTO bitacora_correos
            (id_arrendatario, email_destino, tipo_correo, fecha_envio, asunto, enviado_por)
            VALUES (?, ?, ?, NOW(), ?, ?)");
        if ($stmt) {
            $stmt->bind_param('issss', $id_arrendatario, $email, $tipo, $asunto, $enviado_por);
            $stmt->execute();
        }
    } catch (Throwable $e) { /* la bitácora nunca debe frenar un correo */ }
}

/** ¿Ya se envió hoy un correo de este tipo a este arrendatario? (evita duplicados del cron) */
function correoYaEnviadoHoy(mysqli $conn, $id_arrendatario, $tipo) {
    $stmt = $conn->prepare("SELECT 1 FROM bitacora_correos
                            WHERE id_arrendatario = ? AND tipo_correo = ? AND DATE(fecha_envio) = CURDATE()
                            LIMIT 1");
    if (!$stmt) return false;
    $stmt->bind_param('is', $id_arrendatario, $tipo);
    $stmt->execute();
    return (bool)$stmt->get_result()->fetch_row();
}
