<?php
// relatorios.php

// O middleware-auth.php (via authAdministrador) já deve iniciar a sessão.
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

require_once 'middleware-auth.php'; // Garante que apenas administradores autenticados acessem
authAdministrador();

require_once 'conexao.php'; // Fornece $pdo globalmente
require_once 'env.php';     // Carrega $_ENV (conexao.php já deve fazer isso)

$erro_geral_pagina = null;

// Função para obter dados de empresas cadastradas
function getDadosEmpresasRelatorio(PDO $pdo_conn) {
    try {
        $stmt = $pdo_conn->query("SELECT COUNT(*) as total FROM Empresas");
        $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
        return $resultado ? (int)$resultado['total'] : 0;
    } catch (PDOException $e) {
        error_log("Erro ao obter dados de empresas para relatório: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de empresas."];
    }
}

// ** FUNÇÃO REFACTORADA: Agora obtém todos os dados de vagas de uma vez **
function getDadosVagasRelatorio(PDO $pdo_conn) {
    try {
        $data = [
            'vagas_gratuitas' => ['criadas' => 0, 'expiradas' => 0, 'com_candidaturas' => 0],
            'vagas_pagas' => ['criadas' => 0, 'com_candidaturas' => 0]
        ];

        // Consulta para vagas gratuitas
        $sql_gratuitas_criadas = "SELECT COUNT(*) as total FROM anuncio_gratuito";
        $data['vagas_gratuitas']['criadas'] = (int)$pdo_conn->query($sql_gratuitas_criadas)->fetchColumn();
        
        $sql_gratuitas_expiradas = "SELECT COUNT(*) as total FROM anuncio_gratuito WHERE (data_expiracao IS NOT NULL AND data_expiracao < NOW()) OR status = 'expirado'";
        $data['vagas_gratuitas']['expiradas'] = (int)$pdo_conn->query($sql_gratuitas_expiradas)->fetchColumn();
        
        $sql_gratuitas_com_candidaturas = "SELECT COUNT(DISTINCT vaga_id) as total FROM candidaturas WHERE tipo_anuncio = 'gratuito'";
        $data['vagas_gratuitas']['com_candidaturas'] = (int)$pdo_conn->query($sql_gratuitas_com_candidaturas)->fetchColumn();

        // Consulta para vagas pagas
        $sql_pagas_criadas = "SELECT COUNT(*) as total FROM anuncio_pago";
        $data['vagas_pagas']['criadas'] = (int)$pdo_conn->query($sql_pagas_criadas)->fetchColumn();
        
        $sql_pagas_com_candidaturas = "SELECT COUNT(DISTINCT vaga_id) as total FROM candidaturas WHERE tipo_anuncio = 'pago'";
        $data['vagas_pagas']['com_candidaturas'] = (int)$pdo_conn->query($sql_pagas_com_candidaturas)->fetchColumn();

        return $data;
    } catch (PDOException $e) {
        error_log("Erro ao obter dados de vagas para relatório: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de vagas."];
    }
}

// Função para obter o número de novos candidatos registrados por período
function getNovosCandidatosDashboard(PDO $pdo_conn) {
    try {
        // [0] = 7 dias (Usado no relatório semanal)
        $sql_ultimos_7_dias = "SELECT COUNT(*) FROM Candidatos WHERE data_cadastro >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
        $novos_7_dias = (int)$pdo_conn->query($sql_ultimos_7_dias)->fetchColumn();

        // [1] = 30 dias
        $sql_ultimos_30_dias = "SELECT COUNT(*) FROM Candidatos WHERE data_cadastro >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)";
        $novos_30_dias = (int)$pdo_conn->query($sql_ultimos_30_dias)->fetchColumn();
        
        // [2] = 90 dias
        $sql_ultimos_90_dias = "SELECT COUNT(*) FROM Candidatos WHERE data_cadastro >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)";
        $novos_90_dias = (int)$pdo_conn->query($sql_ultimos_90_dias)->fetchColumn();

        return [
            'labels' => ['Últimos 7 dias', 'Últimos 30 dias', 'Últimos 90 dias'],
            'data' => [$novos_7_dias, $novos_30_dias, $novos_90_dias]
        ];

    } catch (PDOException $e) {
        error_log("Erro ao obter dados de novos candidatos para dashboard: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de novos candidatos."];
    }
}

