<?php
/**
 * ASISMA CRM - Helper de Correos
 *
 * Envia correos por la API central de mailing de ASISMA (mismo patron del OPS:
 * MailingService → POST con Bearer token, respuesta "SUCCESS").
 * Claves en config_sistema: MAILING_API_URL y MAILING_API_TOKEN.
 */
class CorreoHelper {

    /**
     * Envia un correo HTML. Devuelve array(success, detalle).
     */
    public static function enviar($destinatario, $asunto, $cuerpoHtml) {
        if (!filter_var($destinatario, FILTER_VALIDATE_EMAIL)) {
            return array('success' => false, 'detalle' => "Destinatario inválido: {$destinatario}");
        }

        $db  = Database::getInstance();
        $cfg = array('MAILING_API_URL' => '', 'MAILING_API_TOKEN' => '');
        $filas = $db->fetchAll("SELECT clave, valor FROM config_sistema WHERE clave IN ('MAILING_API_URL', 'MAILING_API_TOKEN')");
        foreach ($filas as $fila) $cfg[$fila['clave']] = trim($fila['valor']);

        if ($cfg['MAILING_API_URL'] === '' || $cfg['MAILING_API_TOKEN'] === '') {
            return array('success' => false, 'detalle' => 'API de correos no configurada (MAILING_API_URL / MAILING_API_TOKEN en config_sistema).');
        }

        // Plantilla caja (patron EmailHelper del OPS)
        $html = '<!DOCTYPE html><html><head><meta charset="UTF-8">'
            . '<style>body{font-family:Arial,sans-serif;font-size:14px;color:#333;}'
            . '.box{background:#f9f9f9;border:1px solid #ddd;border-radius:6px;padding:20px;max-width:640px;margin:20px auto;}'
            . '.titulo{font-size:18px;font-weight:bold;color:#1d4ed8;margin-bottom:12px;}'
            . '.footer{font-size:11px;color:#999;margin-top:20px;border-top:1px solid #eee;padding-top:8px;}'
            . '</style></head><body>'
            . '<div class="box">'
            . '<div class="titulo">ASISMA CRM</div>'
            . $cuerpoHtml
            . '<div class="footer">Mensaje generado automáticamente por ASISMA CRM. No responder.</div>'
            . '</div></body></html>';

        $ch = curl_init($cfg['MAILING_API_URL']);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $cfg['MAILING_API_TOKEN']));
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
            'destinatario' => $destinatario,
            'asunto'       => '=?UTF-8?B?' . base64_encode($asunto) . '?=',
            'cuerpo'       => $html,
            'cc'           => '',
            'bcc'          => '',
            'reply_to'     => ''
        )));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $respuesta = curl_exec($ch);
        $error     = curl_error($ch);
        $codigo    = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($error !== '') {
            return array('success' => false, 'detalle' => 'Error de red al enviar el correo: ' . $error);
        }
        if ($respuesta === 'SUCCESS') {
            return array('success' => true, 'detalle' => "Correo enviado a {$destinatario}.");
        }
        return array('success' => false, 'detalle' => 'La API de correos respondió (' . $codigo . '): ' . substr((string)$respuesta, 0, 200));
    }

    /**
     * Envia un correo HTML con archivos ADJUNTOS (multipart con CURLFile,
     * mismo formato del MailingService del OPS). $rutasAdjuntos = rutas
     * absolutas locales; las inexistentes se omiten en silencio.
     * Devuelve array(success, detalle).
     */
    public static function enviarConAdjuntos($destinatario, $asunto, $cuerpoHtml, $rutasAdjuntos = array()) {
        if (!filter_var($destinatario, FILTER_VALIDATE_EMAIL)) {
            return array('success' => false, 'detalle' => "Destinatario inválido: {$destinatario}");
        }

        $db  = Database::getInstance();
        $cfg = array('MAILING_API_URL' => '', 'MAILING_API_TOKEN' => '');
        $filas = $db->fetchAll("SELECT clave, valor FROM config_sistema WHERE clave IN ('MAILING_API_URL', 'MAILING_API_TOKEN')");
        foreach ($filas as $fila) $cfg[$fila['clave']] = trim($fila['valor']);

        if ($cfg['MAILING_API_URL'] === '' || $cfg['MAILING_API_TOKEN'] === '') {
            return array('success' => false, 'detalle' => 'API de correos no configurada (MAILING_API_URL / MAILING_API_TOKEN en config_sistema).');
        }

        $adjuntosValidos = array();
        foreach ((array)$rutasAdjuntos as $ruta) {
            $rutaReal = realpath($ruta);
            if ($rutaReal && file_exists($rutaReal)) $adjuntosValidos[] = $rutaReal;
        }

        $postData = array(
            'destinatario' => $destinatario,
            'asunto'       => '=?UTF-8?B?' . base64_encode($asunto) . '?=',
            'cuerpo'       => $cuerpoHtml,
            'cc'           => '',
            'bcc'          => '',
            'reply_to'     => ''
        );
        foreach ($adjuntosValidos as $i => $ruta) {
            $postData["adjuntos[$i]"] = new CURLFile($ruta);
        }

        $ch = curl_init($cfg['MAILING_API_URL']);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $cfg['MAILING_API_TOKEN']));
        curl_setopt($ch, CURLOPT_POST, true);
        // Con adjuntos el POST va multipart (array directo); sin adjuntos, urlencoded
        curl_setopt($ch, CURLOPT_POSTFIELDS, $adjuntosValidos ? $postData : http_build_query($postData));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $respuesta = curl_exec($ch);
        $error     = curl_error($ch);
        $codigo    = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($error !== '') {
            return array('success' => false, 'detalle' => 'Error de red al enviar el correo: ' . $error);
        }
        if ($respuesta === 'SUCCESS') {
            return array('success' => true, 'detalle' => "Correo enviado a {$destinatario}" . ($adjuntosValidos ? ' con ' . count($adjuntosValidos) . ' adjunto(s).' : '.'));
        }
        return array('success' => false, 'detalle' => 'La API de correos respondió (' . $codigo . '): ' . substr((string)$respuesta, 0, 200));
    }

    /**
     * Notifica a la MARCA la venta de sus productos: correo al contacto de la
     * marca con el detalle de lo que compro el lead. Registra la actividad en
     * el lead y TODO queda en auditoria (accion notificacion_marca).
     * Devuelve array(success, detalle).
     */
    public static function notificarVentaAMarca($cotizacionId) {
        $db = Database::getInstance();

        $cotiz = $db->fetchOne("SELECT * FROM cotizaciones WHERE id = :id", array('id' => (int)$cotizacionId));
        if (!$cotiz) return array('success' => false, 'detalle' => 'Cotización no encontrada.');

        $lead = $db->fetchOne(
            "SELECT l.*, e.nombre_fantasia AS empresa_nombre, e.razon_social AS empresa_razon, e.rut AS empresa_rut,
                    r.nombre AS region_nombre, ef.nombre_fantasia AS franquicia_nombre
             FROM leads l
             LEFT JOIN empresas e ON e.id = l.empresa_id
             LEFT JOIN regiones r ON r.id = l.region_id
             LEFT JOIN franquiciados f ON f.id = l.franquiciado_id
             LEFT JOIN empresas_franquiciados ef ON ef.id = f.empresa_madre_id
             WHERE l.id = :id",
            array('id' => (int)$cotiz['lead_id'])
        );
        if (!$lead) return array('success' => false, 'detalle' => 'Lead de la cotización no encontrado.');

        $marca = $lead['marca_interes']
            ? $db->fetchOne("SELECT id, nombre, contacto_nombre, contacto_email FROM marcas WHERE id = :id", array('id' => (int)$lead['marca_interes']))
            : null;

        $resultado = array('success' => false, 'detalle' => '');
        if (!$marca) {
            $resultado['detalle'] = 'El lead no tiene marca de interés; no hay a quién notificar la venta.';
        } elseif (empty($marca['contacto_email']) || !filter_var($marca['contacto_email'], FILTER_VALIDATE_EMAIL)) {
            $resultado['detalle'] = "La marca {$marca['nombre']} no tiene correo de contacto válido — completar en Catálogo → Marcas y reenviar.";
        } else {
            // Detalle de lo comprado desde los items de la cotizacion
            $items = json_decode($cotiz['productos_json'], true);
            $td = 'style="padding:6px 10px;font-size:12px;border:1px solid #e2e8f0;"';
            $th = 'style="padding:6px 10px;background:#f1f5f9;font-weight:bold;font-size:12px;text-align:left;border:1px solid #e2e8f0;"';
            $filasHtml = '';
            if (is_array($items)) {
                foreach ($items as $item) {
                    if (isset($item['clase']) && $item['clase'] === 'servicio_plan') {
                        // Plan de servicio contratado: pago inicial + mensualidad
                        $esUfPlan = isset($item['moneda']) && $item['moneda'] === 'UF';
                        $detallePlan = array();
                        if ($item['precio_inicial'] !== null) {
                            $detallePlan[] = 'inicial ' . ($esUfPlan ? 'UF ' . number_format((float)$item['precio_inicial'], 2, ',', '.') : '$' . number_format((float)$item['precio_inicial'], 0, ',', '.'));
                        }
                        if ($item['precio_mensual'] !== null) {
                            $detallePlan[] = 'mensual ' . ($esUfPlan ? 'UF ' . number_format((float)$item['precio_mensual'], 2, ',', '.') : '$' . number_format((float)$item['precio_mensual'], 0, ',', '.'));
                        }
                        $nombre = htmlspecialchars($item['plan_nombre'] . ' — ' . $item['servicio_nombre']);
                        $filasHtml .= "<tr><td {$td}>{$nombre} (servicio)</td><td {$td}>1</td><td {$td}>" . htmlspecialchars(implode(' / ', $detallePlan)) . "</td></tr>";
                        continue;
                    }
                    $nombre   = htmlspecialchars(isset($item['nombre']) ? $item['nombre'] : 'Producto');
                    $cantidad = isset($item['cantidad']) ? (int)$item['cantidad'] : 1;
                    $esUf     = isset($item['moneda']) && $item['moneda'] === 'UF';
                    $precio   = isset($item['precio']) ? (float)$item['precio'] : 0;
                    $precioTxt = $esUf ? 'UF ' . number_format($precio, 2, ',', '.') : '$' . number_format($precio, 0, ',', '.');
                    $suscripcion = !empty($item['es_suscripcion'])
                        ? ' (suscripción ' . htmlspecialchars(isset($item['periodo_suscripcion']) ? $item['periodo_suscripcion'] : '') . ')' : '';
                    $filasHtml .= "<tr><td {$td}>{$nombre}{$suscripcion}</td><td {$td}>{$cantidad}</td><td {$td}>{$precioTxt}</td></tr>";
                }
            }
            $folio = folio_cotizacion($cotiz);
            $saludo = $marca['contacto_nombre'] ? 'Estimado/a <b>' . htmlspecialchars($marca['contacto_nombre']) . '</b>,' : 'Estimado equipo,';
            $cuerpo = '<p>' . $saludo . '</p>'
                . '<p>Se concretó la venta de productos de la marca <b>' . htmlspecialchars($marca['nombre']) . '</b> a través de la red ASISMA:</p>'
                . '<table style="width:100%;border-collapse:collapse;font-size:13px;">'
                . '<tr><td ' . $th . ' width="35%">Cliente</td><td ' . $td . '>' . htmlspecialchars($lead['empresa_nombre'] ? $lead['empresa_nombre'] : $lead['empresa_razon']) . ' (' . htmlspecialchars($lead['empresa_rut']) . ')</td></tr>'
                . '<tr><td ' . $th . '>Región</td><td ' . $td . '>' . htmlspecialchars($lead['region_nombre'] ? $lead['region_nombre'] : '—') . '</td></tr>'
                . '<tr><td ' . $th . '>Vendido por</td><td ' . $td . '>' . htmlspecialchars($lead['franquicia_nombre'] ? $lead['franquicia_nombre'] : 'ASISMA') . '</td></tr>'
                . '<tr><td ' . $th . '>Cotización</td><td ' . $td . '>' . $folio . '</td></tr>'
                . '<tr><td ' . $th . '>Total pagado</td><td ' . $td . '><b>$' . number_format((float)$cotiz['total'], 0, ',', '.') . ' CLP</b></td></tr>'
                . '</table>'
                . '<h3 style="color:#1d4ed8;font-size:14px;margin:16px 0 6px;">Detalle de la compra</h3>'
                . '<table style="width:100%;border-collapse:collapse;">'
                . '<tr><th ' . $th . '>Producto</th><th ' . $th . '>Cantidad</th><th ' . $th . '>Precio</th></tr>'
                . $filasHtml
                . '</table>'
                . '<p style="margin-top:14px;font-size:12px;color:#64748b;">Aviso para coordinar abastecimiento y postventa con el franquiciado vendedor.</p>';

            $resultado = self::enviar(
                $marca['contacto_email'],
                'Nueva venta de ' . $marca['nombre'] . ' — ' . ($lead['empresa_nombre'] ? $lead['empresa_nombre'] : $lead['empresa_razon']),
                $cuerpo
            );
        }

        // Bitacora del lead + AUDITORIA siempre (enviado o fallido)
        $db->insert('actividades_crm', array(
            'lead_id'    => (int)$lead['id'],
            'usuario_id' => null,
            'tipo'       => 'sistema',
            'direccion'  => 'interna',
            'asunto'     => $resultado['success'] ? 'Venta notificada a la marca' : 'Notificación a la marca FALLÓ',
            'detalles'   => ($marca ? 'Marca ' . $marca['nombre'] . ': ' : '') . $resultado['detalle']
        ));
        AuditHelper::log('notificacion_marca', 'cotizaciones', (int)$cotiz['id'], null, array(
            'lead_id'      => (int)$lead['id'],
            'marca_id'     => $marca ? (int)$marca['id'] : null,
            'marca'        => $marca ? $marca['nombre'] : null,
            'destinatario' => $marca ? $marca['contacto_email'] : null,
            'enviado'      => $resultado['success'],
            'detalle'      => $resultado['detalle'],
            'total'        => (float)$cotiz['total']
        ));

        return $resultado;
    }
}
