<?php
header('Content-Type: application/json; charset=UTF-8');
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
set_time_limit(120);

$configCorreos = [
    'ventas@armandosoluciones.com.mx' => [
        'username'  => 'ventas@armandosoluciones.com.mx',
        'password'  => 'y3q_5urJiKjRUvyV',
        'nombre'    => 'Ventas Armando Soluciones',
        'protocolo' => 'imap',
        'host'      => 'mail.armandosoluciones.com.mx',
        'puerto'    => 993,
        'ssl'       => 'ssl'
    ],
];

function limpiarTexto(string $texto, int $maxLen = 254): string
{
    $texto = quoted_printable_decode($texto);
    $encoding = mb_detect_encoding($texto, ['UTF-8', 'ISO-8859-1', 'ASCII'], true);
    if ($encoding !== 'UTF-8') $texto = mb_convert_encoding($texto, 'UTF-8', $encoding ?: 'ISO-8859-1');
    $texto = preg_replace('/[^\PC\s]/u', '', $texto);
    $texto = iconv('UTF-8', 'UTF-8//IGNORE', $texto);
    if (mb_strlen($texto) > $maxLen) $texto = mb_substr($texto, 0, $maxLen);
    return trim($texto);
}

function obtenerCuerpoPlano($inbox, $email_number, $structure = null, $partNumber = '')
{
    if (!$structure) $structure = imap_fetchstructure($inbox, $email_number);

    if ($structure->type == 0 && strtoupper($structure->subtype) == 'PLAIN') {
        $body = imap_fetchbody($inbox, $email_number, $partNumber ?: "1");
        switch ($structure->encoding) {
            case 3: return base64_decode($body);
            case 4: return quoted_printable_decode($body);
            default: return $body;
        }
    } elseif ($structure->type == 1 && isset($structure->parts)) {
        foreach ($structure->parts as $index => $subStruct) {
            $subPartNumber = $partNumber ? "$partNumber." . ($index + 1) : (string)($index + 1);
            $result = obtenerCuerpoPlano($inbox, $email_number, $subStruct, $subPartNumber);
            if (!empty(trim($result))) return $result;
        }
    }

    return '';
}

function guardarAdjuntos($inbox, $email_number, $structure, $rutaGuardado = __DIR__ . '/uploads/')
{
    $adjuntosGuardados = [];
    if (!isset($structure->parts) || !is_array($structure->parts)) return [];

    foreach ($structure->parts as $index => $part) {
        $isAttachment = false;
        $filename = '';

        if (isset($part->disposition) && in_array(strtoupper($part->disposition), ['ATTACHMENT', 'INLINE'])) $isAttachment = true;

        if (isset($part->dparameters)) {
            foreach ($part->dparameters as $param) {
                if (strtolower($param->attribute) == 'filename') {
                    $filename = limpiarTexto($param->value);
                    $isAttachment = true;
                }
            }
        }

        if (isset($part->parameters)) {
            foreach ($part->parameters as $param) {
                if (strtolower($param->attribute) == 'name') {
                    $filename = limpiarTexto($param->value);
                    $isAttachment = true;
                }
            }
        }

        if ($isAttachment && $filename) {
            $body = imap_fetchbody($inbox, $email_number, $index + 1);
            switch ($part->encoding) {
                case 3: $body = base64_decode($body); break;
                case 4: $body = quoted_printable_decode($body); break;
            }

            if (!is_dir($rutaGuardado)) mkdir($rutaGuardado, 0777, true);

            $nombreSeguro = time() . '_' . preg_replace('/[^a-zA-Z0-9_\.\-]/', '_', basename($filename));
            $filePath = $rutaGuardado . $nombreSeguro;
            file_put_contents($filePath, $body);

            $adjuntosGuardados[] = ['nombre' => $nombreSeguro, 'ruta' => 'uploads/' . $nombreSeguro];
        }
    }

    return $adjuntosGuardados;
}