// Função para obter dados de candidatos
function getDadosCandidatosRelatorio(PDO $pdo_conn) {
    try {
        $estado_siglas = [
            'Acre' => 'AC', 'Alagoas' => 'AL', 'Amapa' => 'AP', 'Amazonas' => 'AM', 'Bahia' => 'BA', 'Ceara' => 'CE',
            'Distrito Federal' => 'DF', 'Espirito Santo' => 'ES', 'Goias' => 'GO', 'Maranhao' => 'MA', 'Mato Grosso' => 'MT',
            'Mato Grosso do Sul' => 'MS', 'Minas Gerais' => 'MG', 'Para' => 'PA', 'Paraiba' => 'PB', 'Parana' => 'PR',
            'Pernambuco' => 'PE', 'Piaui' => 'PI', 'Rio de Janeiro' => 'RJ', 'Rio Grande do Norte' => 'RN',
            'Rio Grande do Sul' => 'RS', 'Rondonia' => 'RO', 'Roraima' => 'RR', 'Santa Catarina' => 'SC',
            'Sao Paulo' => 'SP', 'Sergipe' => 'SE', 'Tocantins' => 'TO',
            'AC' => 'AC', 'AL' => 'AL', 'AP' => 'AP', 'AM' => 'AM', 'BA' => 'BA', 'CE' => 'CE', 'DF' => 'DF',
            'ES' => 'ES', 'GO' => 'GO', 'MA' => 'MA', 'MT' => 'MT', 'MS' => 'MS', 'MG' => 'MG', 'PA' => 'PA',
            'PB' => 'PB', 'PR' => 'PR', 'PE' => 'PE', 'PI' => 'PI', 'RJ' => 'RJ', 'RN' => 'RN', 'RS' => 'RS',
            'RO' => 'RO', 'RR' => 'RR', 'SC' => 'SC', 'SP' => 'SP', 'SE' => 'SE', 'TO' => 'TO'
        ];

        // Correção aplicada: 'link_perfil_selflix' para 'link_selflix'
        $sql_videos = "SELECT COUNT(*) as total FROM Candidatos WHERE link_selflix IS NOT NULL AND link_selflix != ''";
        $videos = (int)$pdo_conn->query($sql_videos)->fetchColumn();
        
        $sql_pdf = "SELECT COUNT(DISTINCT candidato_id) as total FROM CandidatoCurriculos";
        $pdf = (int)$pdo_conn->query($sql_pdf)->fetchColumn();
        
        $sql_estados = "SELECT estado, COUNT(*) as total FROM Candidatos WHERE estado IS NOT NULL AND estado != '' GROUP BY estado";
        $stmt_estados = $pdo_conn->query($sql_estados);
        $resultados_estados = $stmt_estados->fetchAll(PDO::FETCH_ASSOC);

        $estados_agregados = [];
        foreach ($resultados_estados as $row) {
            $estado_normalizado = $estado_siglas[str_replace(' ', '', ucwords(strtolower($row['estado'])))] ?? strtoupper($row['estado']);
            $estados_agregados[$estado_normalizado] = ($estados_agregados[$estado_normalizado] ?? 0) + $row['total'];
        }

        arsort($estados_agregados);
        $estados_labels = array_keys(array_slice($estados_agregados, 0, 10));
        $estados_totais = array_values(array_slice($estados_agregados, 0, 10));
        
        return ['videos' => $videos, 'pdf' => $pdf, 'estados_labels' => $estados_labels, 'estados_totais' => $estados_totais];
    } catch (PDOException $e) {
        error_log("Erro ao obter dados de candidatos para relatório: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de candidatos.", 'videos' => 0, 'pdf' => 0, 'estados_labels' => [], 'estados_totais' => []];
    }
}

// Função para obter o número de novos candidatos a partir de um ID específico
function getNovosCandidatosPorId(PDO $pdo_conn, $id_inicio) {
    try {
        $sql = "SELECT COUNT(*) FROM Candidatos WHERE id >= ?";
        $stmt = $pdo_conn->prepare($sql);
        $stmt->execute([$id_inicio]);
        return (int)$stmt->fetchColumn();
    } catch (PDOException $e) {
        error_log("Erro ao obter novos candidatos por ID: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar novos candidatos por ID."];
    }
}

// Função para obter os tipos de vagas mais populares
function getTiposVagasPopularesRelatorio(PDO $pdo_conn) {
    try {
        $sql = "SELECT tipo_vaga_agg as tipo, SUM(total_tipo) as total_geral 
                 FROM (
                     SELECT tipo_vaga as tipo_vaga_agg, COUNT(*) as total_tipo FROM anuncio_gratuito WHERE tipo_vaga IS NOT NULL AND tipo_vaga != '' GROUP BY tipo_vaga
                     UNION ALL
                     SELECT tipo_vaga as tipo_vaga_agg, COUNT(*) as total_tipo FROM anuncio_pago WHERE tipo_vaga IS NOT NULL AND tipo_vaga != '' GROUP BY tipo_vaga
                 ) as combined_types
                 GROUP BY tipo_vaga_agg
                 ORDER BY total_geral DESC
                 LIMIT 10";
        $stmt = $pdo_conn->query($sql);
        return $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
    } catch (PDOException $e) {
        error_log("Erro ao obter tipos de vagas populares: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de tipos de vagas."];
    }
}

