<?php
require 'auth.php';
require 'conexao.php';
require 'fpdf.php';

function txt($str) {
    return utf8_decode($str ?? '-');
}

function dinheiroZero($v) {
    return number_format((float)$v, 0, ',', '.');
}

/* =========================
   KPIs PRINCIPAIS
========================= */
$total = (int)($mysqli->query("
    SELECT COUNT(*) t FROM ordens_servico
")->fetch_assoc()['t'] ?? 0);

$abertas = (int)($mysqli->query("
    SELECT COUNT(*) t FROM ordens_servico WHERE status = 'Em andamento'
")->fetch_assoc()['t'] ?? 0);

$finalizadas = (int)($mysqli->query("
    SELECT COUNT(*) t FROM ordens_servico WHERE status = 'Finalizado'
")->fetch_assoc()['t'] ?? 0);

$pendenteRetirada = (int)($mysqli->query("
    SELECT COUNT(*) t FROM ordens_servico WHERE status = 'PENDENTE RETIRADA'
")->fetch_assoc()['t'] ?? 0);

/* =========================
   ATRASADAS
========================= */
$atrasadas = 0;

$res = $mysqli->query("
    SELECT data_entrada, prazo, status 
    FROM ordens_servico 
    WHERE status <> 'Finalizado'
");

while ($r = $res->fetch_assoc()) {
    if (!$r['data_entrada'] || !$r['prazo']) continue;

    $dias = (time() - strtotime($r['data_entrada'])) / 86400;

    if ($dias > (int)$r['prazo']) {
        $atrasadas++;
    }
}

/* =========================
   SLA MÉDIO
========================= */
$slaQuery = $mysqli->query("
    SELECT AVG(TIMESTAMPDIFF(HOUR, data_entrada, data_saida)) AS sla
    FROM ordens_servico
    WHERE status = 'Finalizado'
    AND data_saida IS NOT NULL
");

$sla = $slaQuery->fetch_assoc()['sla'] ?? 0;
$sla = number_format((float)$sla, 1, ',', '.');

/* =========================
   COMPARATIVO MENSAL
========================= */
$mesAtual = (int)($mysqli->query("
    SELECT COUNT(*) t 
    FROM ordens_servico 
    WHERE YEAR(data_entrada) = YEAR(CURDATE())
    AND MONTH(data_entrada) = MONTH(CURDATE())
")->fetch_assoc()['t'] ?? 0);

$mesAnterior = (int)($mysqli->query("
    SELECT COUNT(*) t 
    FROM ordens_servico 
    WHERE YEAR(data_entrada) = YEAR(CURDATE() - INTERVAL 1 MONTH)
    AND MONTH(data_entrada) = MONTH(CURDATE() - INTERVAL 1 MONTH)
")->fetch_assoc()['t'] ?? 0);

$variacao = $mesAnterior > 0 ? (($mesAtual - $mesAnterior) / $mesAnterior) * 100 : 0;
$variacaoTxt = ($variacao >= 0 ? '+' : '') . number_format($variacao, 1, ',', '.') . '%';

/* =========================
   PERFORMANCE
========================= */
$percentAtraso = $total > 0 ? ($atrasadas / $total) * 100 : 0;

if ($percentAtraso <= 5) {
    $performance = 'EXCELENTE';
    $diagnostico = 'A operação está controlada, com baixo índice de atrasos.';
    $corPerf = [22, 163, 74];
} elseif ($percentAtraso <= 15) {
    $performance = 'ATENÇÃO';
    $diagnostico = 'Há sinais de acúmulo de demandas. Recomenda-se acompanhamento dos prazos.';
    $corPerf = [245, 158, 11];
} else {
    $performance = 'CRÍTICO';
    $diagnostico = 'O volume de atrasos exige ação imediata da equipe técnica.';
    $corPerf = [220, 38, 38];
}

/* =========================
   RANKINGS
========================= */
$rankEquip = $mysqli->query("
    SELECT COALESCE(NULLIF(tipo_equipamento,''), 'Não informado') tipo_equipamento, COUNT(*) total 
    FROM ordens_servico 
    GROUP BY tipo_equipamento 
    ORDER BY total DESC 
    LIMIT 5
");

$rankSetor = $mysqli->query("
    SELECT COALESCE(NULLIF(setor,''), 'Não informado') setor, COUNT(*) total 
    FROM ordens_servico 
    GROUP BY setor 
    ORDER BY total DESC 
    LIMIT 5
");

/* =========================
   PDF
========================= */
class PDF extends FPDF {

    function Header() {
        $this->SetFillColor(15, 23, 42);
        $this->Rect(0, 0, 210, 38, 'F');

        $this->SetFillColor(29, 78, 216);
        $this->Rect(0, 32, 210, 6, 'F');

        if (file_exists('assets/logoazul.jpg')) {
            $this->Image('assets/logoazul.jpg', 12, 7, 22);
        }

        $this->SetTextColor(255,255,255);
        $this->SetFont('Arial','B',15);
        $this->SetXY(40, 8);
        $this->Cell(155, 8, txt('RELATÓRIO EXECUTIVO DE MANUTENÇÃO - TI'), 0, 1, 'L');

        $this->SetFont('Arial','',9);
        $this->SetX(40);
        $this->Cell(155, 6, txt('Prefeitura Municipal de Extrema | Gerência de Tecnologia'), 0, 1, 'L');

        $this->SetFont('Arial','',8);
        $this->SetX(40);
        $this->Cell(155, 5, txt('Documento gerado em ' . date('d/m/Y H:i')), 0, 1, 'L');

        $this->Ln(14);
    }

    function Footer() {
        $this->SetY(-18);
        $this->SetDrawColor(226, 232, 240);
        $this->Line(10, $this->GetY(), 200, $this->GetY());

        $this->SetFont('Arial','I',8);
        $this->SetTextColor(100, 116, 139);
        $this->Ln(3);
        $this->Cell(0, 5, txt('Sistema de Controle de Ordens de Serviço - Gerência de Tecnologia'), 0, 1, 'C');
        $this->Cell(0, 5, txt('Desenvolvido por Renan Andrade | Página ') . $this->PageNo(), 0, 0, 'C');
    }

    function SectionTitle($title) {
        $this->Ln(4);
        $this->SetFillColor(239, 246, 255);
        $this->SetTextColor(30, 64, 175);
        $this->SetFont('Arial','B',11);
        $this->Cell(0, 9, txt($title), 0, 1, 'L', true);
        $this->SetTextColor(15, 23, 42);
        $this->Ln(2);
    }

    function KpiCard($x, $y, $w, $h, $label, $value, $r = 37, $g = 99, $b = 235) {
        $this->SetXY($x, $y);
        $this->SetFillColor(248, 250, 252);
        $this->SetDrawColor(226, 232, 240);
        $this->Rect($x, $y, $w, $h, 'DF');

        $this->SetXY($x + 4, $y + 4);
        $this->SetTextColor(100, 116, 139);
        $this->SetFont('Arial','B',8);
        $this->Cell($w - 8, 5, txt($label), 0, 1, 'L');

        $this->SetXY($x + 4, $y + 12);
        $this->SetTextColor($r, $g, $b);
        $this->SetFont('Arial','B',20);
        $this->Cell($w - 8, 10, txt($value), 0, 1, 'L');

        $this->SetTextColor(15, 23, 42);
    }

    function InfoBox($title, $text, $r = 37, $g = 99, $b = 235) {
        $this->SetFillColor(248, 250, 252);
        $this->SetDrawColor(226, 232, 240);
        $x = $this->GetX();
        $y = $this->GetY();

        $this->Rect($x, $y, 190, 24, 'DF');

        $this->SetXY($x + 4, $y + 4);
        $this->SetFont('Arial','B',10);
        $this->SetTextColor($r, $g, $b);
        $this->Cell(182, 5, txt($title), 0, 1);

        $this->SetX($x + 4);
        $this->SetFont('Arial','',9);
        $this->SetTextColor(51, 65, 85);
        $this->MultiCell(182, 5, txt($text));

        $this->SetY($y + 29);
        $this->SetTextColor(15, 23, 42);
    }

    function TableHeader($cols) {
        $this->SetFillColor(15, 23, 42);
        $this->SetTextColor(255,255,255);
        $this->SetFont('Arial','B',9);

        foreach ($cols as $col) {
            $this->Cell($col[1], 8, txt($col[0]), 1, 0, 'L', true);
        }

        $this->Ln();
        $this->SetTextColor(15, 23, 42);
    }

    function TableRow($cols) {
        $this->SetFont('Arial','',9);
        $this->SetFillColor(248, 250, 252);
        $this->SetDrawColor(226, 232, 240);

        foreach ($cols as $col) {
            $this->Cell($col[1], 8, txt($col[0]), 1, 0, 'L', true);
        }

        $this->Ln();
    }
}

$pdf = new PDF();
$pdf->AddPage();
$pdf->SetAutoPageBreak(true, 22);

/* RESUMO */
$pdf->SectionTitle('1. RESUMO EXECUTIVO');

$resumo = "Este relatório apresenta uma visão consolidada das ordens de serviço da área de Tecnologia, incluindo volume total, demandas em andamento, finalizações, atrasos, SLA médio, variação mensal e principais tipos de equipamentos atendidos.";

$pdf->SetFont('Arial','',10);
$pdf->SetTextColor(51, 65, 85);
$pdf->MultiCell(0, 6, txt($resumo));
$pdf->Ln(3);

/* KPIS */
$pdf->SectionTitle('2. INDICADORES GERAIS');

$y = $pdf->GetY();

$pdf->KpiCard(10, $y, 36, 27, 'TOTAL DE OS', $total, 37, 99, 235);
$pdf->KpiCard(49, $y, 36, 27, 'EM ANDAMENTO', $abertas, 245, 158, 11);
$pdf->KpiCard(88, $y, 36, 27, 'FINALIZADAS', $finalizadas, 22, 163, 74);
$pdf->KpiCard(127, $y, 36, 27, 'ATRASADAS', $atrasadas, 220, 38, 38);
$pdf->KpiCard(166, $y, 34, 27, 'RETIRADA', $pendenteRetirada, 8, 145, 178);

$pdf->SetY($y + 34);

/* PERFORMANCE */
$pdf->SectionTitle('3. DIAGNÓSTICO OPERACIONAL');

$pdf->InfoBox(
    'Indicador de performance: ' . $performance,
    $diagnostico . ' Percentual de atraso atual: ' . number_format($percentAtraso, 1, ',', '.') . '%.',
    $corPerf[0],
    $corPerf[1],
    $corPerf[2]
);

$pdf->InfoBox(
    'SLA médio de resolução',
    'O tempo médio de resolução das ordens finalizadas é de ' . $sla . ' horas.',
    37,
    99,
    235
);

/* COMPARATIVO */
$pdf->SectionTitle('4. COMPARATIVO MENSAL');

$pdf->SetFont('Arial','',10);
$pdf->SetTextColor(51, 65, 85);
$pdf->Cell(0, 7, txt('Ordens abertas no mês atual: ' . $mesAtual), 0, 1);
$pdf->Cell(0, 7, txt('Ordens abertas no mês anterior: ' . $mesAnterior), 0, 1);
$pdf->Cell(0, 7, txt('Variação mensal: ' . $variacaoTxt), 0, 1);
$pdf->Ln(3);

/* RANKING EQUIPAMENTOS */
$pdf->SectionTitle('5. TOP 5 EQUIPAMENTOS COM MAIS DEMANDAS');

$pdf->TableHeader([
    ['POSIÇÃO', 28],
    ['EQUIPAMENTO', 122],
    ['TOTAL DE OS', 40],
]);

$pos = 1;

if ($rankEquip && $rankEquip->num_rows > 0) {
    while ($r = $rankEquip->fetch_assoc()) {
        $pdf->TableRow([
            [$pos . 'º', 28],
            [$r['tipo_equipamento'], 122],
            [$r['total'], 40],
        ]);
        $pos++;
    }
} else {
    $pdf->TableRow([
        ['-', 28],
        ['Sem dados suficientes', 122],
        ['0', 40],
    ]);
}

/* RANKING SETORES */
$pdf->Ln(5);
$pdf->SectionTitle('6. TOP 5 SETORES SOLICITANTES');

$pdf->TableHeader([
    ['POSIÇÃO', 28],
    ['SETOR', 122],
    ['TOTAL DE OS', 40],
]);

$pos = 1;

if ($rankSetor && $rankSetor->num_rows > 0) {
    while ($r = $rankSetor->fetch_assoc()) {
        $pdf->TableRow([
            [$pos . 'º', 28],
            [$r['setor'], 122],
            [$r['total'], 40],
        ]);
        $pos++;
    }
} else {
    $pdf->TableRow([
        ['-', 28],
        ['Sem dados suficientes', 122],
        ['0', 40],
    ]);
}

/* RECOMENDAÇÕES */
$pdf->Ln(5);
$pdf->SectionTitle('7. RECOMENDAÇÕES');

$recomendacoes = [];

if ($atrasadas > 0) {
    $recomendacoes[] = 'Priorizar a análise das ordens atrasadas, especialmente as de maior impacto operacional.';
}

if ($abertas > $finalizadas && $total > 0) {
    $recomendacoes[] = 'Monitorar o volume de demandas em andamento para evitar acúmulo na fila técnica.';
}

if ($percentAtraso > 15) {
    $recomendacoes[] = 'Revisar prazos, fluxo de triagem e distribuição das demandas entre os técnicos.';
}

if ($mesAtual > $mesAnterior && $mesAnterior > 0) {
    $recomendacoes[] = 'Avaliar o aumento mensal de solicitações para identificar setores ou equipamentos recorrentes.';
}

if (empty($recomendacoes)) {
    $recomendacoes[] = 'Manter o acompanhamento periódico dos indicadores e preservar o padrão atual de atendimento.';
}

$pdf->SetFont('Arial','',10);
$pdf->SetTextColor(51, 65, 85);

foreach ($recomendacoes as $rec) {
    $pdf->MultiCell(0, 7, txt('- ' . $rec));
}

$pdf->Ln(4);

/* FECHAMENTO */
$pdf->SectionTitle('8. CONCLUSÃO');

$conclusao = "Os dados apresentados apoiam a tomada de decisão da Gerência de Tecnologia, permitindo identificar gargalos, priorizar atendimentos, acompanhar o desempenho operacional e melhorar continuamente o suporte aos setores da Prefeitura Municipal de Extrema.";

$pdf->SetFont('Arial','',10);
$pdf->MultiCell(0, 6, txt($conclusao));

$pdf->Output('I', 'relatorio_executivo_ti.pdf');
exit;