try {
    $pdo = new PDO("mysql:host=localhost;dbname=CORREOS;charset=utf8mb4", 'root', 'root', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
} catch (PDOException $e) {
    echo json_encode(['error' => 'Error conexión MySQL: ' . $e->getMessage()]);
    exit;
}

$insertados = 0;
$errores = [];
$debugCorreos = [];
$fechaHoyInicio = strtotime('today 00:00:00');
$fechaAhora = time();

foreach ($configCorreos as $correo => $credenciales) {
    $protocolo = strtolower($credenciales['protocolo'] ?? 'imap');
    $host   = $credenciales['host'];
    $puerto = $credenciales['puerto'];
    $ssl    = $credenciales['ssl'];
    $mailbox = "{{$host}:{$puerto}/{$protocolo}/{$ssl}/novalidate-cert}INBOX";

    $inbox = @imap_open($mailbox, $credenciales['username'], $credenciales['password']);
    if (!$inbox) {
        $errores[] = "No se pudo conectar a $correo: " . imap_last_error();
        continue;
    }

    $carpetas = imap_list($inbox, "{{$host}:{$puerto}/{$protocolo}/{$ssl}/novalidate-cert}", "*");
    foreach ($carpetas as $carpeta) {
        if (stripos($carpeta, 'INBOX') === false && stripos($carpeta, 'Sent') === false) continue;
        imap_reopen($inbox, $carpeta);

        $fechaHoyStr = date('d-M-Y');
        $emails = imap_search($inbox, 'SINCE "' . $fechaHoyStr . '"');
        if (!$emails) continue;

        rsort($emails);
        $emails = array_slice($emails, 0, 50);

        foreach ($emails as $email_number) {
            $header = @imap_headerinfo($inbox, $email_number);
            $structure = @imap_fetchstructure($inbox, $email_number);
            if (!$header || !$structure) continue;

            $fechaCorreoTimestamp = strtotime($header->date);
            if ($fechaCorreoTimestamp < $fechaHoyInicio || $fechaCorreoTimestamp > $fechaAhora) continue;

            $subject = imap_utf8($header->subject ?? '');
            $message_id = isset($header->message_id) ? limpiarTexto($header->message_id, 254) : null;
            if (!$message_id) continue;

            $stmtCheck = $pdo->prepare("SELECT COUNT(*) FROM CORREO WHERE MESSAGE_ID = ?");
            $stmtCheck->execute([$message_id]);
            if ($stmtCheck->fetchColumn() > 0) continue;

            $body = obtenerCuerpoPlano($inbox, $email_number, $structure);
            if (empty(trim($body)) && isset($structure->parts)) {
                foreach ($structure->parts as $index => $part) {
                    if (strtoupper($part->subtype ?? '') === 'HTML') {
                        $htmlBody = imap_fetchbody($inbox, $email_number, $index + 1);
                        if ($part->encoding == 3) $htmlBody = base64_decode($htmlBody);
                        elseif ($part->encoding == 4) $htmlBody = quoted_printable_decode($htmlBody);
                        $body = strip_tags($htmlBody);
                        break;
                    }
                }
            }

            $mensaje = limpiarTexto(strip_tags($body), 2000);
            $remitente = limpiarTexto($header->from[0]->mailbox . '@' . $header->from[0]->host, 100);
            $destinatario = isset($header->to[0]) ? limpiarTexto($header->to[0]->mailbox . '@' . $header->to[0]->host, 100) : '';
            $asunto = limpiarTexto($subject, 254);
            $fecha_envio = date('Y-m-d H:i:s', $fechaCorreoTimestamp);
            $estado = stripos($carpeta, 'Sent') !== false ? 'ENVIADO' : 'RECIBIDO';

            // Valores por defecto
            $asesor = 'Sin asignar';
            $firma  = 'Sin firma';
            $area = 'Sin area';
            $destacado = '0';

            try {
                // 1️⃣ Insertar el correo en la tabla CORREO
                $stmt = $pdo->prepare(
                    "INSERT INTO CORREO 
        (REMITENTE, DESTINATARIO, ASUNTO, MENSAJE, FECHA_ENVIO, ESTADO, MESSAGE_ID, ES_NUEVO, ASESOR, FIRMA, AREA, DESTACADO)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
                );
                $stmt->execute([
                    $remitente,
                    $destinatario,
                    $asunto,
                    $mensaje,
                    $fecha_envio,
                    $estado,
                    $message_id,
                    'S',       // ES_NUEVO
                    $asesor,
                    $firma,
                    $area,
                    $destacado
                ]);

                $idCorreoInsertado = $pdo->lastInsertId();
                $insertados++;

                // 2️⃣ Guardar adjuntos si existen
                $adjuntos = guardarAdjuntos($inbox, $email_number, $structure);
                if (!empty($adjuntos)) {
                    $nombresAdjuntos = implode(', ', array_column($adjuntos, 'nombre'));
                    $stmtUpdate = $pdo->prepare("UPDATE CORREO SET ADJUNTO = ? WHERE MESSAGE_ID = ?");
                    $stmtUpdate->execute([$nombresAdjuntos, $message_id]);
                }

                // 3️⃣ Insertar notificación en la tabla NOTIFICACION
                $areaNotificacion = $area ?? 'Sin area';
                $mensajeNotificacion = !empty($mensaje) ? $mensaje : 'Sin mensaje';

                $stmtNot = $pdo->prepare(
                    "INSERT INTO NOTIFICACION (ID_CORREO, REMITENTE, ASUNTO, FECHA_ENVIO, LEIDO, AREA, MENSAJE) 
                     VALUES (?, ?, ?, ?, ?, ?, ?)"
                );
                $stmtNot->execute([
                    $idCorreoInsertado,
                    $remitente,
                    $asunto,
                    $fecha_envio,
                    'N',
                    $areaNotificacion,
                    $mensajeNotificacion
                ]);

            } catch (PDOException $e) {
                $errores[] = "Error al insertar correo/notificación (Message-ID: $message_id): " . $e->getMessage();
            }
        }
    }

    imap_close($inbox);
}

echo json_encode([
    'success' => true,
    'insertados' => $insertados,
    'errores' => $errores,
    'debugCorreos' => $debugCorreos,
    'message' => "Proceso terminado, correos leídos desde " . count($configCorreos) . " cuentas."
]);  