// Função para obter as áreas (segmentos) mais procuradas
function getSegmentosPopularesRelatorio(PDO $pdo_conn) {
    try {
        $sql = "SELECT segmento_vaga_agg as segmento, SUM(total_segmento) as total_geral
                 FROM (
                     SELECT segmento_vaga as segmento_vaga_agg, COUNT(*) as total_segmento FROM anuncio_gratuito WHERE segmento_vaga IS NOT NULL AND segmento_vaga != '' GROUP BY segmento_vaga
                     UNION ALL
                     SELECT segmento_vaga as segmento_vaga_agg, COUNT(*) as total_segmento FROM anuncio_pago WHERE segmento_vaga IS NOT NULL AND segmento_vaga != '' GROUP BY segmento_vaga
                 ) as combined_segments
                 GROUP BY segmento_vaga_agg
                 ORDER BY total_geral DESC
                 LIMIT 10";
        $stmt = $pdo_conn->query($sql);
        return $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
    } catch (PDOException $e) {
        error_log("Erro ao obter segmentos populares: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de segmentos."];
    }
}

// Função para obter os cargos (títulos de vagas) mais concorridos
function getCargosConcorridosRelatorio(PDO $pdo_conn) {
    try {
        $sql = "SELECT 
                     CASE 
                         WHEN c.tipo_anuncio = 'pago' THEN ap.titulo_vaga 
                         WHEN c.tipo_anuncio = 'gratuito' THEN ag.titulo_vaga 
                     END as titulo_vaga_aplicada, 
                     COUNT(c.id) as total_candidaturas
                 FROM candidaturas c 
                 LEFT JOIN anuncio_pago ap ON c.vaga_id = ap.id AND c.tipo_anuncio = 'pago'
                 LEFT JOIN anuncio_gratuito ag ON c.vaga_id = ag.id AND c.tipo_anuncio = 'gratuito'
                 WHERE (ap.id IS NOT NULL OR ag.id IS NOT NULL)
                 GROUP BY titulo_vaga_aplicada
                 ORDER BY total_candidaturas DESC 
                 LIMIT 10";
        $stmt = $pdo_conn->query($sql);
        return $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
    } catch (PDOException $e) {
        error_log("Erro ao obter cargos mais concorridos: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de cargos concorridos."];
    }
}

// Função para obter dados de compartilhamento
function getDadosCompartilhamento(PDO $pdo_conn) {
    try {
        $sql = "SELECT rede_social, COUNT(*) as total FROM compartilhamentos GROUP BY rede_social";
        $stmt = $pdo_conn->query($sql);
        return $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
    } catch (PDOException $e) {
        error_log("Erro ao obter dados de compartilhamento: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de compartilhamentos."];
    }
}

// NOVO CÓDIGO INICIA AQUI (Funções do Relatório Semanal)

// **FUNÇÃO CORRIGIDA**
// Função para obter o número de novas empresas na semana
function getNovasEmpresasSemana(PDO $pdo_conn) {
    try {
        // ATENÇÃO: Esta query só funciona após adicionar a coluna 'data_cadastro' na tabela 'Empresas' (veja o Passo 1).
        $sql = "SELECT COUNT(*) FROM Empresas WHERE data_cadastro >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
        return (int)$pdo_conn->query($sql)->fetchColumn();
    } catch (PDOException $e) {
        error_log("Erro ao obter novas empresas da semana: " . $e->getMessage());
        // Mensagem de erro atualizada para ser mais específica
        return ['erro' => "Não foi possível carregar dados de novas empresas. (Verifique se a coluna 'data_cadastro' existe na tabela 'Empresas')"];
    }
}

// Função para obter o número de novas vagas (pagas + gratuitas) na semana
function getNovasVagasSemana(PDO $pdo_conn) {
    try {
        // As colunas 'data_criacao' foram confirmadas no .sql
        $sql_gratuitas = "SELECT COUNT(*) FROM anuncio_gratuito WHERE data_criacao >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
        $sql_pagas = "SELECT COUNT(*) FROM anuncio_pago WHERE data_criacao >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
        
        $total_gratuitas = (int)$pdo_conn->query($sql_gratuitas)->fetchColumn();
        $total_pagas = (int)$pdo_conn->query($sql_pagas)->fetchColumn();
        
        return $total_gratuitas + $total_pagas;
    } catch (PDOException $e) {
        error_log("Erro ao obter novas vagas da semana: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de novas vagas."];
    }
}

// Função para obter o número de novas candidaturas na semana
function getNovasCandidaturasSemana(PDO $pdo_conn) {
    try {
        // A coluna 'data_candidatura' foi confirmada no .sql
        $sql = "SELECT COUNT(*) FROM candidaturas WHERE data_candidatura >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
        return (int)$pdo_conn->query($sql)->fetchColumn();
    } catch (PDOException $e) {
        error_log("Erro ao obter novas candidaturas da semana: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar dados de novas candidaturas."];
    }
}

