<?php
// Iniciar buffer de saída
ob_start();
session_start();
// Configurar logs persistentes
ini_set('log_errors', 1);
ini_set('error_log', '/var/www/prn.laudocontrol.com.br/logs/php_errors.log');
// Verifica se o usuário está logado
if (!isset($_SESSION['usu_cod'])) {
    error_log("Usuário não logado, redirecionando para index.php");
    header("Location: index.php");
    exit;
}
// Forçar exibição de erros para depuração (remover em produção)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Array para armazenar logs do servidor
$serverLogs = [];
// Função para adicionar logs
function addLog(&$logs, $message) {
    $logs[] = $message;
    error_log(date('[Y-m-d H:i:s] ') . $message);
}
// Gerar token CSRF
if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// Obtém a conexão com o banco de dados
require_once 'db/conexao.php';
$pdo = getConexao();
if ($pdo === null) {
    addLog($serverLogs, "Erro: Não foi possível estabelecer conexão com o banco de dados.");
    ob_end_clean();
    echo '<div class="red-text text-center">Erro: Não foi possível conectar ao banco de dados. Tente novamente mais tarde.</div>';
    exit;
}
addLog($serverLogs, "Conexão com o banco de dados estabelecida com sucesso.");
// Buscar todas as unidades do sistema para select de rateio único
try {
    $stmt_todas_unidades = $pdo->prepare("SELECT uni_cod, uni_nome FROM public.unidades ORDER BY uni_nome");
    $stmt_todas_unidades->execute();
    $todasUnidades = $stmt_todas_unidades->fetchAll(PDO::FETCH_ASSOC);
    addLog($serverLogs, "Todas as unidades carregadas: " . count($todasUnidades) . " registros");
} catch (Exception $e) {
    addLog($serverLogs, "Erro ao carregar todas as unidades: " . $e->getMessage());
    // Tentar sem o schema public caso dê erro
    try {
        $stmt_todas_unidades = $pdo->prepare("SELECT uni_cod, uni_nome FROM unidades ORDER BY uni_nome");
        $stmt_todas_unidades->execute();
        $todasUnidades = $stmt_todas_unidades->fetchAll(PDO::FETCH_ASSOC);
        addLog($serverLogs, "Todas as unidades carregadas (sem schema): " . count($todasUnidades) . " registros");
    } catch (Exception $e2) {
        addLog($serverLogs, "Erro ao carregar unidades (tentativa 2): " . $e2->getMessage());
        $todasUnidades = [];
    }
}
// Verificar modo visualizar
$modoVisualizar = isset($_GET['modo']) && $_GET['modo'] === 'visualizar';
$fat_id = isset($_GET['fat_id']) ? filter_var($_GET['fat_id'], FILTER_VALIDATE_INT) : null;
$fatura = null;
$fat_val_int = 0;
$fat_desc = 0;
if ($modoVisualizar && $fat_id) {
    try {
        $stmt_fatura = $pdo->prepare("
            SELECT f.fat_id, f.fat_prest, LOWER(f.fat_tipo_prest) AS fat_tipo_prest, f.fat_val, f.fat_vcto, f.fat_ref, f.fat_status, f.fat_val_dig,
                   f.fat_val_int, f.fat_desc,
                   COALESCE(f2.for_nome, 'Desconhecido') AS profissional_nome
            FROM faturas_prest f
            LEFT JOIN fornecedores f2 ON f.fat_prest = f2.for_cod AND LOWER(f.fat_tipo_prest) = LOWER(f2.for_tipo)
            WHERE f.fat_id = ?
        ");
        $stmt_fatura->execute([$fat_id]);
        $fatura = $stmt_fatura->fetch(PDO::FETCH_ASSOC);
        if (!$fatura) {
            addLog($serverLogs, "Fatura não encontrada: fat_id=$fat_id");
            $mensagem = '<div class="red-text text-center">Fatura não encontrada. Verifique o código da fatura.</div>';
            $modoVisualizar = false;
        } else {
            addLog($serverLogs, "Fatura carregada: fat_id=$fat_id, tipo_prest=" . $fatura['fat_tipo_prest'] . ", profissional_nome=" . $fatura['profissional_nome'] . ", fat_prest=" . $fatura['fat_prest'] . ", fat_val_dig=" . $fatura['fat_val_dig']);
            $fat_val_int = $fatura['fat_val_int'] ?? $fatura['fat_val'];
            $fat_desc = $fatura['fat_desc'] ?? 0;
        }
    } catch (Exception $e) {
        addLog($serverLogs, "Erro ao carregar fatura: " . $e->getMessage());
        $mensagem = '<div class="red-text text-center">Erro ao carregar a fatura. Tente novamente mais tarde.</div>';
        $modoVisualizar = false;
    }
}
// Processamento da exclusão da fatura (mantido inalterado)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['excluir_fatura']) && $modoVisualizar && $fat_id) {
    addLog($serverLogs, "Requisição POST para exclusão da fatura recebida: fat_id=$fat_id");
    // Verificar token CSRF
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        addLog($serverLogs, "Erro: Token CSRF inválido para exclusão da fatura.");
        header('Content-Type: application/json');
        ob_end_clean();
        echo json_encode([
            'status' => 'error',
            'message' => 'Erro de segurança: Token inválido. Tente novamente.',
            'logs' => $serverLogs
        ]);
        exit;
    }
    // Forçar saída JSON
    header('Content-Type: application/json');
    $bufferContent = ob_get_contents();
    if (!empty($bufferContent)) {
        addLog($serverLogs, "Saída prévia detectada no buffer: " . $bufferContent);
    }
    ob_end_clean();
    try {
        $pdo->beginTransaction();
        addLog($serverLogs, "Iniciando transação para exclusão da fatura: fat_id=$fat_id");
        // Excluir rateios associados
        $stmt_delete_rateio = $pdo->prepare("DELETE FROM fat_prest_rateio WHERE rat_fat = ?");
        $stmt_delete_rateio->execute([$fat_id]);
        $rows_affected = $stmt_delete_rateio->rowCount();
        addLog($serverLogs, "Rateios excluídos para fatura $fat_id: $rows_affected linhas afetadas");
        // Excluir itens manuais associados à fatura
        $tipo = strtolower($fatura['fat_tipo_prest']);
        $campoFat = ($tipo === 'medico') ? 'ex_fat_med' : 'ex_fat_dig';
        $stmt_delete_itens_manuais = $pdo->prepare("DELETE FROM exames WHERE ex_item_manual = TRUE AND $campoFat = ?");
        if ($stmt_delete_itens_manuais === false) {
            throw new Exception('Erro na preparação da query de exclusão de itens manuais: ' . print_r($pdo->errorInfo(), true));
        }
        $stmt_delete_itens_manuais->execute([$fat_id]);
        addLog($serverLogs, "Itens manuais excluídos para fatura $fat_id: " . $stmt_delete_itens_manuais->rowCount() . " linhas afetadas");
        $stmtUpdate = $pdo->prepare(
            "UPDATE exames SET " . ($tipo === 'medico' ? 'ex_fat_med' : 'ex_fat_dig') . " = NULL WHERE " .
            ($tipo === 'medico' ? 'ex_fat_med' : 'ex_fat_dig') . " = ?"
        );
        if ($stmtUpdate === false) {
            throw new Exception('Erro na preparação da query de desfaturamento: ' . print_r($pdo->errorInfo(), true));
        }
        $success = $stmtUpdate->execute([$fat_id]);
        if ($success) {
            $rowsAffected = $stmtUpdate->rowCount();
            addLog($serverLogs, "Exames desfaturados para fatura $fat_id: $rowsAffected linhas afetadas");
        } else {
            throw new Exception('Erro na execução da query de desfaturamento: ' . print_r($stmtUpdate->errorInfo(), true));
        }
        $stmtDelete = $pdo->prepare("DELETE FROM faturas_prest WHERE fat_id = ?");
        if ($stmtDelete === false) {
            throw new Exception('Erro na preparação da query de exclusão: ' . print_r($pdo->errorInfo(), true));
        }
        $success = $stmtDelete->execute([$fat_id]);
        if ($success) {
            addLog($serverLogs, "Fatura excluída com sucesso: fat_id=$fat_id");
        } else {
            throw new Exception('Erro na execução da query de exclusão: ' . print_r($stmtDelete->errorInfo(), true));
        }
        $pdo->commit();
        addLog($serverLogs, "Transação concluída com sucesso para exclusão da fatura: fat_id=$fat_id");
        echo json_encode([
            'status' => 'success',
            'message' => 'Fatura excluída com sucesso!',
            'logs' => $serverLogs
        ]);
        exit;
    } catch (Exception $e) {
        $pdo->rollBack();
        addLog($serverLogs, "Erro na exclusão da fatura: " . $e->getMessage());
        echo json_encode([
            'status' => 'error',
            'message' => 'Erro ao excluir a fatura. Tente novamente mais tarde.',
            'logs' => $serverLogs
        ]);
        exit;
    }
}
$pageTitle = $modoVisualizar ? "Visualizar Fatura" : "Selecionar Exames";
// Verificar se os arquivos de layout existem
$headerPath = __DIR__ . '/layout/header.php';
$sidebarPath = __DIR__ . '/layout/sidebar.php';
if (!file_exists($headerPath)) {
    addLog($serverLogs, "Erro: Arquivo layout/header.php não encontrado.");
    ob_end_clean();
    echo '<div class="red-text text-center">Erro: Arquivo de cabeçalho não encontrado. Contate o suporte.</div>';
    exit;
}
if (!file_exists($sidebarPath)) {
    addLog($serverLogs, "Erro: Arquivo layout/sidebar.php não encontrado.");
    ob_end_clean();
    echo '<div class="red-text text-center">Erro: Arquivo de barra lateral não encontrado. Contate o suporte.</div>';
    exit;
}
include 'layout/header.php';
include 'layout/sidebar.php';
// Inicializa variáveis
$mensagem = '';
$exames = [];
$profissionalNome = '';
$labelProfissional = 'Profissional';
$unidades = [];
// $todasUnidades já foi carregado anteriormente no início do arquivo
$totalExames = 0;
$totalValor = 0;
$fat_val_dig = 0;
$totalValorLiquido = 0;
$fatVcto = $modoVisualizar ? '' : date('d/m/Y', strtotime('+1 day'));
$observacoes = '';
$unidades_summary = [];
$tipo = '';
$med_cod = '';
$dig_cod = '';
$dataInicio = '';
$dataFim = '';
$unidadeFiltro = '';
$contrato = trim(htmlspecialchars($_POST['contrato'] ?? '', ENT_QUOTES, 'UTF-8'));
$isDigitador = isset($_POST['is_digitador']) && $_POST['is_digitador'] === '1';
$aplicarDesconto = false; // Inicialmente falso
$descontoPercent = 0;
// Captura mensagens
if (isset($_GET['mensagem']) && $_GET['mensagem'] === 'success' && isset($_GET['fatCod'])) {
    $mensagem = '<div class="green-text text-center">Fatura concluída com sucesso! Código: ' . htmlspecialchars($_GET['fatCod']) . '</div>';
    unset($_SESSION['fatura_data']);
    addLog($serverLogs, "Mensagem de sucesso capturada: fatCod=" . $_GET['fatCod']);
} elseif (isset($_GET['mensagem']) && $_GET['mensagem'] === 'success' && isset($_GET['action']) && $_GET['action'] === 'deleted') {
    $mensagem = '<div class="green-text text-center">Fatura excluída com sucesso!</div>';
    unset($_SESSION['fatura_data']);
    addLog($serverLogs, "Mensagem de exclusão capturada");
} elseif (isset($_GET['mensagem']) && $_GET['mensagem'] === 'error' && isset($_GET['error'])) {
    $mensagem = '<div class="red-text text-center">Erro: ' . htmlspecialchars($_GET['error']) . '</div>';
    addLog($serverLogs, "Mensagem de erro capturada: " . $_GET['error']);
} elseif (isset($_SESSION['mensagem'])) {
    $mensagem = $_SESSION['mensagem'];
    unset($_SESSION['mensagem']);
    addLog($serverLogs, "Mensagem da sessão capturada: $mensagem");
}
// Configurar dados
if ($modoVisualizar && $fat_id && $fatura) {
    $tipo = strtolower($fatura['fat_tipo_prest']);
    $labelProfissional = $tipo === 'medico' ? 'Médico' : 'Digitador';
    $profissionalNome = $fatura['profissional_nome'];
    $totalValor = $fatura['fat_val_int'] ?? $fatura['fat_val'];
    $fat_val_dig = $fatura['fat_val_dig'] ?? 0; // Retrieve from database
    $fatVcto = date('d/m/Y', strtotime($fatura['fat_vcto']));
    $observacoes = $fatura['fat_ref'];
    $med_cod = $tipo === 'medico' ? $fatura['fat_prest'] : '';
    $dig_cod = $tipo === 'digitador' ? $fatura['fat_prest'] : '';
    $isDigitador = $fat_val_dig > 0; // Set based on database value
    $aplicarDesconto = $fat_desc > 0;
    $descontoPercent = $fat_desc;
    // Carregar exames associados
    try {
        $query = "
            SELECT e.ex_pk, e.ex_uni, e.ex_modalidade, e.ex_estudo, e.ex_prioridade, e.ex_status,
                   e.ex_data_ex, e.ex_data_concl, e.ex_qtde,
                   COALESCE(" . ($tipo === 'medico' ? 'e.ex_vl_med' : 'e.ex_vl_dig') . ", 0) AS ex_val,
                   f.for_nome AS profissional_nome,
                   u.uni_nome AS unidade_nome,
                   e.ex_paciente,
                   e.ex_isdig,
                   COALESCE(e.ex_vl_dig, 0) AS ex_vl_dig
            FROM exames e
            LEFT JOIN fornecedores f ON f.for_cod = ? AND LOWER(f.for_tipo) = ?
            LEFT JOIN unidades u ON u.uni_cod = e.ex_uni
            WHERE " . ($tipo === 'medico' ? 'e.ex_fat_med' : 'e.ex_fat_dig') . " = ?
        ";
        addLog($serverLogs, "Executando query de exames no modo visualizar: $query com params: " . json_encode([$fatura['fat_prest'], $tipo, $fat_id]));
        $stmt = $pdo->prepare($query);
        $stmt->execute([$fatura['fat_prest'], $tipo, $fat_id]);
        $exames = $stmt->fetchAll(PDO::FETCH_ASSOC);
        $totalExames = count($exames);
        $totalValor = array_sum(array_column($exames, 'ex_val'));
        $totalValorLiquido = $fatura['fat_val'];
        // Validar profissional_nome e unidade_nome, e garantir que campos NULL sejam strings vazias
        foreach ($exames as &$exame) {
            // Garantir que campos que podem ser NULL sejam strings vazias para evitar erros de depreciação
            $exame['unidade_nome'] = $exame['unidade_nome'] ?? '';
            $exame['ex_modalidade'] = $exame['ex_modalidade'] ?? '';
            $exame['ex_estudo'] = $exame['ex_estudo'] ?? '';
            $exame['ex_paciente'] = $exame['ex_paciente'] ?? '';
            $exame['ex_prioridade'] = $exame['ex_prioridade'] ?? '';
            $exame['ex_status'] = $exame['ex_status'] ?? '';
            $exame['profissional_nome'] = $exame['profissional_nome'] ?? '';
            
            if (empty($exame['profissional_nome'])) {
                $exame['profissional_nome'] = $fatura['profissional_nome'] ?? '';
            }
            if (empty($exame['unidade_nome'])) {
                $exame['unidade_nome'] = "Unidade não identificada (ex_uni: " . ($exame['ex_uni'] ?? 'N/A') . ")";
                addLog($serverLogs, "Aviso: Unidade não encontrada para ex_uni=" . ($exame['ex_uni'] ?? 'N/A') . " na fatura $fat_id");
            }
        }
        unset($exame);
        addLog($serverLogs, "Exames da fatura $fat_id carregados: " . count($exames) . " encontrados. Exames: " . json_encode(array_map(function($e) {
            return ['ex_pk' => $e['ex_pk'], 'ex_val' => $e['ex_val'], 'ex_vl_dig' => $e['ex_vl_dig'], 'ex_isdig' => $e['ex_isdig'], 'ex_uni' => $e['ex_uni'], 'unidade_nome' => $e['unidade_nome'], 'ex_paciente' => $e['ex_paciente']];
        }, $exames)));
        if (empty($exames)) {
            addLog($serverLogs, "Nenhum exame encontrado para fat_id=$fat_id. Verifique ex_fat_med ou ex_fat_dig na tabela exames.");
            $mensagem = '<div class="yellow-text text-center">Nenhum exame associado à fatura. Verifique se os exames foram corretamente vinculados.</div>';
        }
    } catch (Exception $e) {
        addLog($serverLogs, "Erro ao carregar exames da fatura: " . $e->getMessage());
        $mensagem = '<div class="red-text text-center">Erro ao carregar exames da fatura: ' . htmlspecialchars($e->getMessage()) . '</div>';
    }
} else {
    // Modo edição (mantido inalterado)
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && (isset($_POST['filtrar']) || isset($_POST['tipo']))) {
        $tipo = strtolower(trim(htmlspecialchars($_POST['tipo'] ?? '', ENT_QUOTES, 'UTF-8')));
        $med_cod = filter_var($_POST['med_cod'] ?? '', FILTER_SANITIZE_NUMBER_INT);
        $dig_cod = filter_var($_POST['dig_cod'] ?? '', FILTER_SANITIZE_NUMBER_INT);
        $dataInicio = trim(htmlspecialchars($_POST['data_inicio'] ?? '', ENT_QUOTES, 'UTF-8'));
        $dataFim = trim(htmlspecialchars($_POST['data_fim'] ?? '', ENT_QUOTES, 'UTF-8'));
        $unidadeFiltro = trim(htmlspecialchars($_POST['unidade_filtro'] ?? '', ENT_QUOTES, 'UTF-8'));
        $contrato = trim(htmlspecialchars($_POST['contrato'] ?? '', ENT_QUOTES, 'UTF-8'));
        $isDigitador = isset($_POST['is_digitador']) && $_POST['is_digitador'] === '1';
        // Normalizar tipo para consistência
        if ($tipo === 'medico' || $tipo === 'médico') {
            $tipo = 'medico';
            $dig_cod = '';
        } elseif ($tipo === 'digitador') {
            $tipo = 'digitador';
            $med_cod = '';
            $isDigitador = false; // Digitador não pode ter outro digitador
        }
        // Salvar dados na sessão
        $_SESSION['fatura_data'] = [
            'tipo' => $tipo,
            'med_cod' => $med_cod,
            'dig_cod' => $dig_cod,
            'data_inicio' => $dataInicio,
            'data_fim' => $dataFim,
            'unidade_filtro' => $unidadeFiltro,
            'contrato' => $contrato,
            'is_digitador' => $isDigitador
        ];
        addLog($serverLogs, "Dados salvos na sessão: " . print_r($_SESSION['fatura_data'], true));
    } elseif (isset($_SESSION['fatura_data'])) {
        // Restaurar dados da sessão
        $tipo = strtolower(trim(htmlspecialchars($_SESSION['fatura_data']['tipo'] ?? '', ENT_QUOTES, 'UTF-8')));
        $med_cod = filter_var($_SESSION['fatura_data']['med_cod'] ?? '', FILTER_SANITIZE_NUMBER_INT);
        $dig_cod = filter_var($_SESSION['fatura_data']['dig_cod'] ?? '', FILTER_SANITIZE_NUMBER_INT);
        $dataInicio = trim(htmlspecialchars($_SESSION['fatura_data']['data_inicio'] ?? '', ENT_QUOTES, 'UTF-8'));
        $dataFim = trim(htmlspecialchars($_SESSION['fatura_data']['data_fim'] ?? '', ENT_QUOTES, 'UTF-8'));
        $unidadeFiltro = trim(htmlspecialchars($_SESSION['fatura_data']['unidade_filtro'] ?? '', ENT_QUOTES, 'UTF-8'));
        $contrato = trim(htmlspecialchars($_SESSION['fatura_data']['contrato'] ?? '', ENT_QUOTES, 'UTF-8'));
        $isDigitador = isset($_SESSION['fatura_data']['is_digitador']) && $_SESSION['fatura_data']['is_digitador'];
        addLog($serverLogs, "Dados restaurados da sessão: tipo=$tipo, med_cod=$med_cod, dig_cod=$dig_cod, data_inicio=$dataInicio, data_fim=$dataFim, unidade_filtro=$unidadeFiltro, contrato=$contrato, is_digitador=$isDigitador");
    }
    addLog($serverLogs, "Modo edição - Tipo inicial: " . ($_POST['tipo'] ?? '') . ", Tipo processado: $tipo, med_cod: $med_cod, dig_cod: $dig_cod, contrato: $contrato, is_digitador: " . ($isDigitador ? 'true' : 'false'));
    // Validar datas
    $dataInicioValida = !empty($dataInicio) && DateTime::createFromFormat('d/m/Y', $dataInicio) !== false;
    $dataFimValida = !empty($dataFim) && DateTime::createFromFormat('d/m/Y', $dataFim) !== false;
    if ($dataInicioValida) {
        $dataInicio = DateTime::createFromFormat('d/m/Y', $dataInicio)->format('d/m/Y');
    }
    if ($dataFimValida) {
        $dataFim = DateTime::createFromFormat('d/m/Y', $dataFim)->format('d/m/Y');
    }
    // Buscar unidades e exames apenas se os dados forem válidos
    if (!empty($tipo) && !empty($contrato) && (
        ($tipo === 'medico' && !empty($med_cod) && is_numeric($med_cod)) ||
        ($tipo === 'digitador' && !empty($dig_cod) && is_numeric($dig_cod))
    )) {
        // Carregar unidades
        try {
            if ($tipo === 'medico') {
                $stmt_unidades = $pdo->prepare("
                    SELECT DISTINCT u.uni_nome
                    FROM exames e
                    JOIN fornecedores f ON e.ex_med_cod = f.for_cod AND LOWER(f.for_tipo) = 'medico'
                    JOIN unidades u ON u.uni_cod = e.ex_uni
                    WHERE e.ex_med_cod = ? AND e.ex_fat_med IS NULL AND e.ex_alterado = false AND u.uni_contrato = ?
                    ORDER BY u.uni_nome
                ");
                $stmt_unidades->execute([$med_cod, $contrato]);
                $unidades = $stmt_unidades->fetchAll(PDO::FETCH_COLUMN);
                addLog($serverLogs, "Unidades carregadas para médico com contrato $contrato: " . implode(',', $unidades));
            } elseif ($tipo === 'digitador') {
                $stmt_unidades = $pdo->prepare("
                    SELECT DISTINCT u.uni_nome
                    FROM exames e
                    JOIN fornecedores f ON e.ex_dig_cod = f.for_cod AND LOWER(f.for_tipo) = 'digitador'
                    JOIN unidades u ON u.uni_cod = e.ex_uni
                    WHERE e.ex_dig_cod = ? AND e.ex_fat_dig IS NULL AND e.ex_alterado = false AND u.uni_contrato = ?
                    ORDER BY u.uni_nome
                ");
                $stmt_unidades->execute([$dig_cod, $contrato]);
                $unidades = $stmt_unidades->fetchAll(PDO::FETCH_COLUMN);
                addLog($serverLogs, "Unidades carregadas para digitador com contrato $contrato: " . implode(',', $unidades));
            }
        } catch (Exception $e) {
            addLog($serverLogs, "Erro ao carregar unidades: " . $e->getMessage());
            $mensagem = '<div class="red-text text-center">Erro ao carregar unidades. Tente novamente.</div>';
        }
        // Carregar nome do profissional
        try {
            $for_tipo = $tipo === 'medico' ? 'medico' : 'digitador';
            $for_cod = $tipo === 'medico' ? $med_cod : $dig_cod;
            $stmt = $pdo->prepare("SELECT for_nome FROM fornecedores WHERE for_cod = ? AND LOWER(for_tipo) = ?");
            $stmt->execute([$for_cod, $for_tipo]);
            $profissional = $stmt->fetch(PDO::FETCH_ASSOC);
            $profissionalNome = $profissional ? $profissional['for_nome'] : "$for_tipo não encontrado";
            $labelProfissional = $tipo === 'medico' ? 'Médico' : 'Digitador';
            addLog($serverLogs, "Nome do profissional carregado: $profissionalNome, for_cod=$for_cod, for_tipo=$for_tipo");
        } catch (Exception $e) {
            addLog($serverLogs, "Erro ao carregar nome do profissional: " . $e->getMessage());
            $profissionalNome = 'Erro ao carregar profissional';
            $mensagem = '<div class="red-text text-center">Erro ao carregar profissional. Tente novamente.</div>';
        }
        // Carregar exames
        try {
            if ($tipo === 'medico') {
                $query = "
                    SELECT e.ex_pk, e.ex_uni, e.ex_modalidade, e.ex_estudo, e.ex_prioridade, e.ex_status,
                           e.ex_data_ex, e.ex_data_concl, e.ex_qtde, COALESCE(e.ex_vl_med, 0) AS ex_val,
                           COALESCE(e.ex_vl_dig, 0) AS ex_vl_dig, e.ex_isdig,
                           f.for_nome AS profissional_nome, u.uni_nome AS unidade_nome, e.ex_paciente
                    FROM exames e
                    LEFT JOIN fornecedores f ON e.ex_med_cod = f.for_cod AND LOWER(f.for_tipo) = 'medico'
                    LEFT JOIN unidades u ON u.uni_cod = e.ex_uni
                    WHERE e.ex_med_cod = ? AND e.ex_fat_med IS NULL AND e.ex_alterado = false AND u.uni_contrato = ?
                ";
                $params = [$med_cod, $contrato];
            } else {
                $query = "
                    SELECT e.ex_pk, e.ex_uni, e.ex_modalidade, e.ex_estudo, e.ex_prioridade, e.ex_status,
                           e.ex_data_ex, e.ex_data_concl, e.ex_qtde, COALESCE(e.ex_vl_dig, 0) AS ex_val,
                           COALESCE(e.ex_vl_dig, 0) AS ex_vl_dig, e.ex_isdig,
                           f.for_nome AS profissional_nome, u.uni_nome AS unidade_nome, e.ex_paciente
                    FROM exames e
                    LEFT JOIN fornecedores f ON e.ex_dig_cod = f.for_cod AND LOWER(f.for_tipo) = 'digitador'
                    LEFT JOIN unidades u ON u.uni_cod = e.ex_uni
                    WHERE e.ex_dig_cod = ? AND e.ex_fat_dig IS NULL AND e.ex_alterado = false AND u.uni_contrato = ?
                ";
                $params = [$dig_cod, $contrato];
            }
            if ($dataInicioValida && $dataFimValida) {
                $dataInicioParts = explode('/', $dataInicio);
                $dataFimParts = explode('/', $dataFim);
                $dataInicioSQL = $dataInicioParts[2] . '-' . $dataInicioParts[1] . '-' . $dataInicioParts[0];
                $dataFimSQL = $dataFimParts[2] . '-' . $dataFimParts[1] . '-' . $dataFimParts[0];
                if (strtotime($dataInicioSQL) > strtotime($dataFimSQL)) {
                    $mensagem = '<div class="red-text text-center">A data inicial deve ser anterior à data final.</div>';
                } else {
                    $query .= " AND DATE(e.ex_data_ex) BETWEEN ? AND ?";
                    $params[] = $dataInicioSQL;
                    $params[] = $dataFimSQL;
                }
            }
            if (!empty($unidadeFiltro)) {
                $stmt_check_unit = $pdo->prepare("SELECT uni_cod FROM unidades WHERE uni_nome = ? LIMIT 1");
                $stmt_check_unit->execute([$unidadeFiltro]);
                $uni_cod = $stmt_check_unit->fetchColumn();
                if ($uni_cod) {
                    $query .= " AND e.ex_uni = ?";
                    $params[] = $uni_cod;
                } else {
                    addLog($serverLogs, "Aviso: Unidade $unidadeFiltro não encontrada na tabela unidades para filtragem.");
                }
            }
            addLog($serverLogs, "Executando query de exames no modo edição: $query com params: " . json_encode($params));
            $query .= " ORDER BY e.ex_data_ex";
            if (empty($mensagem)) {
                $stmt = $pdo->prepare($query);
                $stmt->execute($params);
                $exames = $stmt->fetchAll(PDO::FETCH_ASSOC);
                // Garantir que campos NULL sejam strings vazias para evitar erros de depreciação
                foreach ($exames as &$exame) {
                    $exame['unidade_nome'] = $exame['unidade_nome'] ?? '';
                    $exame['ex_modalidade'] = $exame['ex_modalidade'] ?? '';
                    $exame['ex_estudo'] = $exame['ex_estudo'] ?? '';
                    $exame['ex_paciente'] = $exame['ex_paciente'] ?? '';
                    $exame['ex_prioridade'] = $exame['ex_prioridade'] ?? '';
                    $exame['ex_status'] = $exame['ex_status'] ?? '';
                    $exame['profissional_nome'] = $exame['profissional_nome'] ?? '';
                }
                unset($exame);
                // Calcular fat_val_dig para médicos com isDigitador ativado
                $totalExames = count($exames);
                $totalValor = array_sum(array_column($exames, 'ex_val'));
                $totalValorLiquido = $tipo === 'medico' && $isDigitador ? $totalValor - $fat_val_dig : $totalValor;
                $valoresExames = array_map(function($exame) {
                    return "ex_pk: {$exame['ex_pk']}, ex_val: {$exame['ex_val']}, ex_vl_dig: {$exame['ex_vl_dig']}, ex_isdig: {$exame['ex_isdig']}, ex_uni: {$exame['ex_uni']}, unidade_nome: {$exame['unidade_nome']}, ex_paciente: {$exame['ex_paciente']}";
                }, $exames);
                addLog($serverLogs, "Exames carregados: " . count($exames) . " encontrados. Valores: " . implode('; ', $valoresExames));
                if (empty($exames)) {
                    $mensagem = '<p class="yellow-text text-center">Nenhum exame encontrado para o ' . htmlspecialchars($labelProfissional) . ' selecionado com os filtros aplicados. Verifique os filtros ou dados.</p>';
                }
            }
        } catch (Exception $e) {
            addLog($serverLogs, "Erro ao carregar exames: " . $e->getMessage());
            $mensagem = '<div class="red-text text-center">Erro ao carregar exames. Tente novamente.</div>';
        }
    } else {
        $mensagem = '<p class="green-text text-center">Selecione um profissional e aplique os filtros para carregar os exames.</p>';
    }
}
// Calcula totais
$totalExames = count($exames);
$totalValor = array_sum(array_column($exames, 'ex_val'));
$totalValorLiquido = $tipo === 'medico' && $isDigitador ? $totalValor - $fat_val_dig : $totalValor;
addLog($serverLogs, "Total de exames: $totalExames, Total valor: $totalValor, Valor digitador: $fat_val_dig, Total líquido: $totalValorLiquido");
// Resumo por unidade com ajuste para 100%
$unidades_summary = [];
if (!empty($exames)) {
    if ($tipo === 'medico' && $isDigitador) {
        $fat_val_dig = array_sum(array_map(function($exame) {
            return !empty($exame['ex_isdig']) ? (float)($exame['ex_vl_dig'] ?? 0) : 0;
        }, $exames));
    }
    foreach ($exames as $exame) {
        $unidade_cod = $exame['ex_uni'];
        if (!isset($unidades_summary[$unidade_cod])) {
            $unidades_summary[$unidade_cod] = ['count' => 0, 'valor' => 0, 'percent' => 0.0, 'nome' => $exame['unidade_nome'] ?: "Unidade $unidade_cod (não encontrada)"];
        }
        $unidades_summary[$unidade_cod]['count']++;
        $unidades_summary[$unidade_cod]['valor'] += (float)($exame['ex_val'] ?? 0);
    }
    // Calcular percentuais com ajuste
    $total_percent_raw = 0.0;
    foreach ($unidades_summary as $unidade_cod => &$data) {
        $data['percent_raw'] = $totalValor > 0 ? ($data['valor'] / $totalValor) * 100 : 0.0;
        $total_percent_raw += $data['percent_raw'];
    }
    unset($data);
    $unidades_summary_adjusted = [];
    $last_unit = null;
    $precision = 2;
    foreach ($unidades_summary as $unidade_cod => $data) {
        $percent_adjusted = round($data['percent_raw'], $precision);
        $unidades_summary_adjusted[$unidade_cod] = $percent_adjusted;
        $last_unit = $unidade_cod;
    }
    $total_adjusted = array_sum($unidades_summary_adjusted);
    if ($total_adjusted != 100 && !empty($unidades_summary_adjusted)) {
        $adjustment = 100 - $total_adjusted;
        $unidades_summary_adjusted[$last_unit] += $adjustment;
    }
    foreach ($unidades_summary as $unidade_cod => &$data) {
        $data['percent'] = $unidades_summary_adjusted[$unidade_cod];
    }
    unset($data);
    // AJUSTE: Ordenar alfabeticamente por nome da unidade (cDesDep equivalente)
    uasort($unidades_summary, function($a, $b) {
        return strcasecmp($a['nome'], $b['nome']); // Case-insensitive para melhor UX
    });
    if ($totalValor <= 0 && empty($mensagem)) {
        $mensagem = '<div class="yellow-text text-center">Atenção: Valor total dos exames é 0. Verifique os valores dos exames no banco de dados.</div>';
        addLog($serverLogs, "Atenção: TotalValor = $totalValor, percentuais ajustados: " . json_encode($unidades_summary));
    }
} else {
    if (empty($mensagem) || strpos($mensagem, 'sucesso') === false) {
        $mensagem = '<div class="yellow-text text-center">Nenhum exame encontrado. Verifique os filtros ou dados.</div>';
    }
    addLog($serverLogs, "Nenhum exame encontrado. Exames: " . json_encode($exames) . ", totalValor: $totalValor");
}
// Validar percentual total
$total_percent = array_sum(array_column($unidades_summary, 'percent'));
if (!empty($unidades_summary) && $totalValor > 0 && ($total_percent < 99.5 || $total_percent > 100.5)) {
    $mensagem = '<div class="red-text text-center">Erro: Percentual total dos rateios (' . number_format($total_percent, 2, ',', '.') . '%) não é igual a 100%. Verifique os valores dos exames.</div>';
    addLog($serverLogs, "Erro: Percentual total dos rateios ($total_percent%) fora do intervalo esperado. Resumo: " . json_encode($unidades_summary));
}
// Limpar buffer
ob_end_flush();
?>
<!DOCTYPE html>
<html lang="pt-BR" class="<?php echo ($_SESSION['usu_tema'] ?? 'claro') === 'escuro' ? 'dark' : ''; ?>">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="author" content="Eduardo Sutel">
    <title><?php echo htmlspecialchars($pageTitle); ?> - Laudo Control</title>
    <link rel="shortcut icon" href="assets/favicon.ico" type="image/x-icon">
    <script src="https://cdn.tailwindcss.com"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
    <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" rel="stylesheet">
    <style>
        body {
            font-family: 'Poppins', sans-serif;
        }
        input[type=number]::-webkit-inner-spin-button,
        input[type=number]::-webkit-outer-spin-button {
            -webkit-appearance: none;
            margin: 0;
        }
        input[type=number] { 
            -moz-appearance: textfield;
            appearance: textfield;
        }
        /* Estilos para opções de rateio */
        #option-proporcional, #option-unico {
            transition: all 0.3s ease;
        }
        #option-proporcional:hover, #option-unico:hover {
            border-color: #60a5fa !important;
            transform: translateY(-2px);
        }
        .rateio-selected {
            border-color: #3b82f6 !important;
            background-color: #eff6ff !important;
        }
        .dark .rateio-selected {
            background-color: #1e3a5f !important;
            border-color: #60a5fa !important;
        }
        /* Loading indicator */
        #loadingExames {
            z-index: 9999;
        }
        /* Loading indicator - garantir que apareça no topo */
        #loadingExames {
            z-index: 9999 !important;
        }
    </style>
    <script>
        // Mostrar loading imediatamente enquanto a página está sendo processada
        (function() {
            if (document.readyState === 'loading') {
                // Página ainda está carregando, aguardar DOMContentLoaded
                document.addEventListener('DOMContentLoaded', function() {
                    const loading = document.getElementById('loadingExames');
                    if (loading) loading.style.display = 'flex';
                });
            } else {
                // DOM já está pronto, mostrar loading imediatamente
                const loading = document.getElementById('loadingExames');
                if (loading) loading.style.display = 'flex';
            }
        })();
    </script>
