"""
app/utils/mailer.py – Envío de correos electrónicos con Flask-Mail.
Se usa principalmente al liberar un cambio a producción.
"""
import logging
from io import BytesIO
from flask import current_app, render_template_string
from flask_mail import Message

from app import mail

logger = logging.getLogger(__name__)

# Plantilla HTML del correo de liberación
PLANTILLA_LIBERACION = """
<!DOCTYPE html>
<html lang="es">
<head><meta charset="UTF-8"><title>Cambio Liberado</title></head>
<body style="font-family: Arial, sans-serif; color: #333; max-width: 700px; margin: auto;">
  <div style="background:#1565C0; color:white; padding:20px; text-align:center;">
    <h2>Control de Cambios – Notificación de Liberación</h2>
  </div>
  <div style="padding:20px;">
    <p>Se informa que el cambio <strong>#{{ cambio.id }}</strong> ha sido liberado a producción.</p>

    <h3 style="border-bottom:2px solid #1565C0; padding-bottom:5px;">Datos de la Solicitud</h3>
    <table style="width:100%; border-collapse:collapse;">
      <tr><td style="padding:6px; font-weight:bold; width:40%;">Sistema:</td>
          <td style="padding:6px;">{{ cambio.sistema.nombre }}</td></tr>
      <tr style="background:#f5f5f5;">
          <td style="padding:6px; font-weight:bold;">Solicitante:</td>
          <td style="padding:6px;">{{ cambio.solicitante.nombre_completo }} ({{ cambio.solicitante.correo }})</td></tr>
      <tr><td style="padding:6px; font-weight:bold;">Núm. Incidencia:</td>
          <td style="padding:6px;">{{ cambio.numero_incidencia }}</td></tr>
      <tr style="background:#f5f5f5;">
          <td style="padding:6px; font-weight:bold;">Descripción Breve:</td>
          <td style="padding:6px;">{{ cambio.descripcion_breve }}</td></tr>
      <tr><td style="padding:6px; font-weight:bold;">Fecha de Pruebas:</td>
          <td style="padding:6px;">{{ cambio.fecha_pruebas.strftime('%d/%m/%Y') }}</td></tr>
    </table>

    <h3 style="border-bottom:2px solid #1565C0; padding-bottom:5px; margin-top:20px;">Datos Técnicos</h3>
    <table style="width:100%; border-collapse:collapse;">
      <tr><td style="padding:6px; font-weight:bold; width:40%;">Desarrollador:</td>
          <td style="padding:6px;">{{ cambio.desarrollador.nombre_completo if cambio.desarrollador else '-' }}</td></tr>
      <tr style="background:#f5f5f5;">
          <td style="padding:6px; font-weight:bold;">Descripción Técnica:</td>
          <td style="padding:6px;">{{ cambio.descripcion_tecnica or '-' }}</td></tr>
      <tr><td style="padding:6px; font-weight:bold;">Fecha Propuesta Producción:</td>
          <td style="padding:6px;">{{ cambio.fecha_propuesta_produccion.strftime('%d/%m/%Y') if cambio.fecha_propuesta_produccion else '-' }}</td></tr>
    </table>

    <h3 style="border-bottom:2px solid #1565C0; padding-bottom:5px; margin-top:20px;">Datos de Liberación</h3>
    <table style="width:100%; border-collapse:collapse;">
      <tr><td style="padding:6px; font-weight:bold; width:40%;">Fecha Real de Aplicación:</td>
          <td style="padding:6px;">{{ cambio.fecha_real_aplicacion.strftime('%d/%m/%Y') if cambio.fecha_real_aplicacion else '-' }}</td></tr>
      <tr style="background:#f5f5f5;">
          <td style="padding:6px; font-weight:bold;">Usuario que Validó:</td>
          <td style="padding:6px;">{{ cambio.usuario_valido.nombre_completo if cambio.usuario_valido else '-' }}</td></tr>
      <tr><td style="padding:6px; font-weight:bold;">Estado del Cambio:</td>
          <td style="padding:6px; color: {{ '#4CAF50' if cambio.estado_cambio == 'Cambio Correcto' else '#f44336' }};">
              <strong>{{ cambio.estado_cambio or '-' }}</strong></td></tr>
      <tr style="background:#f5f5f5;">
          <td style="padding:6px; font-weight:bold;">Observaciones:</td>
          <td style="padding:6px;">{{ cambio.observaciones or '-' }}</td></tr>
      <tr><td style="padding:6px; font-weight:bold;">Administrador que Liberó:</td>
          <td style="padding:6px;">{{ cambio.admin_libero.nombre_completo if cambio.admin_libero else '-' }}</td></tr>
    </table>

    <div style="margin-top:20px; padding:10px; background:#E3F2FD; border-left:4px solid #1565C0;">
      <strong>Estatus final: LIBERADO</strong><br>
      Se adjunta el PDF completo del registro de cambio.
    </div>
  </div>
  <div style="background:#f5f5f5; padding:10px; text-align:center; font-size:12px; color:#777;">
    Sistema de Control de Cambios Empresariales – Mensaje generado automáticamente.
  </div>
</body>
</html>
"""


def enviar_correo_liberacion(cambio, pdf_buffer: BytesIO):
    """
    Envía el correo de notificación de liberación a producción.
    Incluye el PDF adjunto generado con ReportLab.
    Destinatarios: solicitante, desarrollador y administrador que liberó.
    Retorna (True, destinatarios_str) o (False, motivo_str).
    """
    try:
        destinatarios = []

        # Solicitante
        if cambio.solicitante and cambio.solicitante.correo:
            destinatarios.append(cambio.solicitante.correo)

        # Desarrollador (puede ser None)
        if cambio.desarrollador and cambio.desarrollador.correo:
            if cambio.desarrollador.correo not in destinatarios:
                destinatarios.append(cambio.desarrollador.correo)

        # Administrador que liberó
        if cambio.admin_libero and cambio.admin_libero.correo:
            if cambio.admin_libero.correo not in destinatarios:
                destinatarios.append(cambio.admin_libero.correo)

        if not destinatarios:
            motivo = 'ningún usuario involucrado tiene correo registrado en el sistema'
            logger.warning('Cambio #%s: sin destinatarios de correo.', cambio.id)
            return False, motivo

        asunto = (
            f'[Control de Cambios] Cambio #{cambio.id} liberado a producción'
            f' – {cambio.sistema.nombre}'
        )

        cuerpo_html = render_template_string(PLANTILLA_LIBERACION, cambio=cambio)

        msg = Message(
            subject=asunto,
            recipients=destinatarios,
            html=cuerpo_html,
        )

        # Adjuntar PDF
        pdf_buffer.seek(0)
        nombre_pdf = f'Cambio_{cambio.id}.pdf'
        msg.attach(nombre_pdf, 'application/pdf', pdf_buffer.read())

        mail.send(msg)
        lista = ', '.join(destinatarios)
        logger.info('Correo de liberación enviado para cambio #%s a: %s',
                    cambio.id, lista)
        return True, lista

    except Exception as exc:
        logger.error('Error al enviar correo para cambio #%s: %s', cambio.id, exc)
        return False, str(exc)
