<?php
// DEBUG: Desactivar reporte de errores en produccion para evitar JSON invalido
error_reporting(0);
ini_set('display_errors', 0);
header('Content-Type: application/json; charset=utf-8');

session_start();
require_once "../config/Conexion.php";
require_once "../modelos/SriService.php";
require_once "../modelos/Configuracion.php";

$idusuario = isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : (isset($_SESSION['idempleado']) ? $_SESSION['idempleado'] : 0);

// Definición de Clave Maestra 
define('MASTER_KEY_CERT', 'ClaveSeguraParaEncriptarCertificados2026!');

function encriptar_datos($data, $key)
{
    if (!$data)
        return '';
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
    return base64_encode($encrypted . '::' . $iv);
}

function desencriptar_datos($data, $key)
{
    if (!$data)
        return '';
    $parts = explode('::', base64_decode($data), 2);
    if (count($parts) < 2)
        return '';
    list($encrypted_data, $iv) = $parts;
    return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}

$op = isset($_GET['op']) ? $_GET['op'] : '';

switch ($op) {
    case 'verificar_estado_firma':
        $idempleado = isset($_SESSION['idempleado']) ? $_SESSION['idempleado'] : (isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : 0);
        $idusuario_alt = isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : 0;
        
        $sql = "SELECT * FROM certificados_medicos WHERE (idempleado='$idempleado' OR idempleado='$idusuario_alt') AND estado='activo' LIMIT 1";
        $config = ejecutarConsultaSimpleFila($sql);

        if ($config) {
            echo json_encode(['success' => true, 'existe' => true, 'ruc' => '']); 
        } else {
            // Fallback a sri_emisor legado
            $sqlLegacy = "SELECT ruc, ruta_certificado FROM sri_emisor WHERE idusuario='$idusuario_alt' OR idusuario='$idempleado'";
            $legacy = ejecutarConsultaSimpleFila($sqlLegacy);
             if ($legacy) {
                echo json_encode(['success' => true, 'existe' => true, 'ruc' => $legacy['ruc']]);
            } else {
                echo json_encode(['success' => true, 'existe' => false]);
            }
        }
        break;

    case 'eliminar_firma':
        // AHORA SOLO DESACTIVA EN CERTIFICADOS MEDICOS O BORRA DE LEGACY
        $idempleado = isset($_SESSION['idempleado']) ? $_SESSION['idempleado'] : (isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : 0);
        
        // 1. Desactivar en tabla principal
        $sqlUpdate = "UPDATE certificados_medicos SET estado='inactivo' WHERE idempleado='$idempleado'";
        ejecutarConsulta($sqlUpdate);

        // 2. Borrar de legacy si existe
        $sql = "DELETE FROM sri_emisor WHERE idusuario='$idusuario'";
        ejecutarConsulta($sql);
        
        echo json_encode(['success' => true, 'message' => 'Firma eliminada/desactivada correctamente']);
        break;

    case 'guardar_firma':
        // Operación exclusiva para guardar la firma sin emitir
        $ruc_emisor = isset($_POST['ruc_emisor']) ? limpiarCadena($_POST['ruc_emisor']) : '';
        $password = isset($_POST['password']) ? $_POST['password'] : '';

        if (empty($ruc_emisor)) {
            echo json_encode(['success' => false, 'message' => 'RUC del Emisor es requerido']);
            exit;
        }

        if (isset($_FILES['archivo_certificado']) && $_FILES['archivo_certificado']['error'] == UPLOAD_ERR_OK) {
            $archivo = $_FILES['archivo_certificado'];

            if (empty($password)) {
                echo json_encode(['success' => false, 'message' => 'Contraseña requerida al subir nuevo certificado']);
                exit;
            }

            // Validar extensión
            $ext = pathinfo($archivo['name'], PATHINFO_EXTENSION);
            if (strtolower($ext) != 'p12') {
                echo json_encode(['success' => false, 'message' => 'Solo se permiten archivos .p12']);
                exit;
            }

            // Validar credenciales
            $pkcs12 = file_get_contents($archivo['tmp_name']);
            if (!openssl_pkcs12_read($pkcs12, $certs, $password)) {
                echo json_encode(['success' => false, 'message' => 'Certificado inválido o contraseña incorrecta']);
                exit;
            }

            // Guardar Físicamente
            $nombreArchivo = 'sri_cert_' . $idusuario . '_' . time() . '.p12';
            $rutaBase = __DIR__ . '/../files/certificados_sri/';
            if (!file_exists($rutaBase))
                mkdir($rutaBase, 0755, true);

            $rutaFisica = $rutaBase . $nombreArchivo;
            if (move_uploaded_file($archivo['tmp_name'], $rutaFisica)) {
                $rutaCertificado = realpath($rutaFisica);
                // FIX: Normalizar separadores para Windows (evitar problemas de escape en SQL y file_exists)
                $rutaCertificado = str_replace('\\', '/', $rutaCertificado);

                $passEnc = encriptar_datos($password, MASTER_KEY_CERT);

                // Insertar/Actualizar
                $sqlInsert = "INSERT INTO sri_emisor (idusuario, ruc, ruta_certificado, clave_certificado, ambiente) 
                              VALUES ('$idusuario', '$ruc_emisor', '$rutaCertificado', '$passEnc', '2')
                              ON DUPLICATE KEY UPDATE 
                              ruta_certificado = VALUES(ruta_certificado), 
                              clave_certificado = VALUES(clave_certificado),
                              ruc = VALUES(ruc)";
                ejecutarConsulta($sqlInsert);

                echo json_encode(['success' => true, 'message' => 'Firma guardada correctamente']);
            } else {
                echo json_encode(['success' => false, 'message' => 'Error al mover archivo']);
            }
        } else {
            echo json_encode(['success' => false, 'message' => 'No se ha seleccionado ningún archivo .p12']);
        }
        break;

    case 'emitir':
        $password = isset($_POST['password']) ? $_POST['password'] : '';
        $ruc_emisor = isset($_POST['ruc_emisor']) ? limpiarCadena($_POST['ruc_emisor']) : '';
        $ambiente = '2'; // Producción por defecto

        // Validar datos básicos
        if (empty($password)) {
            echo json_encode(['success' => false, 'message' => 'Contraseña del certificado requerida']);
            exit;
        }

        if (empty($ruc_emisor)) {
            echo json_encode(['success' => false, 'message' => 'RUC del emisor requerido']);
            exit;
        }

        // IMPORTANTE: Usar la misma lógica de ID que gestion_certificados.php
        // 1. BUSQUEDA DE CERTIFICADO (Lógica Robusta v3.1 - Unificada con Recetas)
        $idempleado = isset($_SESSION['idempleado']) ? $_SESSION['idempleado'] : (isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : 0);
        $idusuario_alt = isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : 0;

        $sqlCert = "SELECT * FROM certificados_medicos WHERE (idempleado='$idempleado' OR idempleado='$idusuario_alt') AND estado='activo' LIMIT 1";
        $certData = ejecutarConsultaSimpleFila($sqlCert);

        if (!$certData) {
            echo json_encode(['success' => false, 'message' => 'No tiene un certificado digital configurado. Vaya a Firma Digital y súbalo.']);
            exit;
        }

        $rutaBD = $certData['ruta_certificado'];
        $idCertUser = $certData['idempleado'];
        $rutaCertificadoEncriptado = '';

        // === LÓGICA DE RECUPERACIÓN NUCLEAR DE RUTA (Estilo Recetas) ===
        if (strpos($rutaBD, '../') === 0 || strpos($rutaBD, './') === 0) {
            $rutaCertificadoEncriptado = realpath(__DIR__ . '/' . $rutaBD);
        } elseif (substr($rutaBD, 0, 1) == '/' || preg_match('/^[a-zA-Z]:/', $rutaBD)) {
            $rutaCertificadoEncriptado = $rutaBD;
        } else {
            $rutaCertificadoEncriptado = realpath(__DIR__ . '/../' . $rutaBD);
        }

        // Fallback: Por Nombre en carpeta estándar
        if (!$rutaCertificadoEncriptado || !file_exists($rutaCertificadoEncriptado)) {
            $nombreSolo = basename($rutaBD);
            $rutaCertificadoEncriptado = dirname(__DIR__) . '/files/certificados_encriptados/' . $nombreSolo;
        }

        // Fallback: Glob Search
        if (!file_exists($rutaCertificadoEncriptado)) {
            $patron = dirname(__DIR__) . '/files/certificados_encriptados/cert_' . $idCertUser . '_*.p12.enc';
            $archivos = glob($patron);
            if ($archivos && count($archivos) > 0) {
                usort($archivos, function ($a, $b) { return filemtime($b) - filemtime($a); });
                $rutaCertificadoEncriptado = $archivos[0];
            }
        }

        if (!file_exists($rutaCertificadoEncriptado)) {
            echo json_encode(['success' => false, 'message' => "CERTIFICADO PERDIDO. El archivo físico no existe. Por favor, vuelva a subirlo en Firma Digital."]);
            exit;
        }

        // Desencriptar el certificado temporalmente
        require_once "../modelos/FirmadorPDF.php";
        $firmador = new FirmadorPDF();

        // Crear archivo temporal para el certificado desencriptado
        $tempCertPath = sys_get_temp_dir() . '/cert_temp_' . $idempleado . '_' . time() . '.p12';

        if (!$firmador->desencriptarCertificado($rutaCertificadoEncriptado, $tempCertPath, MASTER_KEY_CERT)) {
            echo json_encode(['success' => false, 'message' => 'Error al desencriptar el certificado']);
            exit;
        }

        // Validar que la contraseña sea correcta
        $pkcs12 = file_get_contents($tempCertPath);
        if (!openssl_pkcs12_read($pkcs12, $certs, $password)) {
            // Eliminar archivo temporal
            if (file_exists($tempCertPath)) {
                unlink($tempCertPath);
            }
            echo json_encode(['success' => false, 'message' => 'Contraseña del certificado incorrecta']);
            exit;
        }

        // Usar el certificado temporal para firmar
        $rutaCertificado = $tempCertPath;

        // --- PROCESO DE EMISION (Idéntico a lógica previa, limpio) ---
        if (!isset($_POST['items'])) {
            echo json_encode(['success' => false, 'message' => 'No hay items en la factura']);
            exit;
        }

        $items = json_decode($_POST['items'], true);
        $totalSinImpuestos = 0;
        $totalIva12 = 0;
        $totalIva15 = 0;
        $detallesProcesados = [];

        foreach ($items as $it) {
            $cantidad = floatval($it['cantidad']);
            $precioUnitario = floatval($it['precio']);
            $impuestoPorcentaje = intval($it['impuesto']);
            $subtotalInd = $cantidad * $precioUnitario;
            $totalSinImpuestos += $subtotalInd;

            $codigoPorcentaje = '0';
            $valorImpuestoInd = 0;

            if ($impuestoPorcentaje == 12) {
                $codigoPorcentaje = '2';
                $valorImpuestoInd = $subtotalInd * 0.12;
                $totalIva12 += $valorImpuestoInd;
            } elseif ($impuestoPorcentaje == 15) {
                $codigoPorcentaje = '4';
                $valorImpuestoInd = $subtotalInd * 0.15;
                $totalIva15 += $valorImpuestoInd;
            }

            $detallesProcesados[] = [
                'codigo' => $it['codigo'],
                'descripcion' => $it['descripcion'],
                'cantidad' => $cantidad,
                'precioUnitario' => $precioUnitario,
                'descuento' => 0,
                'totalSinImpuesto' => $subtotalInd,
                'impuestos' => [
                    [
                        'codigo' => '2', // IVA
                        'codigoPorcentaje' => $codigoPorcentaje,
                        'tarifa' => $impuestoPorcentaje,
                        'baseImponible' => $subtotalInd,
                        'valor' => $valorImpuestoInd
                    ]
                ]
            ];
        }

        $importeTotal = $totalSinImpuestos + $totalIva12 + $totalIva15;

        // Obtener datos de configuración (Dirección Real, RUC, Razon Social System)
        $config = new Configuracion();
        $rsptaConfig = $config->listar();
        $regConfig = $rsptaConfig->fetch_object();

        $direccionEmpresa = $regConfig ? $regConfig->direccion : 'Sin dirección registrada';
        $razonSocialEmpresa = $regConfig ? $regConfig->razon_social : 'RAZON SOCIAL NO CONFIGURADA';
        $rucEmpresa = $regConfig ? $regConfig->ruc : '9999999999999';

        $datosFactura = [
            'infoTributaria' => [
                'ambiente' => $ambiente,
                'tipoEmision' => '1',
                // USAR DATOS DEL EMISOR (DUENO DEL SISTEMA)
                'razonSocial' => $razonSocialEmpresa,
                'nombreComercial' => $razonSocialEmpresa,
                'ruc' => $rucEmpresa,
                'codDoc' => '01',
                'estab' => '001',
                'ptoEmi' => '001',
                'secuencial' => str_pad(mt_rand(1, 999999), 9, '0', STR_PAD_LEFT),
                'dirMatriz' => $direccionEmpresa,
            ],
            'infoFactura' => [
                'fechaEmision' => date('d/m/Y'),
                'dirEstablecimiento' => $direccionEmpresa,
                'obligadoContabilidad' => 'NO',
                'tipoIdentificacionComprador' => (function($id) {
                    if ($id == '9999999999999') return '07';
                    if (strlen($id) == 13) return '04';
                    if (strlen($id) == 10) return '05';
                    return '06'; // Pasaporte o identificación exterior como fallback
                })($_POST['ruc_cliente']),
                'razonSocialComprador' => $_POST['razon_social'],
                'identificacionComprador' => $_POST['ruc_cliente'],
                'emailComprador' => isset($_POST['email_cliente']) && !empty($_POST['email_cliente']) ? $_POST['email_cliente'] : null,
                'totalSinImpuestos' => number_format($totalSinImpuestos, 2, '.', ''),
                'totalDescuento' => '0.00',
                'totalConImpuestos' => [],
                'propina' => '0.00',
                'importeTotal' => number_format($importeTotal, 2, '.', ''),
                'moneda' => 'DOLAR',
                'pagos' => [
                    [
                        'formaPago' => '01',
                        'total' => number_format($importeTotal, 2, '.', ''),
                        'plazo' => '0',
                        'unidadTiempo' => 'DIAS'
                    ]
                ]
            ],
            'detalles' => $detallesProcesados,
            'infoAdicional' => []
        ];

        // Calcular bases imponibles por tarifa de IVA
        $baseIva0 = 0;
        $baseIva12 = 0;
        $baseIva15 = 0;

        foreach ($items as $it) {
            $cantidad = floatval($it['cantidad']);
            $precioUnitario = floatval($it['precio']);
            $impuestoPorcentaje = intval($it['impuesto']);
            $subtotalInd = $cantidad * $precioUnitario;

            if ($impuestoPorcentaje == 0) {
                $baseIva0 += $subtotalInd;
            } elseif ($impuestoPorcentaje == 12) {
                $baseIva12 += $subtotalInd;
            } elseif ($impuestoPorcentaje == 15) {
                $baseIva15 += $subtotalInd;
            }
        }

        // Rellenar totalConImpuestos array (CORREGIDO: usar IF separados, no ELSE IF)
        if ($baseIva0 > 0) {
            $datosFactura['infoFactura']['totalConImpuestos'][] = [
                'codigo' => '2',
                'codigoPorcentaje' => '0',
                'baseImponible' => number_format($baseIva0, 2, '.', ''),
                'valor' => '0.00'
            ];
        }

        if ($baseIva12 > 0) {
            $datosFactura['infoFactura']['totalConImpuestos'][] = [
                'codigo' => '2',
                'codigoPorcentaje' => '2',
                'baseImponible' => number_format($baseIva12, 2, '.', ''),
                'valor' => number_format($baseIva12 * 0.12, 2, '.', '')
            ];
        }

        if ($baseIva15 > 0) {
            $datosFactura['infoFactura']['totalConImpuestos'][] = [
                'codigo' => '2',
                'codigoPorcentaje' => '4',
                'baseImponible' => number_format($baseIva15, 2, '.', ''),
                'valor' => number_format($baseIva15 * 0.15, 2, '.', '')
            ];
        }

        // Si no hay ningún impuesto, agregar tarifa 0
        if (empty($datosFactura['infoFactura']['totalConImpuestos'])) {
            $datosFactura['infoFactura']['totalConImpuestos'][] = [
                'codigo' => '2',
                'codigoPorcentaje' => '0',
                'baseImponible' => number_format($totalSinImpuestos, 2, '.', ''),
                'valor' => '0.00'
            ];
        }

        try {
            require_once "../modelos/SriGateway.php";
            $sri = new SriGateway($ambiente);

            // 1. Preparar Servicio (usando el SriService existente para XML)
            $sriService = new SriService($ambiente, $rutaCertificado, $password);
            
            // 2. Generar Clave de Acceso (CRUCIAL: Debe estar en infoTributaria antes de construir XML)
            $datosFactura['infoTributaria']['fechaEmision'] = date('dmY');
            $claveAcceso = $sriService->generarClaveAcceso($datosFactura);
            $datosFactura['infoTributaria']['claveAcceso'] = $claveAcceso;
            
            // 3. Generar XML crudo
            $xmlCrudo = $sriService->construirXmlFactura($datosFactura);
            
            // 4. Firmar
            require_once "../modelos/XmlSigner.php";
            $signer = new XmlSigner();
            $xmlFirmado = $signer->firmarXml($xmlCrudo, $rutaCertificado, $password);
            
            // 5. Procesar con el Gateway
            // FIX: Guardar XML firmado localmente para que el RIDE pueda generarse aunque el SRI tarde
            $rutaXmlFirmado = __DIR__ . '/../files/sri/firmados/' . $claveAcceso . '.xml';
            if (!file_exists(dirname($rutaXmlFirmado))) {
                mkdir(dirname($rutaXmlFirmado), 0755, true);
            }
            file_put_contents($rutaXmlFirmado, $xmlFirmado);

            $resultado = $sri->procesarComprobante($xmlFirmado, $claveAcceso);

            // Guardar en BD (facturas_sri)
            $estadoDb = 'GENERADO';
            if ($resultado['success']) {
                if ($resultado['estado'] == 'AUTORIZADO') {
                    $estadoDb = 'AUTORIZADO';
                } else {
                    $estadoDb = 'EN_PROCESO';
                }
            } else {
                if ($resultado['estado'] == 'NO AUTORIZADO') {
                    $estadoDb = 'NO AUTORIZADO';
                } else {
                    $estadoDb = 'ERROR_ENVIO';
                }
            }

            // INSERTAR EN BD
            $fechaEmision = date('Y-m-d');
            $mensajeSri = isset($resultado['message']) ? $resultado['message'] : (isset($resultado['estado']) ? $resultado['estado'] : '');

            $sqlCheck = "SELECT idfactura_sri FROM facturas_sri WHERE clave_acceso='$claveAcceso'";
            $existe = ejecutarConsultaSimpleFila($sqlCheck);
            
            $emailCliente = isset($_POST['email_cliente']) && !empty($_POST['email_cliente']) ? limpiarCadena($_POST['email_cliente']) : null;
            $nombreCliente = isset($_POST['razon_social']) ? limpiarCadena($_POST['razon_social']) : 'CONSUMIDOR FINAL';
            $rucClienteGuardar = isset($_POST['ruc_cliente']) ? limpiarCadena($_POST['ruc_cliente']) : '9999999999999';

            if (!$existe) {
                $sqlInsert = "INSERT INTO facturas_sri (clave_acceso, ruc_emisor, nombre_cliente, ruc_cliente, email_cliente, total_factura, fecha_emision, ambiente, estado_sri, mensaje_sri) 
                              VALUES ('$claveAcceso', '$ruc_emisor', '$nombreCliente', '$rucClienteGuardar', " . ($emailCliente ? "'$emailCliente'" : "NULL") . ", '$importeTotal', '$fechaEmision', '$ambiente', '$estadoDb', '$mensajeSri')";
                ejecutarConsulta($sqlInsert);
            } else {
                $sqlUpdate = "UPDATE facturas_sri SET estado_sri='$estadoDb', mensaje_sri='$mensajeSri' WHERE clave_acceso='$claveAcceso'";
                ejecutarConsulta($sqlUpdate);
            }

            if ($resultado['success'] && $resultado['estado'] === 'AUTORIZADO') {
                echo json_encode([
                    'success' => true,
                    'claveAcceso' => $claveAcceso,
                    'mensaje' => "✅ FACTURA AUTORIZADA REALMENTE.\nNúmero: " . $resultado['numeroAutorizacion'] . "\nFecha: " . $resultado['fechaAutorizacion']
                ]);
            } else {
                $prefijo = ($resultado['estado'] === 'TIEMPO_EXCEDIDO') ? "✅ SRI Respuesta: " : "❌ SRI Respuesta: ";
                echo json_encode([
                    'success' => false,
                    'message' => $prefijo . (isset($resultado['message']) ? $resultado['message'] : $resultado['estado']),
                    'detalle' => $resultado
                ]);
            }

        } catch (Exception $e) {
            // Limpiar archivo temporal si existe
            if (isset($tempCertPath) && file_exists($tempCertPath)) {
                unlink($tempCertPath);
            }
            echo json_encode(['success' => false, 'message' => 'Excepción del Sistema: ' . $e->getMessage()]);
        }

        // Limpiar archivo temporal al final (por si acaso)
        if (isset($tempCertPath) && file_exists($tempCertPath)) {
            unlink($tempCertPath);
        }
        break;

    case 'listar':
        // Listar facturas
        $sql = "SELECT * FROM facturas_sri ORDER BY idfactura_sri DESC";
        $rspta = ejecutarConsulta($sql);
        $data = [];

        while ($reg = $rspta->fetch_object()) {
            $estadoBadget = '';
            if ($reg->estado_sri == 'ANULADO') {
                $estadoBadget = '<span class="label label-danger">ANULADO</span>';
            } else {
                $estadoBadget = '<span class="label label-success">ENVIADO A SRI</span>';
            }

            // Botones
            $botones = '';
            // Ver RIDE (Mostrar siempre si existe clave de acceso)
            if (!empty($reg->clave_acceso)) {
                $botones .= '<a href="../ajax/generar_ride.php?claveAcceso=' . $reg->clave_acceso . '" target="_blank" class="btn btn-warning btn-xs" title="Ver PDF"><i class="fa fa-file-pdf-o"></i> RIDE</a> ';
            }

            // Obtener total de la factura (si existe en BD)
            $total = isset($reg->total_factura) && $reg->total_factura > 0 ? number_format($reg->total_factura, 2) : '0.00';

            // Obtener nombre del cliente (dinámico)
            $nombreCliente = isset($reg->nombre_cliente) && !empty($reg->nombre_cliente) ? $reg->nombre_cliente : 'Sin nombre';
            $rucClienteDisplay = isset($reg->ruc_cliente) && !empty($reg->ruc_cliente) ? $reg->ruc_cliente : $reg->ruc_emisor;

            $data[] = [
                "0" => $reg->fecha_emision,
                "1" => $nombreCliente,
                "2" => $rucClienteDisplay,
                "3" => $total,
                "4" => $estadoBadget,
                "5" => $reg->clave_acceso,
                "6" => $botones
            ];
        }

        $results = [
            "sEcho" => 1,
            "iTotalRecords" => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData" => $data
        ];
        echo json_encode($results, JSON_UNESCAPED_UNICODE);
        break;

    case 'consultar_estado':
        $claveAcceso = isset($_POST['claveAcceso']) ? $_POST['claveAcceso'] : '';
        if (empty($claveAcceso)) {
            echo json_encode(['success' => false, 'message' => 'Clave de acceso requerida']);
            exit;
        }

        // Recuperar info de BD para re-instanciar servicio si fuera necesario (fines de ambiente, etc)
        // Por simplicidad, asumimos ambiente prod o prueba basado en la clave o tabla
        $sqlFact = "SELECT * FROM facturas_sri WHERE clave_acceso='$claveAcceso'";
        $facturaDb = ejecutarConsultaSimpleFila($sqlFact);

        if (!$facturaDb) {
            echo json_encode(['success' => false, 'message' => 'Factura no encontrada localmente']);
            exit;
        }

        // Necesitamos credenciales para firmar? No, solo para consultar (Autorizacion) no requiere firma, 
        // pero SriService constructor pide rutaCert.
        // Recuperamos credenciales del usuario actual (USANDO TABLA CORRECTA: certificados_medicos)
        $idempleado = isset($_SESSION['idempleado']) ? $_SESSION['idempleado'] : (isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : 0);
        $sqlConfig = "SELECT * FROM certificados_medicos WHERE idempleado='$idempleado' AND estado='activo'";
        $configEmisor = ejecutarConsultaSimpleFila($sqlConfig);

        // Si no hay config, intentamos con valores dummy si SriService lo permite, o fallamos.
        // SriService requiere constructor válido.
        $rutaCert = '';
        $passCert = '';
        $ambiente = $facturaDb['ambiente'];

        if ($configEmisor) {
            $rutaCert = $configEmisor['ruta_certificado'];
            // Desencriptar la clave almacenada
            // NOTA: En certificados_medicos no guardamos la clave del certificado, solo el archivo encriptado.
            // Para consultar estado NO necesitamos firmar, asi que no necesitamos la clave real.
            // Pasamos vacio o dummy.
            $passCert = 'DUMMY_FOR_CHECK';
        }

        try {
            require_once "../modelos/SriGateway.php";
            $sri = new SriGateway($ambiente);
            $resAutorizacion = $sri->consultarAutorizacion($claveAcceso);

            $nuevoEstado = 'EN_PROCESO';
            $mensaje = '';

            if ($resAutorizacion['success'] && $resAutorizacion['estado'] === 'AUTORIZADO') {
                $nuevoEstado = 'AUTORIZADO';
                $mensaje = 'Factura Autorizada por el SRI el ' . $resAutorizacion['fechaAutorizacion'];
            } elseif ($resAutorizacion['estado'] === 'NO AUTORIZADO') {
                $nuevoEstado = 'NO AUTORIZADO';
                $mensaje = $resAutorizacion['message'];
            } else {
                // Si sigue en proceso, intentar re-enviar si tenemos el XML firmado
                $mensaje = "El SRI aún no procesa este documento o sigue en cola.";
                $rutaXmlFirmado = __DIR__ . '/../files/sri/firmados/' . $claveAcceso . '.xml';
                
                if (file_exists($rutaXmlFirmado)) {
                     $resRecepcion = $sri->enviarARecepcion(file_get_contents($rutaXmlFirmado));
                     if ($resRecepcion['success']) {
                         $mensaje = "Documento re-enviado a recepción. Verifique nuevamente en unos segundos.";
                     } else {
                         $mensaje = "Error al intentar re-enviar: " . $resRecepcion['message'];
                     }
                }
            }

            // Actualizar BD
            $sqlUpdate = "UPDATE facturas_sri SET estado_sri='$nuevoEstado', mensaje_sri='$mensaje' WHERE clave_acceso='$claveAcceso'";
            ejecutarConsulta($sqlUpdate);

            echo json_encode([
                'success' => true,
                'estado' => $nuevoEstado,
                'message' => $mensaje,
                'detalle' => $resAutorizacion
            ]);

        } catch (Exception $e) {
            echo json_encode(['success' => false, 'message' => $e->getMessage()]);
        }
        break;

    default:
        echo json_encode(['success' => false, 'message' => 'Operación no válida']);
        break;
}
?>