</head>
<body class="bg-gray-100 dark:bg-gray-900">
    <?php
    if (!function_exists('renderHeader') || !function_exists('renderSidebar')) {
        addLog($serverLogs, "Erro: Funções renderHeader() ou renderSidebar() não definidas.");
        die('Erro: As funções renderHeader() ou renderSidebar() não estão definidas. Verifique os arquivos layout/header.php e layout/sidebar.php.');
    }
    renderHeader($pageTitle);
    renderSidebar();
    ?>
    <main class="ml-72 mt-16 p-10">
        <div class="max-w-[1920px] mx-auto space-y-6">
            <?php if (!empty($mensagem)): ?>
                <div class="p-6 rounded-2xl border-2 <?php 
                    echo strpos($mensagem, 'green-text') !== false ? 'bg-green-50 border-green-200 text-green-800' : 
                    (strpos($mensagem, 'red-text') !== false ? 'bg-red-50 border-red-200 text-red-800' : 
                    'bg-yellow-50 border-yellow-200 text-yellow-800'); 
                ?>">
                    <i class="fas <?php 
                        echo strpos($mensagem, 'green-text') !== false ? 'fa-check-circle' : 
                        (strpos($mensagem, 'red-text') !== false ? 'fa-exclamation-circle' : 'fa-exclamation-triangle'); 
                    ?> mr-2"></i>
                    <?php echo strip_tags($mensagem); ?>
                </div>
            <?php endif; ?>
            <div class="mensagem-container"></div>
            <div class="hidden fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center" id="loadingSpinner">
                <div class="animate-spin rounded-full h-16 w-16 border-t-4 border-b-4 border-blue-600"></div>
            </div>
            <?php if ($modoVisualizar): ?>
                <div class="flex gap-3 mb-6">
                    <a href="CadastrarFatura.php" class="px-6 py-3 bg-gradient-to-r from-blue-500 to-blue-600 text-white rounded-xl font-bold hover:shadow-xl hover:-translate-y-1 transition-all">
                        <i class="fas fa-arrow-left mr-2"></i>Voltar
                    </a>
                    <button type="button" class="px-6 py-3 bg-gradient-to-r from-red-500 to-red-600 text-white rounded-xl font-bold hover:shadow-xl hover:-translate-y-1 transition-all" id="excluir_fatura">
                        <i class="fas fa-trash mr-2"></i>Excluir
                    </button>
                </div>
            <?php endif; ?>
            <div class="bg-white dark:bg-gray-800 p-8 rounded-3xl border-2 border-gray-200 dark:border-gray-700 shadow-xl">
                <h2 class="text-2xl font-black text-gray-900 dark:text-white mb-6">
                    <i class="fas fa-file-invoice-dollar text-blue-600 mr-2"></i>
                    <?php echo $modoVisualizar ? 'Detalhes da Fatura' : 'Dados da Fatura'; ?>
                </h2>
                <form id="faturaForm" method="POST" action="" class="space-y-6">
                    <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
                        <div>
                            <label for="profissional_nome" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-user mr-2 text-blue-600"></i><?php echo htmlspecialchars($labelProfissional); ?>
                            </label>
                            <input id="profissional_nome" type="text" 
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all" 
                                   value="<?php echo htmlspecialchars($profissionalNome); ?>" readonly>
                                </div>
                                <?php if ($modoVisualizar && $fat_desc > 0): ?>
                            <div>
                                <label for="fat_val_bruto" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                    <i class="fas fa-dollar-sign mr-2 text-blue-600"></i>Valor Bruto
                                </label>
                                <input id="fat_val_bruto" type="text" 
                                       class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white" 
                                       value="R$ <?php echo number_format($fat_val_int, 2, ',', '.'); ?>" readonly>
                                    </div>
                            <div>
                                <label for="fat_desc" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                    <i class="fas fa-percent mr-2 text-blue-600"></i>Desconto Aplicado
                                </label>
                                <input id="fat_desc" type="text" 
                                       class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white" 
                                       value="<?php echo number_format($fat_desc, 2, ',', '.'); ?>%" readonly>
                                    </div>
                                <?php endif; ?>
                        <div>
                            <label for="fat_val" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-money-bill-wave mr-2 text-green-600"></i>Valor Líquido
                            </label>
                            <input id="fat_val" name="fat_val" type="text" 
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white font-bold text-green-600" 
                                   value="R$ <?php echo number_format($totalValorLiquido, 2, ',', '.'); ?>" readonly>
                                </div>
                                <?php if ($tipo === 'medico'): ?>
                            <div class="flex items-center gap-3 p-4 bg-gray-50 dark:bg-gray-700 rounded-xl">
                                <label class="relative inline-flex items-center cursor-pointer">
                                    <input type="checkbox" id="is_digitador" name="is_digitador" value="1" 
                                           class="sr-only peer" <?php echo $isDigitador ? 'checked' : ''; ?> <?php echo $modoVisualizar ? 'disabled' : ''; ?>>
                                    <div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
                                    <span class="ml-3 text-sm font-medium text-gray-700 dark:text-gray-300">Considerar Digitador</span>
                                </label>
                                    </div>
                            <div id="fat_val_dig_container" class="<?php echo $isDigitador ? '' : 'hidden'; ?>">
                                <label for="fat_val_dig" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                    <i class="fas fa-keyboard mr-2 text-blue-600"></i>Valor Digitador
                                </label>
                                <input id="fat_val_dig" name="fat_val_dig" type="text" 
                                       class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white" 
                                       value="R$ <?php echo number_format($fat_val_dig, 2, ',', '.'); ?>" readonly>
                                    </div>
                                <?php endif; ?>
                        <div class="flex items-center gap-3 p-4 bg-gray-50 dark:bg-gray-700 rounded-xl">
                            <label class="relative inline-flex items-center cursor-pointer">
                                <input type="checkbox" id="aplicar_desconto" name="aplicar_desconto" value="1" 
                                       class="sr-only peer" <?php echo $aplicarDesconto ? 'checked' : ''; ?> <?php echo $modoVisualizar ? 'disabled' : ''; ?>>
                                <div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
                                <span class="ml-3 text-sm font-medium text-gray-700 dark:text-gray-300">Aplicar Desconto</span>
                            </label>
                                </div>
                        <div id="desconto_container" class="<?php echo $aplicarDesconto ? '' : 'hidden'; ?>">
                            <label for="desconto_percent" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-percent mr-2 text-blue-600"></i>% de Desconto
                            </label>
                            <input id="desconto_percent" name="desconto_percent" type="number" 
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all" 
                                   min="0" max="100" step="0.01" value="<?php echo number_format($descontoPercent, 2, ',', '.'); ?>" <?php echo $modoVisualizar ? 'disabled' : ''; ?>>
                                </div>
                        <div>
                            <label for="fat_vcto" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-calendar mr-2 text-blue-600"></i>Data de Vencimento
                            </label>
                            <input id="fat_vcto" name="fat_vcto" type="text" 
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all" 
                                   value="<?php echo $fatVcto; ?>" placeholder="dd/mm/aaaa" <?php echo $modoVisualizar ? 'disabled' : 'required'; ?>>
                            <span id="fat_vcto_error" class="text-red-600 text-sm mt-1"></span>
                                </div>
                        <div class="md:col-span-2 lg:col-span-3">
                            <label for="observacoes" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-comment mr-2 text-blue-600"></i>Observações
                            </label>
                            <textarea id="observacoes" name="observacoes" 
                                      class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all resize-none" 
                                      rows="4" maxlength="500" <?php echo $modoVisualizar ? 'disabled' : ''; ?>><?php echo isset($observacoes) ? htmlspecialchars($observacoes) : ''; ?></textarea>
                            <div class="text-right mt-2">
                                <span class="text-sm text-gray-500 dark:text-gray-400 char-counter"><?php echo isset($observacoes) ? strlen($observacoes) : 0; ?>/500</span>
                            </div>
                                </div>
                            </div>
                            <input type="hidden" name="data_inicio" value="<?php echo htmlspecialchars($dataInicio); ?>">
                            <input type="hidden" name="data_fim" value="<?php echo htmlspecialchars($dataFim); ?>">
                            <input type="hidden" name="unidade_filtro" value="<?php echo htmlspecialchars($unidadeFiltro); ?>">
                            <input type="hidden" name="tipo" value="<?php echo htmlspecialchars($tipo); ?>">
                            <input type="hidden" name="med_cod" value="<?php echo htmlspecialchars($med_cod); ?>">
                            <input type="hidden" name="dig_cod" value="<?php echo htmlspecialchars($dig_cod); ?>">
                            <input type="hidden" name="contrato" value="<?php echo htmlspecialchars($contrato); ?>">
                            <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token']); ?>">
                            <input type="hidden" id="itens_manuais" name="itens_manuais" value="[]">
                            <input type="hidden" id="rateio_proporcional_val" name="rateio_proporcional_val" value="1">
                            <input type="hidden" id="unidade_rateio_unico_val" name="unidade_rateio_unico_val" value="">
                        </form>
                    </div>
            
            <div class="bg-white dark:bg-gray-800 p-8 rounded-3xl border-2 border-gray-200 dark:border-gray-700 shadow-xl">
                <h2 class="text-2xl font-black text-gray-900 dark:text-white mb-6">
                    <i class="fas fa-chart-pie text-blue-600 mr-2"></i>
                    Resumo por Unidade
                </h2>
                <div class="overflow-x-auto rounded-2xl">
                    <table class="w-full text-sm">
                        <thead class="bg-gradient-to-r from-blue-600 to-blue-700 text-white">
                                <tr>
                                <th class="px-4 py-4 text-left font-bold">Unidade</th>
                                <th class="px-4 py-4 text-left font-bold">Exames</th>
                                <th class="px-4 py-4 text-left font-bold">Valor (R$)</th>
                                <th class="px-4 py-4 text-left font-bold">Percentual (%)</th>
                                </tr>
                            </thead>
                        <tbody id="unidadesSummary" class="bg-white dark:bg-gray-800">
                                <?php if (empty($unidades_summary)): ?>
                                    <tr>
                                    <td colspan="4" class="px-4 py-8 text-center text-gray-500 dark:text-gray-400">
                                        <i class="fas fa-inbox text-4xl mb-2 block"></i>
                                        <?php echo $modoVisualizar ? 'Nenhum exame associado à fatura. Verifique se os exames foram corretamente vinculados.' : 'Nenhum exame selecionado.'; ?>
                                    </td>
                                    </tr>
                                <?php else: ?>
                                    <?php foreach ($unidades_summary as $unidade_cod => $data): ?>
                                    <tr class="border-b border-gray-200 dark:border-gray-700 hover:bg-blue-50 dark:hover:bg-blue-900/10 transition-all">
                                        <td class="px-4 py-3 text-gray-700 dark:text-gray-300"><?php echo htmlspecialchars($data['nome']); ?></td>
                                        <td class="px-4 py-3 text-gray-700 dark:text-gray-300"><?php echo $data['count']; ?></td>
                                        <td class="px-4 py-3 font-mono font-semibold text-gray-900 dark:text-white">R$ <?php echo number_format($data['valor'], 2, ',', '.'); ?></td>
                                        <td class="px-4 py-3 font-semibold text-blue-600 dark:text-blue-400"><?php echo number_format($data['percent'], 2, ',', '.'); ?>%</td>
                                        </tr>
                                    <?php endforeach; ?>
                                <?php endif; ?>
                            </tbody>
                        </table>
                </div>
            </div>
            <?php if (!$modoVisualizar): ?>
            <div class="bg-white dark:bg-gray-800 p-8 rounded-3xl border-2 border-gray-200 dark:border-gray-700 shadow-xl" id="itens-manuais-wrapper">
                <h2 class="text-2xl font-black text-gray-900 dark:text-white mb-6">
                    <i class="fas fa-plus-circle text-blue-600 mr-2"></i>
                    Adicionar Itens Manuais
                </h2>
                <form id="itemManualForm" autocomplete="off" class="space-y-6">
                    <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
                        <div>
                            <label for="manual_desc" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-file-alt mr-2 text-blue-600"></i>Descrição
                            </label>
                            <input id="manual_desc" name="manual_desc" type="text" maxlength="100" required 
                                   placeholder="Descrição do item manual"
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all">
                            </div>
                        <div>
                            <label for="manual_quantidade" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-hashtag mr-2 text-blue-600"></i>Quantidade
                            </label>
                            <input id="manual_quantidade" name="manual_quantidade" type="number" min="1" value="1" required 
                                   placeholder="1"
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all">
                            </div>
                        <div>
                            <label for="manual_val_unit" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-dollar-sign mr-2 text-blue-600"></i>Valor Unitário (R$)
                            </label>
                            <input id="manual_val_unit" name="manual_val_unit" type="number" step="0.01" min="0" required 
                                   placeholder="0,00"
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all">
                            </div>
                        <div>
                            <label for="manual_val_total" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-money-bill-wave mr-2 text-green-600"></i>Valor Total (R$)
                                        </label>
                            <input id="manual_val_total" name="manual_val_total" type="number" step="0.01" min="0" required 
                                   placeholder="0,00"
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all">
                                    </div>
                                </div>
                    <div class="pt-6 border-t-2 border-gray-200 dark:border-gray-700">
                        <label class="block font-bold text-gray-700 dark:text-gray-300 mb-4">
                            <i class="fas fa-chart-pie mr-2 text-blue-600"></i>Tipo de Rateio dos Itens Manuais:
                        </label>
                                
                        <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
                                    <!-- Opção Proporcional -->
                            <div class="rateio-option p-6 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-gray-50 dark:bg-gray-700 cursor-pointer transition-all hover:border-blue-500 dark:hover:border-blue-400" id="option-proporcional">
                                <div class="flex items-center mb-3">
                                    <input type="radio" name="tipo_rateio_manual" id="rateio_proporcional_radio" value="proporcional" checked class="w-5 h-5 text-blue-600 mr-3 cursor-pointer">
                                    <label for="rateio_proporcional_radio" class="font-bold text-lg text-gray-900 dark:text-white cursor-pointer rateio-label">Rateio Proporcional</label>
                                        </div>
                                <p class="text-sm text-gray-600 dark:text-gray-400 ml-8 rateio-description">Distribui o valor dos itens manuais proporcionalmente entre todas as unidades que já estão no rateio da fatura.</p>
                                    </div>
                                    
                                    <!-- Opção Único -->
                            <div class="rateio-option p-6 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-gray-50 dark:bg-gray-700 cursor-pointer transition-all hover:border-blue-500 dark:hover:border-blue-400" id="option-unico">
                                <div class="flex items-center mb-3">
                                    <input type="radio" name="tipo_rateio_manual" id="rateio_unico_radio" value="unico" class="w-5 h-5 text-blue-600 mr-3 cursor-pointer">
                                    <label for="rateio_unico_radio" class="font-bold text-lg text-gray-900 dark:text-white cursor-pointer rateio-label">Rateio Único</label>
                                        </div>
                                <p class="text-sm text-gray-600 dark:text-gray-400 ml-8 rateio-description">Todo o valor dos itens manuais será concentrado em uma única unidade selecionada.</p>
                                    </div>
                                </div>
                                
                                <!-- Select de Unidade (aparece apenas quando único está selecionado) -->
                        <div id="select-unidade-rateio-unico" class="hidden mt-6 pt-6 border-t-2 border-gray-200 dark:border-gray-700">
                            <label for="unidade_rateio_unico" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-building mr-2 text-blue-600"></i>Unidade que receberá todo o valor dos itens manuais:
                            </label>
                            <select id="unidade_rateio_unico" required 
                                    class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all">
                                        <option value="">Selecione a Unidade para Rateio Único</option>
                                        <?php foreach ($todasUnidades as $uni): ?>
                                            <option value="<?php echo htmlspecialchars($uni['uni_cod']); ?>" data-nome="<?php echo htmlspecialchars($uni['uni_nome']); ?>">
                                                <?php echo htmlspecialchars($uni['uni_nome']); ?>
                                            </option>
                                        <?php endforeach; ?>
                                    </select>
                                </div>
                            </div>
                    
                    <div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4 pt-6 border-t-2 border-gray-200 dark:border-gray-700">
                        <p class="text-sm text-gray-600 dark:text-gray-400">Os itens manuais serão somados como exames, afetando o valor bruto, líquido e rateio. Sempre use valores válidos.</p>
                        <button type="button" 
                                class="px-8 py-4 bg-gradient-to-r from-green-500 to-green-600 text-white rounded-2xl font-bold hover:shadow-xl hover:-translate-y-1 transition-all" 
                                id="adicionar_item_manual">
                            <i class="fas fa-plus mr-2"></i>Adicionar
                        </button>
                        </div>
                </form>
                
                <!-- Tabela de Itens Manuais Adicionados -->
                <div class="hidden mt-6" id="tabela-itens-manuais-card">
                    <h3 class="text-xl font-black text-gray-900 dark:text-white mb-4">
                        <i class="fas fa-list text-blue-600 mr-2"></i>
                        Itens Manuais Adicionados
                    </h3>
                    <div class="overflow-x-auto rounded-2xl">
                        <table class="w-full text-sm" id="tabela-itens-manuais">
                            <thead class="bg-gradient-to-r from-blue-600 to-blue-700 text-white">
                                <tr>
                                    <th class="px-4 py-4 text-left font-bold">Descrição</th>
                                    <th class="px-4 py-4 text-left font-bold">Quantidade</th>
                                    <th class="px-4 py-4 text-left font-bold">Valor Unitário (R$)</th>
                                    <th class="px-4 py-4 text-left font-bold">Valor Total (R$)</th>
                                    <th class="px-4 py-4 text-left font-bold">Tipo de Rateio</th>
                                    <th class="px-4 py-4 text-left font-bold">Unidade (Rateio Único)</th>
                                    <th class="px-4 py-4 text-left font-bold">Ações</th>
                                </tr>
                            </thead>
                            <tbody id="itens-manuais-tbody" class="bg-white dark:bg-gray-800">
                                <!-- Itens manuais serão inseridos aqui via JavaScript -->
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
            <?php endif; ?>
            <?php if (!$modoVisualizar): ?>
            <div x-data="{ showFilters: true }" x-cloak class="bg-white dark:bg-gray-800 p-8 rounded-3xl border-2 border-gray-200 dark:border-gray-700 shadow-xl mb-6">
                <div class="flex items-center justify-between mb-6">
                    <h2 class="text-2xl font-black text-gray-900 dark:text-white">
                        <i class="fas fa-filter text-blue-600 mr-2"></i>
                        Filtros de Busca
                    </h2>
                    <button @click="showFilters = !showFilters" type="button"
                            class="px-4 py-2 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded-xl hover:bg-gray-200 transition-all">
                        <i class="fas" :class="showFilters ? 'fa-chevron-up' : 'fa-chevron-down'"></i>
                    </button>
                        </div>
                <form id="filtroForm" method="POST" action="" x-show="showFilters" x-transition class="space-y-6">
                    <div class="grid grid-cols-1 md:grid-cols-4 gap-6">
                        <div>
                            <label for="data_inicio" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-calendar mr-2 text-blue-600"></i>Data Inicial
                            </label>
                            <input id="data_inicio" name="data_inicio" type="text" 
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all" 
                                   value="<?php echo htmlspecialchars($dataInicio); ?>" placeholder="dd/mm/aaaa">
                        </div>
                        <div>
                            <label for="data_fim" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-calendar mr-2 text-blue-600"></i>Data Final
                            </label>
                            <input id="data_fim" name="data_fim" type="text" 
                                   class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all" 
                                   value="<?php echo htmlspecialchars($dataFim); ?>" placeholder="dd/mm/aaaa">
                        </div>
                        <div>
                            <label for="unidade_filtro" class="block font-bold text-gray-700 dark:text-gray-300 mb-2">
                                <i class="fas fa-building mr-2 text-blue-600"></i>Unidade
                            </label>
                            <select id="unidade_filtro" name="unidade_filtro" 
                                    class="w-full px-6 py-4 border-2 border-gray-300 dark:border-gray-600 rounded-xl bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/20 transition-all">
                                <option value="">Todas as Unidades</option>
                                <?php foreach ($unidades as $unidade): ?>
                                    <option value="<?php echo htmlspecialchars($unidade); ?>" <?php echo $unidadeFiltro === $unidade ? 'selected' : ''; ?>>
                                        <?php echo htmlspecialchars($unidade); ?>
                                    </option>
                                <?php endforeach; ?>
                            </select>
                        </div>
                        <div class="flex items-end">
                            <button type="submit" name="filtrar" 
                                    class="w-full px-8 py-4 bg-gradient-to-r from-blue-500 to-blue-600 text-white rounded-2xl font-bold hover:shadow-xl hover:-translate-y-1 transition-all">
                                <i class="fas fa-search mr-2"></i>Filtrar
                            </button>
                        </div>
                    </div>
                    <input type="hidden" name="tipo" value="<?php echo htmlspecialchars($tipo); ?>">
                    <input type="hidden" name="med_cod" value="<?php echo htmlspecialchars($med_cod); ?>">
                    <input type="hidden" name="dig_cod" value="<?php echo htmlspecialchars($dig_cod); ?>">
                    <input type="hidden" name="contrato" value="<?php echo htmlspecialchars($contrato); ?>">
                    <input type="hidden" name="is_digitador" value="<?php echo $isDigitador ? '1' : ''; ?>">
                </form>
            </div>
            <?php endif; ?>
            <div class="bg-white dark:bg-gray-800 p-8 rounded-3xl border-2 border-gray-200 dark:border-gray-700 shadow-xl">
                <h2 class="text-2xl font-black text-gray-900 dark:text-white mb-6">
                    <i class="fas fa-list text-blue-600 mr-2"></i>
                    <?php echo $modoVisualizar ? 'Exames Faturados' : 'Exames Não Faturados'; ?>
                </h2>
                        <form id="examesForm" method="POST" action="">
                    <!-- Loading Indicator -->
                    <div id="loadingExames" class="fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center">
                        <div class="bg-white dark:bg-gray-800 rounded-2xl p-8 shadow-2xl">
                            <div class="flex flex-col items-center gap-4">
                                <div class="animate-spin rounded-full h-16 w-16 border-t-4 border-b-4 border-blue-600"></div>
                                <p class="text-gray-700 dark:text-gray-300 font-semibold text-lg">Carregando exames...</p>
                            </div>
                        </div>
                    </div>
                    <div class="overflow-x-auto rounded-2xl">
                        <table class="w-full text-sm" id="examesTable">
                            <thead class="bg-gradient-to-r from-blue-600 to-blue-700 text-white">
                                    <tr>
                                        <?php if (!$modoVisualizar): ?>
                                        <th class="px-4 py-4 text-left font-bold">Selecionar</th>
                                        <?php endif; ?>
                                    <th class="px-4 py-4 text-left font-bold">Unidade</th>
                                    <th class="px-4 py-4 text-left font-bold">Modalidade</th>
                                    <th class="px-4 py-4 text-left font-bold">Estudo</th>
                                    <th class="px-4 py-4 text-left font-bold">Paciente</th>
                                    <th class="px-4 py-4 text-left font-bold">Prioridade</th>
                                    <th class="px-4 py-4 text-left font-bold">Status</th>
                                    <th class="px-4 py-4 text-left font-bold">Data Exame</th>
                                    <th class="px-4 py-4 text-left font-bold">Data Conclusão</th>
                                    <th class="px-4 py-4 text-left font-bold"><?php echo $tipo === 'medico' ? 'Médico' : 'Digitador'; ?></th>
                                    <th class="px-4 py-4 text-left font-bold">Valor (R$)</th>
                                        <?php if ($tipo === 'medico' && $isDigitador): ?>
                                        <th class="px-4 py-4 text-left font-bold">Valor Digitador (R$)</th>
                                        <?php endif; ?>
                                    </tr>
                                </thead>
                            <tbody id="examesTableBody" class="bg-white dark:bg-gray-800">
                                    <?php if (empty($exames)): ?>
                                        <tr>
                                        <td colspan="<?php echo $tipo === 'medico' && $isDigitador ? 12 : 11; ?>" class="px-4 py-8 text-center text-gray-500 dark:text-gray-400">
                                            <i class="fas fa-inbox text-4xl mb-2 block"></i>
                                            <?php echo $modoVisualizar ? 'Nenhum exame associado à fatura. Verifique se os exames foram corretamente vinculados.' : 'Nenhum exame encontrado para os filtros selecionados.'; ?>
                                        </td>
                                        </tr>
                                    <?php else: ?>
                                        <?php foreach ($exames as $exame): ?>
                                            <tr class="border-b border-gray-200 dark:border-gray-700 hover:bg-blue-50 dark:hover:bg-blue-900/10 transition-all">
                                                <?php if (!$modoVisualizar): ?>
                                                    <td class="px-4 py-3">
                                                        <label class="relative inline-flex items-center cursor-pointer">
                                                            <input type="checkbox" id="exame_<?php echo htmlspecialchars($exame['ex_pk'] ?? ''); ?>" name="exames[]" value="<?php echo htmlspecialchars($exame['ex_pk'] ?? ''); ?>" 
                                                                   class="w-5 h-5 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600" 
                                                                   checked data-vl-dig="<?php echo htmlspecialchars($exame['ex_vl_dig'] ?? '0'); ?>" data-isdig="<?php echo $exame['ex_isdig'] ? '1' : '0'; ?>">
                                                        </label>
                                                    </td>
                                                <?php endif; ?>
                                                <td class="px-4 py-3 text-gray-700 dark:text-gray-300" title="<?php echo htmlspecialchars($exame['unidade_nome'] ?? ''); ?>"><?php echo htmlspecialchars($exame['unidade_nome'] ?? ''); ?></td>
                                                <td class="px-4 py-3 text-gray-700 dark:text-gray-300" title="<?php echo htmlspecialchars($exame['ex_modalidade'] ?? ''); ?>"><?php echo htmlspecialchars($exame['ex_modalidade'] ?? ''); ?></td>
                                                <td class="px-4 py-3 text-gray-700 dark:text-gray-300" title="<?php echo htmlspecialchars($exame['ex_estudo'] ?? ''); ?>"><?php echo htmlspecialchars($exame['ex_estudo'] ?? ''); ?></td>
                                                <td class="px-4 py-3 text-gray-700 dark:text-gray-300" title="<?php echo htmlspecialchars($exame['ex_paciente'] ?? ''); ?>"><?php echo htmlspecialchars($exame['ex_paciente'] ?? ''); ?></td>
                                                <td class="px-4 py-3 text-gray-700 dark:text-gray-300" title="<?php echo htmlspecialchars($exame['ex_prioridade'] ?? ''); ?>"><?php echo htmlspecialchars($exame['ex_prioridade'] ?? ''); ?></td>
                                                <td class="px-4 py-3">
                                                    <span class="inline-block px-2 py-1 rounded text-xs font-semibold bg-yellow-100 text-yellow-700 dark:bg-yellow-900 dark:text-yellow-300" title="<?php echo htmlspecialchars($exame['ex_status'] ?? ''); ?>">
                                                        <?php echo htmlspecialchars($exame['ex_status'] ?? ''); ?>
                                                    </span>
                                                </td>
                                                <td class="px-4 py-3 text-gray-600 dark:text-gray-400"><?php echo date('d/m/Y', strtotime($exame['ex_data_ex'])); ?></td>
                                                <td class="px-4 py-3 text-gray-600 dark:text-gray-400"><?php echo $exame['ex_data_concl'] ? date('d/m/Y', strtotime($exame['ex_data_concl'])) : 'Não concluído'; ?></td>
                                                <td class="px-4 py-3 text-gray-700 dark:text-gray-300" title="<?php echo htmlspecialchars($exame['profissional_nome'] ?? ''); ?>"><?php echo htmlspecialchars($exame['profissional_nome'] ?? ''); ?></td>
                                                <td class="px-4 py-3 font-mono font-semibold text-gray-900 dark:text-white">R$ <?php echo number_format((float)($exame['ex_val'] ?? 0), 2, ',', '.'); ?></td>
                                                <?php if ($tipo === 'medico' && $isDigitador): ?>
                                                    <td class="px-4 py-3 font-mono font-semibold text-gray-900 dark:text-white">R$ <?php echo $exame['ex_isdig'] ? number_format((float)($exame['ex_vl_dig'] ?? 0), 2, ',', '.') : '0,00'; ?></td>
                                                <?php endif; ?>
                                            </tr>
                                        <?php endforeach; ?>
                                    <?php endif; ?>
                                </tbody>
                            </table>
                    </div>
                    <!-- Paginação -->
                    <?php if (!empty($exames) && count($exames) > 0): ?>
                    <div id="paginationContainer" class="mt-4 flex items-center justify-between">
                        <div class="text-sm text-gray-600 dark:text-gray-400">
                            Mostrando <span id="paginaInicio">1</span> - <span id="paginaFim"><?php echo min(50, count($exames)); ?></span> de <span id="totalRegistros"><?php echo count($exames); ?></span> exames
                        </div>
                        <div class="flex items-center gap-2" id="paginationControls">
                            <button type="button" id="paginaAnterior" class="px-4 py-2 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-300 dark:hover:bg-gray-600 disabled:opacity-50 disabled:cursor-not-allowed transition-all" disabled>
                                <i class="fas fa-chevron-left"></i> Anterior
                            </button>
                            <span id="paginaInfo" class="px-4 py-2 text-gray-700 dark:text-gray-300 font-semibold">Página 1</span>
                            <button type="button" id="paginaProxima" class="px-4 py-2 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-300 dark:hover:bg-gray-600 disabled:opacity-50 disabled:cursor-not-allowed transition-all" <?php echo count($exames) <= 50 ? 'disabled' : ''; ?>>
                                Próxima <i class="fas fa-chevron-right"></i>
                            </button>
                        </div>
                        <div class="flex items-center gap-2">
                            <label class="text-sm text-gray-600 dark:text-gray-400">Itens por página:</label>
                            <select id="itensPorPagina" class="px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-700 dark:text-gray-300">
                                <option value="50">50</option>
                                <option value="100">100</option>
                                <option value="200">200</option>
                                <option value="500">500</option>
                            </select>
                        </div>
                    </div>
                    <?php endif; ?>
                    <div class="mt-6 pt-6 border-t-2 border-gray-200 dark:border-gray-700 flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
                        <div class="flex flex-wrap gap-4 text-sm">
                            <span class="font-semibold text-gray-700 dark:text-gray-300">Total de Exames: <span class="text-blue-600 dark:text-blue-400"><?php echo $totalExames; ?></span></span>
                            <span class="font-semibold text-gray-700 dark:text-gray-300">Total Valor: <span class="text-green-600 dark:text-green-400">R$ <?php echo number_format($totalValor, 2, ',', '.'); ?></span></span>
                                    <?php if ($tipo === 'medico' && $isDigitador): ?>
                                <span class="font-semibold text-gray-700 dark:text-gray-300">Valor Digitador: <span class="text-purple-600 dark:text-purple-400">R$ <?php echo number_format($fat_val_dig, 2, ',', '.'); ?></span></span>
                                <span class="font-semibold text-gray-700 dark:text-gray-300">Valor Líquido: <span class="text-green-600 dark:text-green-400">R$ <?php echo number_format($totalValorLiquido, 2, ',', '.'); ?></span></span>
                                    <?php endif; ?>
                            <span id="desconto_aplicado" class="hidden font-semibold text-gray-700 dark:text-gray-300">Desconto Aplicado: <span class="text-red-600 dark:text-red-400">R$ 0,00</span></span>
                            <span id="valor_liquido_final" class="hidden font-semibold text-gray-700 dark:text-gray-300">Valor Líquido Final: <span class="text-green-600 dark:text-green-400">R$ 0,00</span></span>
                                </div>
                                <?php if (!$modoVisualizar): ?>
                            <button type="button" 
                                    class="px-8 py-4 bg-gradient-to-r <?php echo $totalExames == 0 ? 'from-gray-400 to-gray-500 cursor-not-allowed' : 'from-green-500 to-green-600 hover:shadow-xl hover:-translate-y-1'; ?> text-white rounded-2xl font-bold transition-all" 
                                    id="confirmar_fatura" 
                                    <?php echo $totalExames == 0 ? 'disabled' : ''; ?>>
                                <i class="fas fa-check-circle mr-2"></i>Concluir Fatura
                            </button>
                                <?php endif; ?>
                            </div>
                    <span id="exames_error" class="text-red-600 text-sm mt-2 block"></span>
                        </form>
            </div>
        </div>
    </main>
    <script src="js/script.js"></script>
    <script>
        // Sistema de Paginação
        let paginaAtual = 1;
        let itensPorPagina = 50;
        let todasLinhas = [];

        function inicializarPaginação() {
            const tbody = document.getElementById('examesTableBody');
            if (!tbody) return;

            todasLinhas = Array.from(tbody.querySelectorAll('tr'));
            const totalItens = todasLinhas.length;

            // Se não houver linhas ou menos de 50, não precisa de paginação
            if (totalItens === 0 || totalItens <= 50) {
                const paginationContainer = document.getElementById('paginationContainer');
                if (paginationContainer) {
                    paginationContainer.style.display = 'none';
                }
                return;
            }

            mostrarPagina(1);
        }

        function mostrarPagina(pagina) {
            const inicio = (pagina - 1) * itensPorPagina;
            const fim = inicio + itensPorPagina;

            todasLinhas.forEach((linha, index) => {
                if (index >= inicio && index < fim) {
                    linha.style.display = '';
                } else {
                    linha.style.display = 'none';
                }
            });

            // Atualizar controles de paginação
            const totalPaginas = Math.ceil(todasLinhas.length / itensPorPagina);
            const paginaInfo = document.getElementById('paginaInfo');
            const paginaInicio = document.getElementById('paginaInicio');
            const paginaFim = document.getElementById('paginaFim');
            const paginaAnterior = document.getElementById('paginaAnterior');
            const paginaProxima = document.getElementById('paginaProxima');

            if (paginaInfo) paginaInfo.textContent = `Página ${pagina} de ${totalPaginas}`;
            if (paginaInicio) paginaInicio.textContent = inicio + 1;
            if (paginaFim) paginaFim.textContent = Math.min(fim, todasLinhas.length);

            if (paginaAnterior) {
                paginaAnterior.disabled = pagina === 1;
            }
            if (paginaProxima) {
                paginaProxima.disabled = pagina >= totalPaginas;
            }

            paginaAtual = pagina;
        }

        function configurarEventosPaginação() {
            const paginaAnterior = document.getElementById('paginaAnterior');
            const paginaProxima = document.getElementById('paginaProxima');
            const itensPorPaginaSelect = document.getElementById('itensPorPagina');

            if (paginaAnterior) {
                paginaAnterior.addEventListener('click', function() {
                    if (paginaAtual > 1) {
                        mostrarPagina(paginaAtual - 1);
                        // Scroll para o topo da tabela
                        document.getElementById('examesTable')?.scrollIntoView({ behavior: 'smooth', block: 'start' });
                    }
                });
            }

            if (paginaProxima) {
                paginaProxima.addEventListener('click', function() {
                    const totalPaginas = Math.ceil(todasLinhas.length / itensPorPagina);
                    if (paginaAtual < totalPaginas) {
                        mostrarPagina(paginaAtual + 1);
                        // Scroll para o topo da tabela
                        document.getElementById('examesTable')?.scrollIntoView({ behavior: 'smooth', block: 'start' });
                    }
                });
            }

            if (itensPorPaginaSelect) {
                itensPorPaginaSelect.addEventListener('change', function() {
                    itensPorPagina = parseInt(this.value);
                    mostrarPagina(1);
                    // Scroll para o topo da tabela
                    document.getElementById('examesTable')?.scrollIntoView({ behavior: 'smooth', block: 'start' });
                });
            }
        }

        document.addEventListener('DOMContentLoaded', function() {
            console.log('Página carregada: SelecionarExames.php às ' + new Date().toLocaleString());
            
            // Mostrar loading durante o carregamento inicial (já está sendo renderizado no HTML)
            // Quando a página estiver totalmente carregada, esconder o loading
            const loadingExames = document.getElementById('loadingExames');
            
            // Função para esconder loading e inicializar paginação
            function finalizarCarregamento() {
                if (loadingExames) {
                    loadingExames.style.display = 'none';
                }
                // Inicializar paginação após o carregamento
                inicializarPaginação();
                configurarEventosPaginação();
            }

            // Esconder loading quando a página estiver totalmente carregada
            if (document.readyState === 'complete') {
                setTimeout(finalizarCarregamento, 300);
            } else {
                window.addEventListener('load', function() {
                    setTimeout(finalizarCarregamento, 300);
                });
            }
            console.log('URL completa: <?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?>');
            console.log('Parâmetros GET:', {
                modo: '<?php echo isset($_GET['modo']) ? $_GET['modo'] : 'Não definido'; ?>',
                fat_id: '<?php echo $fat_id ?? 'Nenhum'; ?>',
                mensagem: '<?php echo isset($_GET['mensagem']) ? $_GET['mensagem'] : 'Nenhuma'; ?>',
                fatCod: '<?php echo isset($_GET['fatCod']) ? $_GET['fatCod'] : 'Nenhum'; ?>'
            });
            console.log('Modo visualizar: <?php echo $modoVisualizar ? "true" : "false"; ?>');
            console.log('Fatura: <?php echo json_encode($fatura); ?>');
            console.log('Exames: <?php echo json_encode(array_map(function($e) { return ['ex_pk' => $e['ex_pk'], 'ex_val' => $e['ex_val'], 'ex_vl_dig' => $e['ex_vl_dig'] ?? 0, 'ex_isdig' => $e['ex_isdig'] ?? false]; }, $exames)); ?>');
            // Função para aplicar máscara de data
            function aplicarMascaraData(input) {
                input.addEventListener('input', function(e) {
                    let value = e.target.value.replace(/\D/g, '');
                    if (value.length > 8) value = value.slice(0, 8);
                    if (value.length >= 5) {
                        value = value.replace(/^(\d{2})(\d{2})(\d{4})$/, '$1/$2/$3');
                    } else if (value.length >= 3) {
                        value = value.replace(/^(\d{2})(\d{1,2})$/, '$1/$2');
                    } else if (value.length >= 1) {
                        value = value.replace(/^(\d{1,2})$/, '$1');
                    }
                    e.target.value = value;
                    console.log('Máscara aplicada em ' + e.target.id + ': ' + value);
                });
            }
            // Função para validar data
            function validarData(data) {
                console.log('Validando data: ' + data);
                const regex = /^\d{2}\/\d{2}\/\d{4}$/;
                if (!regex.test(data)) {
                    return { valido: false, mensagem: 'Formato inválido. Use dd/mm/aaaa.' };
                }
                const [dia, mes, ano] = data.split('/').map(Number);
                const dataObj = new Date(ano, mes - 1, dia);
                if (
                    dataObj.getFullYear() !== ano ||
                    dataObj.getMonth() + 1 !== mes ||
                    dataObj.getDate() !== dia
                ) {
                    return { valido: false, mensagem: 'Data inválida: dia, mês ou ano incorretos.' };
                }
                const hoje = new Date();
                hoje.setHours(0, 0, 0, 0);
                if (dataObj <= hoje) {
                    return { valido: false, mensagem: 'A data deve ser futura.' };
                }
                return { valido: true, mensagem: '' };
            }
            // Aplicar máscara
            <?php if (!$modoVisualizar): ?>
                const dataInputs = document.querySelectorAll('#fat_vcto, #data_inicio, #data_fim');
                console.log('Inputs de data encontrados:', dataInputs);
                dataInputs.forEach(input => aplicarMascaraData(input));
            <?php endif; ?>
            // Inicializa select
            // Materialize removido - usando Tailwind CSS
            console.log('Select inicializado com sucesso.');
            // Atualizar resumo por unidade
            function atualizarResumoUnidades() {
                console.log('Atualizando resumo por unidade...');
                const summary = {};
                let totalValor = 0;
                
                <?php if ($modoVisualizar): ?>
                    // No modo visualizar, não há checkboxes, então lemos todas as linhas da tabela
                    const allRows = document.querySelectorAll('#examesTableBody tr');
                    console.log('Linhas encontradas (modo visualizar):', allRows.length);
                    allRows.forEach(row => {
                        if (!row || !row.cells || row.cells.length === 0) return;
                        
                        // Índices das colunas: Unidade(0), ..., Valor(9)
                        const unidadeIndex = 0;
                        const valorIndex = 9;
                        
                        const unidade = row.cells[unidadeIndex]?.textContent.trim() || '';
                        const valorText = row.cells[valorIndex]?.textContent.trim() || '';
                        // Remover "R$ " e formatar para parseFloat (formato: R$ X.XXX,XX)
                        const valorClean = valorText.replace(/R\$\s*/g, '').replace(/\./g, '').replace(',', '.').trim();
                        const valor = parseFloat(valorClean) || 0;
                        
                        console.log('Processando exame (modo visualizar):', { unidade, valorText, valorClean, valor });
                        
                        if (!summary[unidade]) {
                            summary[unidade] = { count: 0, valor: 0, percent: 0 };
                        }
                        summary[unidade].count++;
                        summary[unidade].valor += valor;
                        totalValor += valor;
                    });
                <?php else: ?>
                    const checkboxes = document.querySelectorAll('input[name="exames[]"]:checked');
                    console.log('Checkboxes selecionados:', checkboxes.length);
                checkboxes.forEach(checkbox => {
                    const row = checkbox.closest('tr');
                        if (!row || !row.cells) return;
                        
                        // Índices das colunas: Selecionar(0), Unidade(1), ..., Valor(10 ou 11)
                        const unidadeIndex = 1;
                        const valorIndex = <?php echo ($tipo === 'medico' && $isDigitador ? 11 : 10); ?>;
                        
                        const unidade = row.cells[unidadeIndex]?.textContent.trim() || '';
                        const valorText = row.cells[valorIndex]?.textContent.trim() || '';
                        // Remover "R$ " e formatar para parseFloat (formato: R$ X.XXX,XX)
                        const valorClean = valorText.replace(/R\$\s*/g, '').replace(/\./g, '').replace(',', '.').trim();
                        const valor = parseFloat(valorClean) || 0;
                        
                        console.log('Processando exame:', { unidade, valorText, valorClean, valor });
                        
                    if (!summary[unidade]) {
                        summary[unidade] = { count: 0, valor: 0, percent: 0 };
                    }
                    summary[unidade].count++;
                    summary[unidade].valor += valor;
                    totalValor += valor;
                });
                <?php endif; ?>
                const tbody = document.getElementById('unidadesSummary');
                if (!tbody) {
                    console.error('Tabela unidadesSummary não encontrada!');
                    return summary;
                }
                tbody.innerHTML = '';
                // AJUSTE: Converter para array e ordenar alfabeticamente por nome da unidade
                const summaryArray = Object.entries(summary).sort(([a], [b]) => a.localeCompare(b));
                for (const [unidade, data] of summaryArray) {
                    const percent = totalValor > 0 ? (data.valor / totalValor * 100).toFixed(2) : 0;
                    data.percent = percent;
                    const row = document.createElement('tr');
                    row.className = 'border-b border-gray-200 dark:border-gray-700 hover:bg-blue-50 dark:hover:bg-blue-900/10 transition-all';
                    row.innerHTML = `
                        <td class="px-4 py-3 text-gray-700 dark:text-gray-300">${unidade}</td>
                        <td class="px-4 py-3 text-gray-700 dark:text-gray-300">${data.count}</td>
                        <td class="px-4 py-3 font-mono font-semibold text-gray-900 dark:text-white">R$ ${data.valor.toFixed(2).replace('.', ',')}</td>
                        <td class="px-4 py-3 font-semibold text-blue-600 dark:text-blue-400">${percent}%</td>
                    `;
                    tbody.appendChild(row);
                }
                if (!Object.keys(summary).length) {
                    const row = document.createElement('tr');
                    row.innerHTML = `
                        <td colspan="4" class="px-4 py-8 text-center text-gray-500 dark:text-gray-400">
                            <i class="fas fa-inbox text-4xl mb-2 block"></i>
                            <?php echo $modoVisualizar ? 'Nenhum exame associado à fatura. Verifique se os exames foram corretamente vinculados.' : 'Nenhum exame selecionado.'; ?>
                        </td>
                    `;
                    tbody.appendChild(row);
                }
                console.log('Resumo por unidade atualizado:', summaryArray);
                return summary;
            }
            // Atualizar valor total
            function atualizarValorTotal() {
                console.log('Atualizando valor total...');
                let valorTotal = 0;
                let valorDigitador = 0;
                
                <?php if ($modoVisualizar): ?>
                    // No modo visualizar, não há checkboxes, então lemos todas as linhas da tabela
                    const allRows = document.querySelectorAll('#examesTableBody tr');
                    console.log('Número de linhas encontradas (modo visualizar):', allRows.length);
                    allRows.forEach(row => {
                        if (!row || !row.cells || row.cells.length === 0) return;
                        
                        // Índice da coluna Valor: 9 (sem checkbox no modo visualizar)
                        const valorIndex = 9;
                        const valorText = row.cells[valorIndex]?.textContent.trim() || '';
                        // Remover "R$ " e formatar para parseFloat (formato: R$ X.XXX,XX)
                        const valorClean = valorText.replace(/R\$\s*/g, '').replace(/\./g, '').replace(',', '.').trim();
                        const valor = parseFloat(valorClean) || 0;
                        
                        console.log('Processando valor (modo visualizar):', { valorText, valorClean, valor });
                        valorTotal += valor;
                    });
                <?php else: ?>
                const checkboxes = document.querySelectorAll('input[name="exames[]"]:checked');
                console.log('Número de checkboxes selecionados:', checkboxes.length);
                checkboxes.forEach(checkbox => {
                    const row = checkbox.closest('tr');
                        if (!row || !row.cells) return;
                        
                        // Índice da coluna Valor: 10 (ou 11 se houver valor digitador)
                        const valorIndex = <?php echo ($tipo === 'medico' && $isDigitador ? 11 : 10); ?>;
                        const valorText = row.cells[valorIndex]?.textContent.trim() || '';
                        // Remover "R$ " e formatar para parseFloat (formato: R$ X.XXX,XX)
                        const valorClean = valorText.replace(/R\$\s*/g, '').replace(/\./g, '').replace(',', '.').trim();
                        const valor = parseFloat(valorClean) || 0;
                        
                        console.log('Processando valor:', { valorText, valorClean, valor });
                    valorTotal += valor;
                    <?php if ($tipo === 'medico'): ?>
                        if (document.getElementById('is_digitador') && document.getElementById('is_digitador').checked) {
                            const isDig = checkbox.dataset.isdig === '1';
                                const vlDigText = checkbox.dataset.vlDig || '0';
                                const vlDig = parseFloat(vlDigText.replace(',', '.')) || 0;
                            if (isDig) {
                                valorDigitador += vlDig;
                            }
                        }
                    <?php endif; ?>
                });
                <?php endif; ?>
                let valorLiquido = valorTotal - valorDigitador;
                // Aplicar desconto se ativado
                const aplicarDesconto = document.getElementById('aplicar_desconto')?.checked || false;
                let descontoPercent = aplicarDesconto ? parseFloat(document.getElementById('desconto_percent')?.value.replace(',', '.') || 0) : 0;
                let descontoAplicado = aplicarDesconto ? (valorLiquido * (descontoPercent / 100)) : 0;
                let valorLiquidoFinal = aplicarDesconto ? (valorLiquido - descontoAplicado) : valorLiquido;

                console.log('Valores calculados:', { valorTotal, valorDigitador, valorLiquido, descontoPercent, descontoAplicado, valorLiquidoFinal });

                const fatValField = document.getElementById('fat_val');
                if (fatValField) {
                    // Só atualizar se houver valor calculado, caso contrário manter o valor inicial do PHP
                    if (valorLiquidoFinal > 0 || valorTotal > 0) {
                        fatValField.value = 'R$ ' + valorLiquidoFinal.toFixed(2).replace('.', ',');
                        console.log('Valor líquido atualizado no campo fat_val:', valorLiquidoFinal);
                    } else {
                        console.log('Valor líquido é 0, mantendo valor inicial do PHP');
                    }
                }
                <?php if ($tipo === 'medico'): ?>
                    const fatValDigField = document.getElementById('fat_val_dig');
                    if (fatValDigField) {
                        fatValDigField.value = 'R$ ' + valorDigitador.toFixed(2).replace('.', ',');
                    }
                    <?php endif; ?>

                // Atualizar exibição de desconto
                const descontoSpan = document.getElementById('desconto_aplicado');
                const liquidoFinalSpan = document.getElementById('valor_liquido_final');
                if (descontoSpan && liquidoFinalSpan) {
                if (aplicarDesconto && descontoPercent > 0) {
                    descontoSpan.textContent = `Desconto Aplicado: R$ ${descontoAplicado.toFixed(2).replace('.', ',')}`;
                    liquidoFinalSpan.textContent = `Valor Líquido Final: R$ ${valorLiquidoFinal.toFixed(2).replace('.', ',')}`;
                        descontoSpan.classList.remove('hidden');
                        liquidoFinalSpan.classList.remove('hidden');
                } else {
                        descontoSpan.classList.add('hidden');
                        liquidoFinalSpan.classList.add('hidden');
                    }
                }

                const summary = atualizarResumoUnidades();
                console.log('Valor total atualizado:', { 
                    valorTotal, 
                    valorDigitador, 
                    valorLiquido, 
                    descontoPercent, 
                    descontoAplicado, 
                    valorLiquidoFinal, 
                    checkboxes: checkboxes.length,
                    fatValFieldValue: fatValField?.value
                });
                return { valorTotal, valorDigitador, valorLiquido, valorLiquidoFinal, summary, checkboxes: checkboxes.length };
            }
            // Disponibiliza globalmente
            window.atualizarValorTotal = atualizarValorTotal;
            // Função auxiliar para chamar atualizarValorTotal de forma segura
            function chamarAtualizarValorTotal() {
                // SEMPRE usar window.atualizarValorTotal para garantir que use a versão sobrescrita com itens manuais
                const atualizarFn = window.atualizarValorTotal || (typeof atualizarValorTotal !== 'undefined' && typeof atualizarValorTotal === 'function' ? atualizarValorTotal : null);
                if (atualizarFn && typeof atualizarFn === 'function') {
                    return atualizarFn();
                } else {
                    console.warn('atualizarValorTotal não está disponível ainda');
                    return null;
                }
            }
            // Disponibilizar globalmente também
            window.chamarAtualizarValorTotal = chamarAtualizarValorTotal;
            
            // Inicializar e eventos
            <?php if (!$modoVisualizar): ?>
                console.log('Inicializando eventos no modo edição...');
                // Aguardar um pouco para garantir que a tabela esteja renderizada
                setTimeout(function() {
                chamarAtualizarValorTotal();
                }, 100);
                const checkboxes = document.querySelectorAll('input[name="exames[]"]');
                console.log('Total de checkboxes encontrados:', checkboxes.length);
                checkboxes.forEach(checkbox => {
                    checkbox.addEventListener('change', function() {
                        console.log('Checkbox alterado:', { id: this.id, checked: this.checked });
                        chamarAtualizarValorTotal();
                    });
                    checkbox.addEventListener('click', function() {
                        console.log('Checkbox clicado:', {
                            id: this.id,
                            estado: this.checked,
                            valor: this.value
                        });
                    });
                });
                <?php if ($tipo === 'medico'): ?>
                    if (document.getElementById('is_digitador')) {
                        document.getElementById('is_digitador').addEventListener('change', function() {
                            console.log('Switch is_digitador alterado:', { checked: this.checked });
                            // Mostrar/ocultar campo de valor digitador
                            const fatValDigContainer = document.getElementById('fat_val_dig_container');
                            if (fatValDigContainer) {
                                if (this.checked) {
                                    fatValDigContainer.classList.remove('hidden');
                                } else {
                                    fatValDigContainer.classList.add('hidden');
                                }
                            }
                            chamarAtualizarValorTotal();
                        });
                    }
                <?php endif; ?>
                const aplicarDescontoCheckbox = document.getElementById('aplicar_desconto');
                if (aplicarDescontoCheckbox) {
                    aplicarDescontoCheckbox.addEventListener('change', function() {
                        const descontoContainer = document.getElementById('desconto_container');
                        if (descontoContainer) {
                            if (this.checked) {
                                descontoContainer.classList.remove('hidden');
                            } else {
                                descontoContainer.classList.add('hidden');
                            }
                        }
                        chamarAtualizarValorTotal();
                    });
                    // Inicializar estado inicial
                    const descontoContainer = document.getElementById('desconto_container');
                    if (descontoContainer && aplicarDescontoCheckbox.checked) {
                        descontoContainer.classList.remove('hidden');
                    }
                }
                if (document.getElementById('desconto_percent')) {
                    document.getElementById('desconto_percent').addEventListener('input', function() {
                        chamarAtualizarValorTotal();
                    });
                }
                document.getElementById('confirmar_fatura').addEventListener('click', function(e) {
                    e.preventDefault();
                    console.log('Botão Concluir Fatura clicado. Iniciando validação...');
                    const fatVcto = document.getElementById('fat_vcto').value;
                    const examesSelecionados = document.querySelectorAll('input[name="exames[]"]:checked').length;
                    const fatVctoError = document.getElementById('fat_vcto_error');
                    const examesError = document.getElementById('exames_error');
                    console.log('Valores iniciais:', { fatVcto, examesSelecionados });
                    if (fatVctoError) fatVctoError.textContent = '';
                    if (examesError) examesError.textContent = '';
                    if (!fatVcto) {
                        if (fatVctoError) fatVctoError.textContent = 'Por favor, informe a data de vencimento.';
                        console.log('Erro: Data de vencimento ausente.');
                        return;
                    }
                    const validacaoData = validarData(fatVcto);
                    if (!validacaoData.valido) {
                        if (fatVctoError) fatVctoError.textContent = validacaoData.mensagem;
                        console.log('Erro na validação da data:', validacaoData.mensagem);
                        return;
                    }
                    if (examesSelecionados === 0) {
                        if (examesError) examesError.textContent = 'Por favor, selecione pelo menos um exame.';
                        console.log('Erro: Nenhum exame selecionado.');
                        return;
                    }
                    const faturaForm = document.getElementById('faturaForm');
                    const examesForm = document.getElementById('examesForm');
                    const formData = new FormData(faturaForm);
                    const examesData = new FormData(examesForm);
                    for (let [name, value] of examesData) {
                        formData.append(name, value);
                    }
                    formData.append('confirmar_fatura', 'true');
                    const atualizarFn = window.atualizarValorTotal || (typeof atualizarValorTotal === 'function' ? atualizarValorTotal : null);
                    if (!atualizarFn) {
                        alert('Erro: Função atualizarValorTotal não está disponível. Recarregue a página.');
                        return;
                    }
                    
                    // Forçar atualização antes de pegar os valores
                    const resultadoAtualizado = atualizarFn();
                    const { summary, valorDigitador, resumo } = resultadoAtualizado;
                    
                    // Usar o resumo que inclui itens manuais (resumo) ou o summary original se não houver resumo
                    const unidadesSummaryFinal = resumo || summary || {};
                    
                    // Garantir que os percentuais somem exatamente 100%
                    const unidadesKeys = Object.keys(unidadesSummaryFinal);
                    if (unidadesKeys.length > 0) {
                        let somaPercentuais = 0;
                        unidadesKeys.forEach(k => {
                            somaPercentuais += parseFloat(unidadesSummaryFinal[k].percent) || 0;
                        });
                        
                        // Se a soma não for exatamente 100%, ajustar a última unidade
                        if (Math.abs(somaPercentuais - 100) > 0.01 && unidadesKeys.length > 0) {
                            const ultimaUnidade = unidadesKeys[unidadesKeys.length - 1];
                            const diferenca = 100 - somaPercentuais;
                            const percentAtual = parseFloat(unidadesSummaryFinal[ultimaUnidade].percent) || 0;
                            unidadesSummaryFinal[ultimaUnidade].percent = Math.round((percentAtual + diferenca) * 100) / 100;
                            console.log('Ajustando percentual da última unidade:', ultimaUnidade, 'diferença:', diferenca);
                        }
                        
                        // Verificar novamente após ajuste e garantir que percentuais sejam números
                        unidadesKeys.forEach(k => {
                            unidadesSummaryFinal[k].percent = parseFloat(unidadesSummaryFinal[k].percent) || 0;
                        });
                        let somaFinal = 0;
                        unidadesKeys.forEach(k => {
                            somaFinal += unidadesSummaryFinal[k].percent;
                        });
                        console.log('Percentuais finais (deve somar 100%):', somaFinal.toFixed(2), unidadesKeys.map(k => {
                            const perc = parseFloat(unidadesSummaryFinal[k].percent) || 0;
                            return `${k}: ${perc.toFixed(2)}%`;
                        }));
                    }
                    
                    // Garantir que o campo fat_val tenha o valor correto com itens manuais
                    const fatValField = document.getElementById('fat_val');
                    if (fatValField) {
                        // Se a função retornou valLiquidoFinal (com itens manuais), usar esse valor
                        const valorFinal = resultadoAtualizado.valLiquidoFinal || parseFloat(fatValField.value.replace(',', '.')) || 0;
                        formData.set('fat_val', valorFinal.toFixed(2).replace('.', ','));
                        console.log('Valor fat_val sendo enviado:', valorFinal.toFixed(2).replace('.', ','));
                    } else {
                        // Se não encontrou o campo, usar o valor do formulário
                        const formVal = document.querySelector('input[name="fat_val"]')?.value || '0,00';
                        formData.set('fat_val', formVal);
                        console.log('Valor fat_val do formulário:', formVal);
                    }
                    
                    // Garantir que itens manuais sejam enviados
                    if (window.syncItensManuaisHidden && typeof window.syncItensManuaisHidden === 'function') {
                        window.syncItensManuaisHidden();
                    }
                    const itensManuaisHidden = document.getElementById('itens_manuais');
                    if (itensManuaisHidden && itensManuaisHidden.value) {
                        formData.set('itens_manuais', itensManuaisHidden.value);
                        console.log('Itens manuais sendo enviados:', itensManuaisHidden.value);
                    }
                    
                    formData.append('unidades_summary', JSON.stringify(unidadesSummaryFinal));
                    formData.append('fat_val_dig', valorDigitador.toFixed(2));
                    const formDataEntries = Array.from(formData.entries());
                    console.log('Dados do formulário enviados:', formDataEntries);
                    const btn = this;
                    btn.disabled = true;
                    btn.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>Processando...';
                    console.log('Enviando requisição para ProcessarFatura.php...');
                    // Mostrar spinner
                    const spinner = document.getElementById('loadingSpinner');
                    spinner.classList.add('active');
                    fetch('ProcessarFatura.php', {
                        method: 'POST',
                        body: formData,
                        credentials: 'same-origin'
                    })
                    .then(response => {
                        console.log('Resposta do servidor recebida:', {
                            status: response.status,
                            statusText: response.statusText
                        });
                        if (!response.ok) {
                            throw new Error(`Erro na resposta do servidor: ${response.status} ${response.statusText}`);
                        }
                        return response.text().then(text => {
                            console.log('Texto bruto da resposta:', text);
                            try {
                                return JSON.parse(text);
                            } catch (e) {
                                throw new Error(`Erro ao parsear JSON: ${e.message} (Resposta: ${text})`);
                            }
                        });
                    })
                    .then(data => {
                        console.log('Dados JSON recebidos:', data);
                        console.log('Logs do servidor:', data.logs);
                        spinner.classList.remove('active');
                        btn.disabled = false;
                        btn.innerHTML = '<i class="fas fa-check-circle mr-2"></i>Concluir Fatura';
                        console.log('Botão reativado.');
                        let mensagemDiv = document.querySelector('.mensagem-container');
                        if (!mensagemDiv) {
                            mensagemDiv = document.createElement('div');
                            mensagemDiv.classList.add('mensagem-container', 'card', 'text-center');
                            document.querySelector('.card-container').prepend(mensagemDiv);
                        }
                        if (data.status === 'success' && data.fatCod) {
                            console.log('Fatura processada com sucesso:', data.message);
                            mensagemDiv.innerHTML = `<p>${data.message}</p>`;
                            mensagemDiv.classList.remove('red-text', 'yellow-text');
                            mensagemDiv.classList.add('green-text');
                            // Limpa os campos do formulário
                            document.getElementById('fat_vcto').value = '';
                            document.getElementById('observacoes').value = '';
                            document.querySelector('.char-counter').textContent = '0/500';
                            const atualizarFn = window.atualizarValorTotal || (typeof atualizarValorTotal === 'function' ? atualizarValorTotal : null);
                            if (atualizarFn) atualizarFn();
                            // Redireciona após 3 segundos
                            setTimeout(() => {
                                window.location.href = `SelecionarExames.php?modo=visualizar&fat_id=${encodeURIComponent(data.fatCod)}&mensagem=success&fatCod=${encodeURIComponent(data.fatCod)}`;
                            }, 3000);
                        } else {
                            console.error('Erro retornado pelo servidor:', data.message);
                            mensagemDiv.innerHTML = `<p>Erro: ${data.message || 'Falha ao processar a fatura'}</p>`;
                            mensagemDiv.classList.remove('green-text', 'yellow-text');
                            mensagemDiv.classList.add('red-text');
                            setTimeout(() => {
                                window.location.href = `SelecionarExames.php?mensagem=error&error=${encodeURIComponent(data.message || 'Falha ao processar a fatura')}`;
                            }, 3000);
                        }
                    })
                    .catch(error => {
                        console.error('Erro na requisição:', {
                            message: error.message,
                            stack: error.stack
                        });
                        spinner.classList.remove('active');
                        btn.disabled = false;
                        btn.innerHTML = '<i class="fas fa-check-circle mr-2"></i>Concluir Fatura';
                        let mensagemDiv = document.querySelector('.mensagem-container');
                        if (!mensagemDiv) {
                            mensagemDiv = document.createElement('div');
                            mensagemDiv.classList.add('mensagem-container', 'card', 'red-text', 'text-center');
                            document.querySelector('.card-container').prepend(mensagemDiv);
                        }
                        mensagemDiv.innerHTML = `<p>Erro interno: ${error.message}</p>`;
                        setTimeout(() => {
                            window.location.href = `SelecionarExames.php?mensagem=error&error=${encodeURIComponent('Erro interno no servidor: ' + error.message)}`;
                        }, 3000);
                    });
                });
            <?php endif; ?>
            // Toggle para desconto
            if (document.getElementById('aplicar_desconto')) {
                document.getElementById('aplicar_desconto').addEventListener('change', function() {
                    document.getElementById('desconto_container').style.display = this.checked ? 'block' : 'none';
                    const atualizarFn = window.atualizarValorTotal || (typeof atualizarValorTotal === 'function' ? atualizarValorTotal : null);
                    if (atualizarFn) atualizarFn();
                });
            }
            // Excluir fatura
            <?php if ($modoVisualizar): ?>
                document.getElementById('excluir_fatura').addEventListener('click', function(e) {
                    e.preventDefault();
                    console.log('Botão Excluir Fatura clicado. Iniciando confirmação...');
                    if (!confirm('Tem certeza que deseja excluir esta fatura? Esta ação não pode ser desfeita.')) {
                        console.log('Confirmação cancelada pelo usuário.');
                        return;
                    }
                    const formData = new FormData();
                    formData.append('excluir_fatura', 'true');
                    formData.append('csrf_token', '<?php echo htmlspecialchars($_SESSION['csrf_token']); ?>');
                    const btn = this;
                    btn.disabled = true;
                    btn.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>Excluindo...';
                    console.log('Enviando requisição para excluir fatura...');
                    fetch(window.location.href, {
                        method: 'POST',
                        body: formData,
                        credentials: 'same-origin'
                    })
                    .then(response => {
                        console.log('Resposta do servidor recebida:', {
                            status: response.status,
                            statusText: response.statusText
                        });
                        if (!response.ok) {
                            throw new Error(`Erro na resposta do servidor: ${response.status} ${response.statusText}`);
                        }
                        return response.text().then(text => {
                            console.log('Texto bruto da resposta:', text);
                            try {
                                return JSON.parse(text);
                            } catch (e) {
                                throw new Error(`Erro ao parsear JSON: ${e.message} (Resposta: ${text})`);
                            }
                        });
                    })
                    .then(data => {
                        console.log('Dados JSON recebidos:', data);
                        console.log('Logs do servidor:', data.logs);
                        btn.disabled = false;
                        btn.innerHTML = '<i class="fas fa-trash mr-2"></i>Excluir';
                        console.log('Botão reativado.');
                        if (data.status === 'success') {
                            console.log('Fatura excluída com sucesso:', data.message);
                            window.location.href = `CadastrarFatura.php?mensagem=success&action=deleted`;
                        } else {
                            console.error('Erro retornado pelo servidor:', data.message);
                            window.location.href = `CadastrarFatura.php?mensagem=error&error=${encodeURIComponent(data.message)}`;
                        }
                    })
                    .catch(error => {
                        console.error('Erro na requisição:', {
                            message: error.message,
                            stack: error.stack
                        });
                        btn.disabled = false;
                        btn.innerHTML = '<i class="fas fa-trash mr-2"></i>Excluir';
                        window.location.href = `CadastrarFatura.php?mensagem=error&error=${encodeURIComponent('Erro interno no servidor: ' + error.message)}`;
                    });
                });
            <?php endif; ?>
            // Verificar mensagem de sucesso ao carregar
            const urlParams = new URLSearchParams(window.location.search);
            if (urlParams.get('mensagem') === 'success' && urlParams.get('fatCod')) {
                console.log('Mensagem de sucesso detectada na URL:', urlParams.get('fatCod'));
                let mensagemDiv = document.querySelector('.mensagem-container');
                if (!mensagemDiv) {
                    mensagemDiv = document.createElement('div');
                    mensagemDiv.classList.add('mensagem-container', 'card', 'text-center');
                    document.querySelector('.card-container').prepend(mensagemDiv);
                }
                mensagemDiv.innerHTML = `<p>Fatura concluída com sucesso! Código: ${urlParams.get('fatCod')}</p>`;
                mensagemDiv.classList.remove('red-text', 'yellow-text');
                mensagemDiv.classList.add('green-text');
            } else if (urlParams.get('mensagem') === 'error' && urlParams.get('error')) {
                console.log('Mensagem de erro detectada na URL:', urlParams.get('error'));
                let mensagemDiv = document.querySelector('.mensagem-container');
                if (!mensagemDiv) {
                    mensagemDiv = document.createElement('div');
                    mensagemDiv.classList.add('mensagem-container', 'card', 'text-center');
                    document.querySelector('.card-container').prepend(mensagemDiv);
                }
                mensagemDiv.innerHTML = `<p>Erro: ${urlParams.get('error')}</p>`;
                mensagemDiv.classList.remove('green-text', 'yellow-text');
                mensagemDiv.classList.add('red-text');
            }
        });
    </script>
    <script>
    // ... existing code ...
    // INÍCIO DO BLOCO DE ITENS MANUAIS
    // Só ativa no modo edição
    <?php if (!$modoVisualizar): ?>
    document.addEventListener('DOMContentLoaded', function() {
    let itensManuais = [];

    function syncItensManuaisHidden() {
      const hidden = document.getElementById('itens_manuais');
      if (hidden) hidden.value = JSON.stringify(itensManuais);
    }
    // Tornar a função global para ser acessível de outros escopos
    window.syncItensManuaisHidden = syncItensManuaisHidden;

    // Exibe o toggle de desconto no card de item manual quando desconto geral está ativado
    function controlarToggleDescontoManual() {
      const aplicarDesconto = document.getElementById('aplicar_desconto')?.checked || false;
      const toggleDescontoManual = document.getElementById('toggle-desconto-manual');
      if (toggleDescontoManual) {
        if (aplicarDesconto) {
          toggleDescontoManual.classList.remove('hidden');
        } else {
          toggleDescontoManual.classList.add('hidden');
        }
      }
    }
    const aplicarDescontoCheckbox2 = document.getElementById('aplicar_desconto');
    if (aplicarDescontoCheckbox2) {
      aplicarDescontoCheckbox2.addEventListener('change', controlarToggleDescontoManual);
      controlarToggleDescontoManual(); // Aciona na carga
    }
    // Controlar visibilidade do select de unidade para rateio único
    function controlarSelectUnidadeRateio() {
      const radioProporcional = document.getElementById('rateio_proporcional_radio');
      const radioUnico = document.getElementById('rateio_unico_radio');
      const optionProporcional = document.getElementById('option-proporcional');
      const optionUnico = document.getElementById('option-unico');
      const selectContainer = document.getElementById('select-unidade-rateio-unico');
      
      const rateioProporcional = radioProporcional?.checked || false;
      
      // Atualizar estilos visuais das opções
      if (optionProporcional && optionUnico) {
        if (rateioProporcional) {
          optionProporcional.classList.add('rateio-selected', 'border-blue-500', 'bg-blue-50', 'dark:bg-blue-900/20');
          optionProporcional.classList.remove('border-gray-300', 'dark:border-gray-600', 'bg-gray-50', 'dark:bg-gray-700');
          optionUnico.classList.remove('rateio-selected', 'border-blue-500', 'bg-blue-50', 'dark:bg-blue-900/20');
          optionUnico.classList.add('border-gray-300', 'dark:border-gray-600', 'bg-gray-50', 'dark:bg-gray-700');
        } else {
          optionUnico.classList.add('rateio-selected', 'border-blue-500', 'bg-blue-50', 'dark:bg-blue-900/20');
          optionUnico.classList.remove('border-gray-300', 'dark:border-gray-600', 'bg-gray-50', 'dark:bg-gray-700');
          optionProporcional.classList.remove('rateio-selected', 'border-blue-500', 'bg-blue-50', 'dark:bg-blue-900/20');
          optionProporcional.classList.add('border-gray-300', 'dark:border-gray-600', 'bg-gray-50', 'dark:bg-gray-700');
        }
      }
      
      // Mostrar/ocultar select de unidade
      if (selectContainer) {
        if (rateioProporcional) {
          selectContainer.classList.add('hidden');
        } else {
          selectContainer.classList.remove('hidden');
      }
      }
      
      // Materialize removido - usando Tailwind CSS
      
      // Sincronizar valores nos campos hidden
      const hiddenProporcional = document.getElementById('rateio_proporcional_val');
      const hiddenUnidade = document.getElementById('unidade_rateio_unico_val');
      if (hiddenProporcional) hiddenProporcional.value = rateioProporcional ? '1' : '0';
      if (hiddenUnidade && !rateioProporcional) {
        const selectUnidade = document.getElementById('unidade_rateio_unico');
        hiddenUnidade.value = selectUnidade?.value || '';
      } else if (hiddenUnidade) {
        hiddenUnidade.value = '';
      }
      // Só chama atualizarValorTotal se já estiver definida
      const atualizarFn = window.atualizarValorTotal || (typeof atualizarValorTotal !== 'undefined' && typeof atualizarValorTotal === 'function' ? atualizarValorTotal : null);
      if (atualizarFn) {
        atualizarFn();
      }
    }
    
    // Adicionar eventos aos radio buttons
    const radioProporcional = document.getElementById('rateio_proporcional_radio');
    const radioUnico = document.getElementById('rateio_unico_radio');
    const optionProporcional = document.getElementById('option-proporcional');
    const optionUnico = document.getElementById('option-unico');
    
    if (radioProporcional) {
      radioProporcional.addEventListener('change', controlarSelectUnidadeRateio);
      // Permitir clicar no card inteiro para selecionar
      if (optionProporcional) {
        optionProporcional.addEventListener('click', function(e) {
          if (e.target !== radioProporcional) {
            radioProporcional.checked = true;
            controlarSelectUnidadeRateio();
          }
        });
      }
    }
    
    if (radioUnico) {
      radioUnico.addEventListener('change', controlarSelectUnidadeRateio);
      // Permitir clicar no card inteiro para selecionar
      if (optionUnico) {
        optionUnico.addEventListener('click', function(e) {
          if (e.target !== radioUnico && e.target !== document.getElementById('unidade_rateio_unico')) {
            radioUnico.checked = true;
            controlarSelectUnidadeRateio();
          }
        });
      }
    }
    
    // Inicializar na carga - será chamado depois que atualizarValorTotal estiver definida
    // controlarSelectUnidadeRateio(); // Movido para depois
    if (document.getElementById('unidade_rateio_unico')) {
      document.getElementById('unidade_rateio_unico').addEventListener('change', function() {
        const hiddenUnidade = document.getElementById('unidade_rateio_unico_val');
        if (hiddenUnidade) hiddenUnidade.value = this.value || '';
        const atualizarFn = window.atualizarValorTotal || (typeof atualizarValorTotal !== 'undefined' && typeof atualizarValorTotal === 'function' ? atualizarValorTotal : null);
        if (atualizarFn) {
          atualizarFn();
        }
      });
    }

    // Função para limpar o form de item manual
    function limparItemManualForm() {
      document.getElementById('manual_desc').value = '';
      document.getElementById('manual_quantidade').value = '1';
      document.getElementById('manual_val_unit').value = '';
      document.getElementById('manual_val_total').value = '';
      if(document.getElementById('desconto_item_manual')) document.getElementById('desconto_item_manual').checked = true;
    }

    // Função para adicionar item manual no array e desenhar na tabela
    function adicionarItemManual() {
      console.log('adicionarItemManual chamada');
      const desc = document.getElementById('manual_desc')?.value.trim() || '';
      const quantidade = parseInt(document.getElementById('manual_quantidade')?.value || '1', 10) || 1;
      const vUnitInput = document.getElementById('manual_val_unit')?.value || '0';
      const vTotalInput = document.getElementById('manual_val_total')?.value || '0';
      const vUnit = parseFloat(vUnitInput.replace(',', '.')) || 0;
      const vTotal = parseFloat(vTotalInput.replace(',', '.')) || 0;
      const aplicarDescontoFatura = document.getElementById('aplicar_desconto')?.checked || false;
      const aplicarDescontoManual = aplicarDescontoFatura
        ? (document.getElementById('desconto_item_manual')?.checked || false) : true;
      
      console.log('Valores capturados:', { desc, quantidade, vUnit, vTotal, aplicarDescontoManual });
      
      if (!desc || vUnit <= 0 || vTotal <= 0 || quantidade < 1) {
        alert('Preencha todos os campos corretamente! Descrição, quantidade, valor unitário e valor total são obrigatórios.');
        console.log('Validação falhou:', { desc: !!desc, quantidade, vUnit, vTotal });
        return;
      }
      
      // Validar se rateio único está selecionado e se há unidade escolhida
      const rateioProporcional = document.getElementById('rateio_proporcional_radio')?.checked !== false;
      let unidadeCod = null;
      let unidadeNome = null;
      
      if (!rateioProporcional) {
        const selectUnidade = document.getElementById('unidade_rateio_unico');
        unidadeCod = selectUnidade?.value || '';
        if (!unidadeCod) {
          alert('Para rateio único, é necessário selecionar uma unidade antes de adicionar o item manual.');
          console.log('Validação falhou: Rateio único selecionado mas nenhuma unidade escolhida');
          return;
        }
        // Capturar o nome da unidade
        const selectedOption = selectUnidade.options[selectUnidade.selectedIndex];
        unidadeNome = selectedOption?.getAttribute('data-nome') || selectedOption?.textContent?.trim() || '';
        console.log('Item manual com rateio único - unidade:', { unidadeCod, unidadeNome });
      }
      
      // Adicionar múltiplas linhas baseado na quantidade
      for (let i = 0; i < quantidade; i++) {
      itensManuais.push({
          ex_pk:`manual_${Date.now()}_${i}`,
        descricao: desc,
          quantidade: 1,
        valor_unit: vUnit,
        valor_total: vTotal,
        aplicar_desconto: aplicarDescontoManual,
        ex_item_manual: true,
        unidade_cod: unidadeCod, // Para rateio único: código da unidade selecionada
        unidade_nome: unidadeNome, // Para rateio único: nome da unidade selecionada
        rateio_proporcional: rateioProporcional // Flag para saber o tipo de rateio
      });
      }
      
      console.log('Itens manuais adicionados. Total de itens:', itensManuais.length);
      
      syncItensManuaisHidden();
      desenharItensManuaisNaTabela();
      limparItemManualForm();
      
      // Forçar atualização do resumo imediatamente após adicionar item manual
      // Primeiro desenhar na tabela, depois atualizar valores
      setTimeout(() => {
        // SEMPRE usar window.atualizarValorTotal para garantir que use a versão sobrescrita
        const atualizarFn = window.atualizarValorTotal;
        if (atualizarFn && typeof atualizarFn === 'function') {
          console.log('Chamando atualizarValorTotal após adicionar item manual (itens manuais:', itensManuais.length, ')');
          const resultado = atualizarFn();
          console.log('Resultado após atualizar com itens manuais:', resultado);
        } else {
          console.error('window.atualizarValorTotal não está disponível! Tentando novamente...', {
            existe: typeof window.atualizarValorTotal,
            tipo: typeof atualizarValorTotal
          });
          // Se não estiver disponível, tenta novamente após um pequeno delay
          setTimeout(() => {
            const atualizarFn2 = window.atualizarValorTotal;
            if (atualizarFn2 && typeof atualizarFn2 === 'function') {
              console.log('Chamando atualizarValorTotal após delay');
              atualizarFn2();
            } else {
              console.error('Ainda não disponível após delay');
            }
          }, 100);
        }
      }, 50);
      
      alert('Item(s) manual(is) adicionado(s) com sucesso!');
    }

    // Garantir que o evento seja adicionado após o DOM estar pronto
    setTimeout(function() {
    const btnAdicionarManual = document.getElementById('adicionar_item_manual');
    if (btnAdicionarManual) {
      btnAdicionarManual.addEventListener('click', function(e) {
        e.preventDefault();
        console.log('Botão adicionar item manual clicado');
        adicionarItemManual();
      });
      console.log('Event listener adicionado ao botão adicionar_item_manual');
    } else {
      console.error('Botão adicionar_item_manual não encontrado!');
    }
    }, 100);

    // Função para desenhar itens manuais na tabela separada
    function desenharItensManuaisNaTabela() {
      console.log('desenharItensManuaisNaTabela chamada. Itens:', itensManuais.length);
      const tbody = document.getElementById('itens-manuais-tbody');
      const cardTabela = document.getElementById('tabela-itens-manuais-card');
      
      if (!tbody || !cardTabela) {
        console.error('Tabela de itens manuais não encontrada!');
        return;
      }
      
      // Limpar tbody
      tbody.innerHTML = '';
      
      if (itensManuais.length === 0) {
        console.log('Nenhum item manual para desenhar');
        cardTabela.classList.add('hidden');
        return;
      }
      
      // Mostrar o card da tabela
      cardTabela.classList.remove('hidden');
      
      // Desenhar cada item manual
      itensManuais.forEach((item, index) => {
        const tr = document.createElement('tr');
        tr.classList.add('item-manual');
        tr.setAttribute('data-item-id', item.ex_pk);
        
        const tipoRateio = item.rateio_proporcional ? 'Proporcional' : 'Único';
        const unidadeNome = item.unidade_nome || '-';
        
        tr.className = 'border-b border-gray-200 dark:border-gray-700 hover:bg-blue-50 dark:hover:bg-blue-900/10 transition-all';
        tr.innerHTML = `
          <td class="px-4 py-3 text-gray-700 dark:text-gray-300">${item.descricao}</td>
          <td class="px-4 py-3 text-gray-700 dark:text-gray-300 text-center font-semibold">${item.quantidade || 1}</td>
          <td class="px-4 py-3 font-mono font-semibold text-gray-900 dark:text-white">R$ ${parseFloat(item.valor_unit).toFixed(2).replace('.', ',')}</td>
          <td class="px-4 py-3 font-mono font-semibold text-green-600 dark:text-green-400">R$ ${parseFloat(item.valor_total).toFixed(2).replace('.', ',')}</td>
          <td class="px-4 py-3 text-gray-700 dark:text-gray-300">
            <span class="inline-block px-2 py-1 rounded text-xs font-semibold ${tipoRateio === 'Proporcional' ? 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300' : 'bg-purple-100 text-purple-700 dark:bg-purple-900 dark:text-purple-300'}">${tipoRateio}</span>
          </td>
          <td class="px-4 py-3 text-gray-700 dark:text-gray-300">${unidadeNome}</td>
          <td class="px-4 py-3">
            <button type="button" class="px-3 py-2 bg-red-500 hover:bg-red-600 text-white rounded-lg transition-all duration-200 shadow-md hover:shadow-lg focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2" onclick="removerItemManual('${item.ex_pk}')" title="Remover item">
              <i class="fas fa-trash"></i>
            </button>
          </td>
        `;
        
        tbody.appendChild(tr);
      });
      
      console.log(`${itensManuais.length} item(ns) manual(is) desenhado(s) na tabela separada`);
    }
    
    // Função para remover item manual (global para ser acessível via onclick)
    window.removerItemManual = function(itemId) {
      const index = itensManuais.findIndex(item => item.ex_pk === itemId);
      if (index !== -1) {
        itensManuais.splice(index, 1);
        syncItensManuaisHidden();
        desenharItensManuaisNaTabela();
        
        // Atualizar valores após remover
        setTimeout(() => {
          const atualizarFn = window.atualizarValorTotal;
          if (atualizarFn && typeof atualizarFn === 'function') {
            atualizarFn();
          }
        }, 50);
        
        alert('Item manual removido com sucesso!');
      }
    };
    // Altera cálculo dos totais/rateio para incluir itens manuais
    // Aguardar que a função original esteja disponível antes de sobrescrever
    function criarSobrescritaAtualizarValorTotal() {
      const origAtualizarValorTotal = window.atualizarValorTotal;
      
      if (!origAtualizarValorTotal || typeof origAtualizarValorTotal !== 'function') {
        console.warn('atualizarValorTotal original ainda não está disponível, tentando novamente...', { 
          window: typeof window.atualizarValorTotal
        });
        // Tentar novamente após um pequeno delay
        setTimeout(criarSobrescritaAtualizarValorTotal, 100);
        return;
      }
      
      console.log('Função original capturada com sucesso, criando sobrescrita...');
      
      // Criar a nova função sobrescrita
      const novaAtualizarValorTotal = function() {
      console.log('=== atualizarValorTotal SOBRESCRITA chamada ===', { itensManuaisCount: itensManuais.length });
      
      // Chama original para pegar cálculos existentes
      if (!origAtualizarValorTotal || typeof origAtualizarValorTotal !== 'function') {
        console.error('Não é possível chamar atualizarValorTotal original');
        return { valorTotal: 0, valorDigitador: 0, valorLiquido: 0, summary: {} };
      }
      const resultado = origAtualizarValorTotal();
      console.log('Resultado da função original:', resultado);
      // Soma valores dos itens manuais (exibir/bruto/liquido)
      let manualBruto = 0, manualLiquido = 0;
      const aplicarDescontoGeral = document.getElementById('aplicar_desconto')?.checked || false;
      const descontoPercent = aplicarDescontoGeral ? parseFloat(document.getElementById('desconto_percent')?.value.replace(',','.')) || 0 : 0;
      itensManuais.forEach(item => {
        if (aplicarDescontoGeral && item.aplicar_desconto) {
          manualBruto += item.valor_total;
        } else {
          manualLiquido += item.valor_total;
        }
      });
      // Atualiza totais globais na UI
      let valBruto = resultado.valorTotal + manualBruto;
      let valLiquidoComDesconto = (resultado.valorLiquido + manualBruto);
      let descontoAplicado = aplicarDescontoGeral ? (valLiquidoComDesconto * (descontoPercent/100)) : 0;
      let valLiquidoFinal = valLiquidoComDesconto - descontoAplicado + manualLiquido;
      
      console.log('Cálculo de valores com itens manuais:', {
        valorTotalExames: resultado.valorTotal,
        manualBruto,
        manualLiquido,
        valBruto,
        valLiquidoComDesconto,
        descontoAplicado,
        valLiquidoFinal,
        totalItensManuais: itensManuais.length
      });
      
      const fatValField2 = document.getElementById('fat_val');
      if (fatValField2) {
        fatValField2.value = 'R$ ' + valLiquidoFinal.toFixed(2).replace('.',',');
        console.log('Campo fat_val atualizado para:', valLiquidoFinal.toFixed(2).replace('.',','));
      }
      
      // Atualizar todas as informações do resumo na tela
      // Resumo atualizado via atualizarResumoUnidadesManual - não precisa atualizar .summary manualmente
      
      // Atualizar exibição de desconto e valor líquido final
      const descontoSpan2 = document.getElementById('desconto_aplicado');
      const liquidoFinalSpan2 = document.getElementById('valor_liquido_final');
      
      if (descontoSpan2 && liquidoFinalSpan2) {
      if (aplicarDescontoGeral && descontoPercent > 0) {
          descontoSpan2.textContent = `Desconto Aplicado: R$ ${descontoAplicado.toFixed(2).replace('.', ',')}`;
          descontoSpan2.classList.remove('hidden');
          
          liquidoFinalSpan2.textContent = `Valor Líquido Final: R$ ${valLiquidoFinal.toFixed(2).replace('.', ',')}`;
          
          // Adicionar informação sobre itens manuais sem desconto se houver
          if (manualLiquido > 0) {
            liquidoFinalSpan2.textContent += ` (inclui R$ ${manualLiquido.toFixed(2).replace('.', ',')} de itens manuais sem desconto)`;
          }
          
          liquidoFinalSpan2.classList.remove('hidden');
      } else {
          descontoSpan2.classList.add('hidden');
          // Mesmo sem desconto geral, mostrar valor líquido final se houver itens manuais
          if (itensManuais.length > 0) {
            liquidoFinalSpan2.textContent = `Valor Líquido Final: R$ ${valLiquidoFinal.toFixed(2).replace('.', ',')}`;
            if (manualLiquido > 0) {
              liquidoFinalSpan2.textContent += ` (inclui R$ ${manualLiquido.toFixed(2).replace('.', ',')} de itens manuais)`;
            }
            liquidoFinalSpan2.classList.remove('hidden');
          } else {
            liquidoFinalSpan2.classList.add('hidden');
          }
        }
      }
      
      // Chama resumo de unidades e ajusta rateio incluindo os valores dos itens manuais, distribuídos igualmente
      const totalManual = manualBruto + manualLiquido;
      const valorTotalFatura = resultado.valorTotal + totalManual;
      console.log('Chamando atualizarResumoUnidadesManual com:', {
        summaryOriginal: resultado.summary,
        totalManual,
        valorTotalFatura,
        itensManuaisCount: itensManuais.length
      });
      const resumo = atualizarResumoUnidadesManual(resultado.summary, totalManual, valorTotalFatura);
      console.log('Resumo retornado de atualizarResumoUnidadesManual:', resumo);
      return {...resultado, manualBruto, manualLiquido, valBruto, valLiquidoFinal, resumo};
    };
    
    // Atualizar TANTO a variável local quanto a global imediatamente
    // Usar a referência da função original que foi capturada no closure
    window.atualizarValorTotal = novaAtualizarValorTotal;
    
    console.log('Função atualizarValorTotal sobrescrita e disponibilizada globalmente');
    };
    
    // Iniciar a criação da sobrescrita (irá aguardar a função original estar disponível)
    criarSobrescritaAtualizarValorTotal();
    function atualizarResumoUnidadesManual(unidadesOrig, totalManual, valorTotalFatura) {
      let unidades = {};
      // Garantir que unidadesOrig seja um objeto válido
      if (unidadesOrig && typeof unidadesOrig === 'object') {
        unidades = {...unidadesOrig};
      }
      const chaves = Object.keys(unidades);
      const rateioProporcional = document.getElementById('rateio_proporcional_radio')?.checked !== false; // default true
      
      // Se não foi passado valorTotalFatura, calcular a partir dos valores nas unidades + itens manuais
      if (!valorTotalFatura || valorTotalFatura <= 0) {
        const somaUnidades = Object.values(unidades).reduce((a, b) => a + (b.valor || 0), 0);
        valorTotalFatura = somaUnidades + totalManual;
      }
      
      console.log('atualizarResumoUnidadesManual:', { totalManual, valorTotalFatura, rateioProporcional, chaves: chaves.length, unidadesOrig });
      
      if (totalManual > 0) {
        if (rateioProporcional) {
          // Rateio proporcional: distribui igualmente entre as unidades existentes
          if (chaves.length > 0) {
            const fatManualPorUnid = totalManual / chaves.length;
            chaves.forEach(k => {
              if (!unidades[k]) unidades[k] = { count: 0, valor: 0, percent: 0 };
              unidades[k].valor += fatManualPorUnid;
            });
          } else {
            // Se não há unidades no resumo, não distribui (aguarda exames serem selecionados)
            console.log('Rateio proporcional selecionado mas nenhuma unidade no resumo ainda');
          }
        } else {
          // Rateio único: coloca tudo na unidade selecionada
          const selectUnidade = document.getElementById('unidade_rateio_unico');
          if (!selectUnidade) {
            console.warn('Select de unidade para rateio único não encontrado!');
          } else {
            const unidadeCod = selectUnidade.value || '';
            const selectedOption = selectUnidade.options[selectUnidade.selectedIndex];
            
            // Tenta pegar o nome do atributo data-nome, se não funcionar pega o texto da opção
            let unidadeNome = '';
            if (selectedOption) {
              unidadeNome = selectedOption.getAttribute('data-nome') || selectedOption.textContent?.trim() || '';
            }
            
            console.log('Rateio único - unidade selecionada:', { 
              unidadeCod, 
              unidadeNome, 
              optionIndex: selectUnidade.selectedIndex,
              selectedOption: selectedOption,
              allOptions: Array.from(selectUnidade.options).map(o => ({ value: o.value, text: o.textContent, dataNome: o.getAttribute('data-nome') }))
            });
            
            if (unidadeCod && unidadeNome && unidadeCod !== '' && unidadeCod !== '0') {
              // Se a unidade já existe no resumo, soma o valor
              if (unidades[unidadeNome]) {
                unidades[unidadeNome].valor += totalManual;
                console.log('Unidade existente no resumo - valor atualizado:', unidades[unidadeNome].valor);
              } else {
                // Se não existe, adiciona ao resumo
                unidades[unidadeNome] = { count: 0, valor: totalManual, percent: 0 };
                console.log('Nova unidade adicionada ao resumo:', unidadeNome, 'com valor:', totalManual);
              }
              console.log('Estado atual do objeto unidades após adicionar:', Object.keys(unidades));
            } else {
              console.warn('Rateio único selecionado mas nenhuma unidade escolhida ou inválida:', { unidadeCod, unidadeNome, hasSelectedOption: !!selectedOption });
            }
          }
        }
        
        // Recalcular percentuais garantindo que soma 100%
        let totalValorSoma = Object.values(unidades).reduce((a, b) => a + (parseFloat(b.valor) || 0), 0);
        console.log('Total valor soma nas unidades:', totalValorSoma, 'Valor total fatura:', valorTotalFatura);
        
        // Usar valorTotalFatura para calcular percentuais (pode incluir valores que ainda não foram distribuídos)
        const baseCalculo = valorTotalFatura > 0 ? valorTotalFatura : totalValorSoma;
        
        if (baseCalculo > 0 && Object.keys(unidades).length > 0) {
          let totalAdj = 0;
          let lastKey = null;
          const sortedKeys = Object.keys(unidades).sort((a, b) => a.localeCompare(b));
          
          sortedKeys.forEach((k) => {
            const valorUnidade = parseFloat(unidades[k].valor) || 0;
            let perc = (valorUnidade / baseCalculo) * 100;
            unidades[k].percent = Math.round(perc * 100) / 100; // Arredonda para 2 casas
            totalAdj += unidades[k].percent;
            lastKey = k;
          });
          
          // Ajusta diferença para última unidade para fechar exatamente 100%
          if (Math.abs(totalAdj - 100) > 0.01 && lastKey) {
            const diferenca = 100 - totalAdj;
            unidades[lastKey].percent = Math.round((unidades[lastKey].percent + diferenca) * 100) / 100;
            console.log('Ajustando percentual da última unidade no resumo:', lastKey, 'diferença:', diferenca);
            
            // Recalcular total após ajuste
            totalAdj = 0;
            sortedKeys.forEach((k) => {
              totalAdj += unidades[k].percent;
            });
          }
          
          console.log('Percentuais calculados (base:', baseCalculo, ', soma:', totalAdj.toFixed(2), '%):', Object.entries(unidades).map(([k, v]) => {
            const valor = parseFloat(v.valor) || 0;
            const percent = parseFloat(v.percent) || 0;
            return `${k}: ${valor.toFixed(2)} (${percent.toFixed(2)}%)`;
          }));
        } else {
          if (baseCalculo <= 0) {
            console.warn('Base de cálculo é zero ou negativa, não é possível calcular percentuais');
          }
          if (Object.keys(unidades).length === 0) {
            console.warn('Nenhuma unidade no resumo para calcular percentuais');
          }
        }
      }
      
      // Atualiza tabela resumo UI
      const tbody = document.getElementById('unidadesSummary');
      if (!tbody) {
        console.error('Tabela de resumo (unidadesSummary) não encontrada!');
        return unidades;
      }
      
      console.log('ANTES DE ATUALIZAR TABELA - Objeto unidades completo:', unidades);
      console.log('ANTES DE ATUALIZAR TABELA - Chaves do objeto:', Object.keys(unidades));
      console.log('ANTES DE ATUALIZAR TABELA - Valores:', Object.values(unidades));
      
      tbody.innerHTML = '';
      
      if (Object.keys(unidades).length === 0) {
        tbody.innerHTML = '<tr><td colspan="4" class="center">Nenhuma unidade no resumo ainda.</td></tr>';
        console.log('Nenhuma unidade para exibir no resumo');
        return unidades;
      }
      
      console.log('Atualizando tabela de resumo com unidades:', Object.keys(unidades));
      
      Object.entries(unidades).sort(([a], [b]) => a.localeCompare(b)).forEach(([unidade, data]) => {
        // Garantir que valor e percent sejam números válidos
        const valor = parseFloat(data.valor) || 0;
        const percent = parseFloat(data.percent) || 0;
        const count = parseInt(data.count) || 0;
        const row = `<tr><td>${unidade}</td><td>${count}</td><td>${valor.toFixed(2).replace('.', ',')}</td><td>${percent.toFixed(2)}%</td></tr>`;
        tbody.innerHTML += row;
      });
      
      console.log('Tabela de resumo atualizada com', Object.keys(unidades).length, 'unidade(s)');
      return unidades;
    }
    
    // Inicializar controlarSelectUnidadeRateio após todas as funções estarem definidas
    if (typeof controlarSelectUnidadeRateio === 'function') {
      controlarSelectUnidadeRateio();
    }
    
    // Adicionar event listeners para os radio buttons de rateio
    const radioProporcionalBtn = document.getElementById('rateio_proporcional_radio');
    const radioUnicoBtn = document.getElementById('rateio_unico_radio');
    if (radioProporcionalBtn) {
      radioProporcionalBtn.addEventListener('change', controlarSelectUnidadeRateio);
    }
    if (radioUnicoBtn) {
      radioUnicoBtn.addEventListener('change', controlarSelectUnidadeRateio);
    }
    <?php endif; ?>
    }); // Fim do DOMContentLoaded para itens manuais
    </script>
</body>
</html>