// Função para obter o ranking de vagas da semana (Top 5 e Bottom 5)
function getRankingVagasSemana(PDO $pdo_conn) {
    try {
        // A coluna 'data_candidatura' foi confirmada no .sql
        $sql_base = "SELECT 
                        CASE 
                            WHEN c.tipo_anuncio = 'pago' THEN ap.titulo_vaga 
                            WHEN c.tipo_anuncio = 'gratuito' THEN ag.titulo_vaga 
                        END as titulo_vaga_aplicada, 
                        COUNT(c.id) as total_candidaturas
                    FROM candidaturas c 
                    LEFT JOIN anuncio_pago ap ON c.vaga_id = ap.id AND c.tipo_anuncio = 'pago'
                    LEFT JOIN anuncio_gratuito ag ON c.vaga_id = ag.id AND c.tipo_anuncio = 'gratuito'
                    WHERE 
                        (ap.id IS NOT NULL OR ag.id IS NOT NULL) AND 
                        c.data_candidatura >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
                    GROUP BY titulo_vaga_aplicada";

        // Top 5
        $sql_top5 = $sql_base . " ORDER BY total_candidaturas DESC LIMIT 5";
        $top5 = $pdo_conn->query($sql_top5)->fetchAll(PDO::FETCH_KEY_PAIR);

        // Bottom 5 (que receberam pelo menos 1 candidatura na semana)
        $sql_bottom5 = $sql_base . " ORDER BY total_candidaturas ASC LIMIT 5";
        $bottom5 = $pdo_conn->query($sql_bottom5)->fetchAll(PDO::FETCH_KEY_PAIR);

        return ['top5' => $top5, 'bottom5' => $bottom5];

    } catch (PDOException $e) {
        error_log("Erro ao obter ranking de vagas da semana: " . $e->getMessage());
        return ['erro' => "Não foi possível carregar o ranking de vagas."];
    }
}
// NOVO CÓDIGO TERMINA AQUI


// Obter todos os dados para os gráficos
if ($pdo) {
    $dadosEmpresas = getDadosEmpresasRelatorio($pdo);
    $dadosVagas = getDadosVagasRelatorio($pdo);
    $dadosVagasGratuitas = $dadosVagas['vagas_gratuitas'];
    $dadosVagasPagas = $dadosVagas['vagas_pagas'];
    $dadosCandidatos = getDadosCandidatosRelatorio($pdo);
    $tiposVagasPopulares = getTiposVagasPopularesRelatorio($pdo);
    $segmentosPopulares = getSegmentosPopularesRelatorio($pdo);
    $cargosConcorridos = getCargosConcorridosRelatorio($pdo);
    $novosCandidatos = getNovosCandidatosDashboard($pdo); // Já inclui os dados de 7 dias
    $novosCandidatosId = getNovosCandidatosPorId($pdo, 16239);
    $dadosCompartilhamento = getDadosCompartilhamento($pdo);

    // NOVO CÓDIGO INICIA AQUI (Chamada de dados semanais)
    $novasEmpresasSemana = getNovasEmpresasSemana($pdo);
    $novasVagasSemana = getNovasVagasSemana($pdo);
    $novasCandidaturasSemana = getNovasCandidaturasSemana($pdo);
    $rankingVagasSemana = getRankingVagasSemana($pdo);
    // NOVO CÓDIGO TERMINA AQUI

} else {
    $erro_geral_pagina = "Falha crítica na conexão com o banco de dados. Relatórios não podem ser gerados.";
    $dadosEmpresas = ['erro' => $erro_geral_pagina, 'total' => 0];
    $dadosVagasGratuitas = ['erro' => $erro_geral_pagina, 'criadas' => 0, 'expiradas' => 0, 'candidaturas' => 0];
    $dadosVagasPagas = ['erro' => $erro_geral_pagina, 'criadas' => 0, 'candidaturas' => 0];
    $dadosCandidatos = ['erro' => $erro_geral_pagina, 'videos' => 0, 'pdf' => 0, 'estados_labels' => [], 'estados_totais' => []];
    $tiposVagasPopulares = ['erro' => $erro_geral_pagina];
    $segmentosPopulares = ['erro' => $erro_geral_pagina];
    $cargosConcorridos = ['erro' => $erro_geral_pagina];
    $novosCandidatos = ['erro' => $erro_geral_pagina];
    $novosCandidatosId = ['erro' => $erro_geral_pagina];
    $dadosCompartilhamento = ['erro' => $erro_geral_pagina];

    // NOVO CÓDIGO INICIA AQUI (Erros dados semanais)
    $novasEmpresasSemana = ['erro' => $erro_geral_pagina];
    $novasVagasSemana = ['erro' => $erro_geral_pagina];
    $novasCandidaturasSemana = ['erro' => $erro_geral_pagina];
    $rankingVagasSemana = ['erro' => $erro_geral_pagina];
    // NOVO CÓDIGO TERMINA AQUI
}
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Relatórios do Sistema - Selflix Vagas</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
    <script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.0.0"></script>
    <style>
        body { background-color: #f0f2f5; }
        .container-main { padding-top: 20px; padding-bottom: 40px; }
        .card { margin-bottom: 25px; border: none; box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.1); border-radius: .5rem; }
        .card-header { font-weight: 600; background-color: #12929e; color: white; border-bottom: none; border-top-left-radius: .5rem; border-top-right-radius: .5rem; padding: .9rem 1.25rem;}
        .chart-container { position: relative; height: 320px; width: 100%; padding: 15px; }
        .btn-voltar-painel { background-color: #6c757d; color: white; border: none; transition: background-color 0.3s ease; }
        .btn-voltar-painel:hover { background-color: #5a6268; color: white; }
        h1 { color: #343a40; font-weight: 600; }
        .alert-custom-warning { background-color: #fff3cd; color: #664d03; border-color: #ffe69c; padding:1rem; border-radius:.375rem;}
    </style>
</head>
<body>
    <?php include 'menu-paineis.php'; ?>
    
    <div class="container container-main mt-4">
        <div class="d-flex justify-content-between align-items-center mb-4">
            <h1><i class="bi bi-bar-chart-line-fill"></i> Relatórios do Sistema</h1>
            <a href="painel-adm.php" class="btn btn-voltar-painel">
                <i class="bi bi-arrow-left-circle"></i> Voltar ao Painel
            </a>
        </div>
        
        <?php if ($erro_geral_pagina): ?>
            <div class="alert alert-danger"><?php echo htmlspecialchars($erro_geral_pagina); ?></div>
        <?php endif; ?>

        <?php 
        // NOVO CÓDIGO INICIA AQUI (Adição de variáveis de erro)
        $erros_dados = [
            $dadosEmpresas, $dadosVagasGratuitas, $dadosVagasPagas, $dadosCandidatos, 
            $tiposVagasPopulares, $segmentosPopulares, $cargosConcorridos, $novosCandidatos, 
            $novosCandidatosId, $dadosCompartilhamento, $novasEmpresasSemana, 
            $novasVagasSemana, $novasCandidaturasSemana, $rankingVagasSemana
        ];
        // NOVO CÓDIGO TERMINA AQUI

        foreach ($erros_dados as $dado_resultado) {
            if (is_array($dado_resultado) && isset($dado_resultado['erro'])) {
                echo "<div class='alert alert-custom-warning'>" . htmlspecialchars($dado_resultado['erro']) . "</div>";
            }
        }
        ?>
        
        <h3 class="mt-5 mb-3"><i class="bi bi-calendar-week-fill"></i> Resumo da Semana (Últimos 7 dias)</h3>
        <div class="row">
            <div class="col-lg-3 col-md-6">
                <div class="card">
                    <div class="card-header">Novos Candidatos</div>
                    <div class="card-body">
                        <div class="chart-container" style="height: 180px;">
                            <canvas id="novosCandidatosSemanaChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-lg-3 col-md-6">
                <div class="card">
                    <div class="card-header">Novas Empresas</div>
                    <div class="card-body">
                        <div class="chart-container" style="height: 180px;">
                            <canvas id="novasEmpresasSemanaChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-lg-3 col-md-6">
                <div class="card">
                    <div class="card-header">Novas Vagas Publicadas</div>
                    <div class="card-body">
                        <div class="chart-container" style="height: 180px;">
                            <canvas id="novasVagasSemanaChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-lg-3 col-md-6">
                <div class="card">
                    <div class="card-header">Novas Candidaturas</div>
                    <div class="card-body">
                        <div class="chart-container" style="height: 180px;">
                            <canvas id="novasCandidaturasSemanaChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Top 5 Vagas (Mais Candidaturas na Semana)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="top5VagasSemanaChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Bottom 5 Vagas (Menos Candidaturas na Semana)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="bottom5VagasSemanaChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <h3 class="mt-5 mb-3"><i class="bi bi-archive-fill"></i> Relatórios Gerais do Sistema</h3>
        <div class="row">
            <div class="col-lg-4 col-md-6">
                <div class="card">
                    <div class="card-header">Empresas Cadastradas (Total)</div>
                    <div class="card-body">
                        <div class="chart-container" style="height: 200px;"> <canvas id="empresasChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-lg-4 col-md-6">
                <div class="card">
                    <div class="card-header">Compartilhamentos por Rede</div>
                    <div class="card-body">
                        <div class="chart-container" style="height: 200px;">
                            <canvas id="compartilhamentoChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-lg-4 col-md-6">
                <div class="card">
                    <div class="card-header">Novos Candidatos (ID > 16239)</div>
                    <div class="card-body">
                        <div class="chart-container" style="height: 200px;">
                            <canvas id="novosCandidatosIdChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        
        <div class="row">
            <div class="col-lg-6 col-md-12">
                <div class="card">
                    <div class="card-header">Status Vagas Gratuitas (Total)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="vagasGratuitasChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-lg-6 col-md-12">
                <div class="card">
                    <div class="card-header">Status Vagas Pagas (Total)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="vagasPagasChart"></canvas> </div>
                    </div>
                </div>
            </div>
        </div>
        
        <div class="row">
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Novos Candidatos (Por Período)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="novosCandidatosChart"></canvas>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Candidatos (Conteúdo - Total)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="candidatosConteudoChart"></canvas> </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Tipos de Vagas Mais Publicadas (Total)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="tiposVagasPopularesChart"></canvas> </div>
                    </div>
                </div>
            </div>
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Segmentos de Vagas Mais Publicados (Total)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="segmentosPopularesChart"></canvas> </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Vagas Mais Concorridas (Top 10 - Total)</div>
                    <div class="card-body">
                        <div class="chart-container">
                            <canvas id="cargosConcorridosChart"></canvas> </div>
                    </div>
                </div>
            </div>
            <div class="col-md-6">
                <div class="card">
                    <div class="card-header">Candidatos por Estado (Top 10 - Total)</div>
                    <div class="card-body">
                        <div class="chart-container"> <canvas id="candidatosPorEstadoChart"></canvas> </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <script>
    document.addEventListener('DOMContentLoaded', function() {
        // INÍCIO: Registrar o plugin globalmente para todos os gráficos
        Chart.register(ChartDataLabels);
        // FIM: Registrar o plugin

        // Configuração padrão para os rótulos de dados
        const datalabelsConfig = {
            color: '#ffffff',
            display: true,
            font: {
                weight: 'bold'
            },
            formatter: function(value) {
                // Não exibir o rótulo se o valor for 0
                return value > 0 ? value : '';
            }
        };

        const dadosEmpresasJS = <?php echo isset($dadosEmpresas['total']) ? $dadosEmpresas['total'] : ($dadosEmpresas ?? 0); ?>;
        const dadosVagasGratuitasJS = {
            criadas: <?php echo $dadosVagasGratuitas['criadas'] ?? 0; ?>,
            expiradas: <?php echo $dadosVagasGratuitas['expiradas'] ?? 0; ?>,
            candidaturas: <?php echo $dadosVagasGratuitas['com_candidaturas'] ?? 0; ?>
        };
        const dadosVagasPagasJS = {
            criadas: <?php echo $dadosVagasPagas['criadas'] ?? 0; ?>,
            candidaturas: <?php echo $dadosVagasPagas['com_candidaturas'] ?? 0; ?>
        };
        const dadosCandidatosJS = {
            videos: <?php echo $dadosCandidatos['videos'] ?? 0; ?>,
            pdf: <?php echo $dadosCandidatos['pdf'] ?? 0; ?>
        };
        const candidatosPorEstadoJS = {
            labels: <?php echo !empty($dadosCandidatos['estados_labels']) ? json_encode($dadosCandidatos['estados_labels']) : '[]'; ?>,
            data: <?php echo !empty($dadosCandidatos['estados_totais']) ? json_encode($dadosCandidatos['estados_totais']) : '[]'; ?>
        };
        const tiposVagasPopularesJS = <?php echo !isset($tiposVagasPopulares['erro']) ? json_encode($tiposVagasPopulares) : '{}'; ?>;
        const segmentosPopularesJS = <?php echo !isset($segmentosPopulares['erro']) ? json_encode($segmentosPopulares) : '{}'; ?>;
        const cargosConcorridosJS = <?php echo !isset($cargosConcorridos['erro']) ? json_encode($cargosConcorridos) : '{}'; ?>;
        const novosCandidatosJS = <?php echo !isset($novosCandidatos['erro']) ? json_encode($novosCandidatos) : '{}'; ?>;
        const novosCandidatosIdJS = <?php echo is_array($novosCandidatosId) && isset($novosCandidatosId['erro']) ? 0 : $novosCandidatosId; ?>;
        const dadosCompartilhamentoJS = <?php echo !isset($dadosCompartilhamento['erro']) ? json_encode($dadosCompartilhamento) : '{}'; ?>;

        // NOVO CÓDIGO INICIA AQUI (Variáveis JS Semanais)
        const novosCandidatosSemanaJS = <?php echo $novosCandidatos['data'][0] ?? 0; ?>;
        const novasEmpresasSemanaJS = <?php echo is_array($novasEmpresasSemana) ? 0 : $novasEmpresasSemana; ?>;
        const novasVagasSemanaJS = <?php echo is_array($novasVagasSemana) ? 0 : $novasVagasSemana; ?>;
        const novasCandidaturasSemanaJS = <?php echo is_array($novasCandidaturasSemana) ? 0 : $novasCandidaturasSemana; ?>;
        const rankingVagasSemanaJS = <?php echo !isset($rankingVagasSemana['erro']) ? json_encode($rankingVagasSemana) : "{'top5': {}, 'bottom5': {}}"; ?>;
        // NOVO CÓDIGO TERMINA AQUI

        const defaultChartColors = ['#4e73df', '#1cc88a', '#36b9cc', '#f6c23e', '#e74a3b', '#6f42c1', '#fd7e14', '#20c9a6', '#858796', '#5a5c69'];

        function createSingleDataChart(value, label, chartId, type = 'doughnut', chartLabel = 'Total') {
            const ctx = document.getElementById(chartId)?.getContext('2d');
            if (!ctx) return;
            new Chart(ctx, {
                type: type,
                data: {
                    labels: [label],
                    datasets: [{
                        label: chartLabel,
                        data: [value],
                        backgroundColor: [defaultChartColors[0]],
                        hoverBackgroundColor: [Chart.helpers.color(defaultChartColors[0]).alpha(0.8).rgbString()]
                    }]
                },
                options: { 
                    maintainAspectRatio: false, 
                    responsive: true, 
                    cutout: type === 'doughnut' ? '70%' : '0%', 
                    plugins: { 
                        legend: { display: false }, 
                        tooltip: { callbacks: { label: (c) => c.label + ': ' + c.raw } },
                        datalabels: datalabelsConfig // Adicionado aqui
                    } 
                }
            });
        }
        
        // 1. Empresas Cadastradas (Total)
        createSingleDataChart(dadosEmpresasJS, 'Empresas', 'empresasChart', 'doughnut', 'Total Empresas');

        // 2. Vagas Gratuitas
        const ctxVgGratuitas = document.getElementById('vagasGratuitasChart')?.getContext('2d');
        if (ctxVgGratuitas) {
            new Chart(ctxVgGratuitas, {
                type: 'bar',
                data: {
                    labels: ['Criadas', 'Expiradas', 'Com Candidaturas'],
                    datasets: [{ label: 'Vagas Gratuitas', data: [dadosVagasGratuitasJS.criadas, dadosVagasGratuitasJS.expiradas, dadosVagasGratuitasJS.candidaturas], backgroundColor: [defaultChartColors[0], defaultChartColors[4], defaultChartColors[1]] }]
                },
                options: { maintainAspectRatio: false, responsive: true, scales: { y: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { legend: { display: false }, datalabels: datalabelsConfig } }
            });
        }
        
        // 3. Vagas Pagas
        const ctxVgPagas = document.getElementById('vagasPagasChart')?.getContext('2d');
        if (ctxVgPagas) {
            new Chart(ctxVgPagas, {
                type: 'bar',
                data: {
                    labels: ['Criadas', 'Com Candidaturas'],
                    datasets: [{ label: 'Vagas Pagas', data: [dadosVagasPagasJS.criadas, dadosVagasPagasJS.candidaturas], backgroundColor: [defaultChartColors[0], defaultChartColors[1]] }]
                },
                options: { maintainAspectRatio: false, responsive: true, scales: { y: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { legend: { display: false }, datalabels: datalabelsConfig } }
            });
        }

        // 4. Novos Candidatos (Período)
        const ctxNovosCandidatos = document.getElementById('novosCandidatosChart')?.getContext('2d');
        if (ctxNovosCandidatos && novosCandidatosJS.labels) {
            new Chart(ctxNovosCandidatos, {
                type: 'bar',
                data: {
                    labels: novosCandidatosJS.labels,
                    datasets: [{ label: 'Nº de Candidatos', data: novosCandidatosJS.data, backgroundColor: defaultChartColors[2] }]
                },
                options: { maintainAspectRatio: false, responsive: true, scales: { y: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { legend: { display: false }, datalabels: datalabelsConfig } }
            });
        }

        // 5. Novos Candidatos por ID
        if (typeof novosCandidatosIdJS === 'number') {
            createSingleDataChart(novosCandidatosIdJS, 'Novos Candidatos', 'novosCandidatosIdChart', 'doughnut', 'Novos Candidatos');
        }
        
        // 6. Candidatos (Conteúdo - Total)
        const ctxCandConteudo = document.getElementById('candidatosConteudoChart')?.getContext('2d');
        if (ctxCandConteudo) {
            new Chart(ctxCandConteudo, {
                type: 'pie',
                data: {
                    labels: ['Com Vídeo Selflix', 'Com Currículo PDF'],
                    datasets: [{ data: [dadosCandidatosJS.videos, dadosCandidatosJS.pdf], backgroundColor: [defaultChartColors[2], defaultChartColors[3]], hoverOffset: 4 }]
                },
                options: { maintainAspectRatio: false, responsive: true, plugins: { legend: { position: 'top' }, datalabels: datalabelsConfig } }
            });
        }
        
        // 7. Tipos de Vagas (Total)
        const ctxTiposVagas = document.getElementById('tiposVagasPopularesChart')?.getContext('2d');
        if (ctxTiposVagas && Object.keys(tiposVagasPopularesJS).length > 0) {
            new Chart(ctxTiposVagas, {
                type: 'pie',
                data: {
                    labels: Object.keys(tiposVagasPopularesJS),
                    datasets: [{ data: Object.values(tiposVagasPopularesJS), backgroundColor: defaultChartColors, hoverOffset: 4 }]
                },
                options: { maintainAspectRatio: false, responsive: true, plugins: { legend: { position: 'top', labels:{padding:10, boxWidth:12} }, datalabels: datalabelsConfig } }
            });
        }

        // 8. Segmentos (Total)
        const ctxSegmentos = document.getElementById('segmentosPopularesChart')?.getContext('2d');
        if (ctxSegmentos && Object.keys(segmentosPopularesJS).length > 0) {
            new Chart(ctxSegmentos, {
                type: 'bar',
                data: {
                    labels: Object.keys(segmentosPopularesJS),
                    datasets: [{ label: 'Nº de Vagas', data: Object.values(segmentosPopularesJS), backgroundColor: defaultChartColors[1] }]
                },
                options: { maintainAspectRatio: false, responsive: true, scales: { y: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { legend: { display: false }, datalabels: datalabelsConfig } }
            });
        }

        // 9. Vagas Mais Concorridas (Total)
        const ctxCargos = document.getElementById('cargosConcorridosChart')?.getContext('2d');
        if (ctxCargos && Object.keys(cargosConcorridosJS).length > 0) {
            new Chart(ctxCargos, {
                type: 'bar',
                data: {
                    labels: Object.keys(cargosConcorridosJS),
                    datasets: [{ label: 'Nº de Candidaturas', data: Object.values(cargosConcorridosJS), backgroundColor: defaultChartColors[5] }]
                },
                options: { indexAxis: 'y', maintainAspectRatio: false, responsive: true, scales: { x: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { legend: { display: false }, datalabels: datalabelsConfig } }
            });
        }
        
        // 10. Candidatos por Estado (Total)
        const ctxEstados = document.getElementById('candidatosPorEstadoChart')?.getContext('2d');
        if (ctxEstados && candidatosPorEstadoJS.labels.length > 0) {
            new Chart(ctxEstados, {
                type: 'bar',
                data: {
                    labels: candidatosPorEstadoJS.labels,
                    datasets: [{ label: 'Candidatos por Estado', data: candidatosPorEstadoJS.data, backgroundColor: defaultChartColors[0] }]
                },
                options: { indexAxis: 'y', maintainAspectRatio: false, responsive: true, scales: { x: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { legend: { display: false }, datalabels: datalabelsConfig } }
            });
        }

        // 11. Gráfico de Compartilhamento
        const ctxCompartilhamento = document.getElementById('compartilhamentoChart')?.getContext('2d');
        if (ctxCompartilhamento && Object.keys(dadosCompartilhamentoJS).length > 0) {
            new Chart(ctxCompartilhamento, {
                type: 'doughnut',
                data: {
                    labels: Object.keys(dadosCompartilhamentoJS).map(l => l.charAt(0).toUpperCase() + l.slice(1)),
                    datasets: [{
                        label: 'Compartilhamentos',
                        data: Object.values(dadosCompartilhamentoJS),
                        backgroundColor: [ '#0077b5', '#3b5998', '#25d366' ],
                        hoverOffset: 4
                    }]
                },
                options: {
                    maintainAspectRatio: false,
                    responsive: true,
                    cutout: '70%',
                    plugins: {
                        legend: { display: false },
                        datalabels: datalabelsConfig // Adicionado aqui
                    }
                }
            });
        }

        // NOVO CÓDIGO INICIA AQUI (Gráficos do Relatório Semanal)
        
        // 12. Novos Candidatos Semana
        createSingleDataChart(novosCandidatosSemanaJS, 'Candidatos', 'novosCandidatosSemanaChart', 'doughnut', 'Novos Candidatos');

        // 13. Novas Empresas Semana
        createSingleDataChart(novasEmpresasSemanaJS, 'Empresas', 'novasEmpresasSemanaChart', 'doughnut', 'Novas Empresas');
        
        // 14. Novas Vagas Semana
        createSingleDataChart(novasVagasSemanaJS, 'Vagas', 'novasVagasSemanaChart', 'doughnut', 'Novas Vagas');
        
        // 15. Novas Candidaturas Semana
        createSingleDataChart(novasCandidaturasSemanaJS, 'Candidaturas', 'novasCandidaturasSemanaChart', 'doughnut', 'Novas Candidaturas');

        // 16. Top 5 Vagas Semana
        const ctxTop5 = document.getElementById('top5VagasSemanaChart')?.getContext('2d');
        if (ctxTop5 && rankingVagasSemanaJS.top5 && Object.keys(rankingVagasSemanaJS.top5).length > 0) {
            new Chart(ctxTop5, {
                type: 'bar',
                data: {
                    labels: Object.keys(rankingVagasSemanaJS.top5),
                    datasets: [{ label: 'Nº de Candidaturas', data: Object.values(rankingVagasSemanaJS.top5), backgroundColor: defaultChartColors[1] }]
                },
                options: { indexAxis: 'y', maintainAspectRatio: false, responsive: true, scales: { x: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { legend: { display: false }, datalabels: datalabelsConfig } }
            });
        }

        // 17. Bottom 5 Vagas Semana
        const ctxBottom5 = document.getElementById('bottom5VagasSemanaChart')?.getContext('2d');
        if (ctxBottom5 && rankingVagasSemanaJS.bottom5 && Object.keys(rankingVagasSemanaJS.bottom5).length > 0) {
            new Chart(ctxBottom5, {
                type: 'bar',
                data: {
                    labels: Object.keys(rankingVagasSemanaJS.bottom5),
                    datasets: [{ label: 'Nº de Candidaturas', data: Object.values(rankingVagasSemanaJS.bottom5), backgroundColor: defaultChartColors[4] }]
                },
                options: { indexAxis: 'y', maintainAspectRatio: false, responsive: true, scales: { x: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { legend: { display: false }, datalabels: datalabelsConfig } }
            });
        }
        // NOVO CÓDIGO TERMINA AQUI

    });
    </script>
</body>
</html>