<?php
declare(strict_types=1);

require_once 'auth.php';
require_once 'conexao.php';
require_once 'fpdf.php';

date_default_timezone_set('America/Sao_Paulo');

if ($mysqli instanceof mysqli) {
    $mysqli->set_charset('utf8mb4');
}

/*
|--------------------------------------------------------------------------
| Funções auxiliares
|--------------------------------------------------------------------------
*/

function pdfText(mixed $valor): string
{
    $texto = trim((string) $valor);

    if ($texto === '') {
        return '-';
    }

    $convertido = iconv(
        'UTF-8',
        'Windows-1252//TRANSLIT//IGNORE',
        $texto
    );

    return $convertido !== false
        ? $convertido
        : $texto;
}

function dataPdf(mixed $data, string $vazio = 'Não informado'): string
{
    $data = trim((string) $data);

    if ($data === '') {
        return $vazio;
    }

    $timestamp = strtotime($data);

    return $timestamp !== false
        ? date('d/m/Y H:i', $timestamp)
        : $vazio;
}

function textoStatus(string $status): string
{
    $status = trim($status);

    if (function_exists('mb_strtolower')) {
        $status = mb_strtolower($status, 'UTF-8');
    } else {
        $status = strtolower($status);
    }

    return strtr($status, [
        'á' => 'a',
        'à' => 'a',
        'â' => 'a',
        'ã' => 'a',
        'é' => 'e',
        'è' => 'e',
        'ê' => 'e',
        'í' => 'i',
        'ó' => 'o',
        'ô' => 'o',
        'õ' => 'o',
        'ú' => 'u',
        'ç' => 'c'
    ]);
}

function caminhoArquivoSeguro(mixed $caminho): string
{
    $caminho = trim((string) $caminho);

    if ($caminho === '') {
        return '';
    }

    $caminho = str_replace('\\', '/', $caminho);
    $caminho = ltrim($caminho, '/');

    if (
        str_contains($caminho, '../') ||
        str_starts_with($caminho, 'http://') ||
        str_starts_with($caminho, 'https://')
    ) {
        return '';
    }

    $absoluto = __DIR__ . '/' . $caminho;

    return is_file($absoluto)
        ? $absoluto
        : '';
}

function tabelaExiste(mysqli $mysqli, string $tabela): bool
{
    $stmt = $mysqli->prepare("
        SELECT COUNT(*) AS total
        FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = DATABASE()
          AND TABLE_NAME = ?
    ");

    if (!$stmt) {
        return false;
    }

    $stmt->bind_param('s', $tabela);
    $stmt->execute();

    $linha = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    return (int) ($linha['total'] ?? 0) > 0;
}

/*
|--------------------------------------------------------------------------
| PDF personalizado
|--------------------------------------------------------------------------
*/

final class RelatorioOSPDF extends FPDF
{
    private string $logoPath;
    private string $numeroOs;
    private string $codigoDocumento;

    public function __construct(
        string $logoPath,
        string $numeroOs,
        string $codigoDocumento
    ) {
        parent::__construct('P', 'mm', 'A4');

        $this->logoPath = $logoPath;
        $this->numeroOs = $numeroOs;
        $this->codigoDocumento = $codigoDocumento;

        $this->SetMargins(13, 37, 13);
        $this->SetAutoPageBreak(true, 18);
        $this->AliasNbPages();
    }

    public function Header(): void
    {
        $this->SetFillColor(5, 41, 79);
        $this->Rect(0, 0, 210, 31, 'F');

        $this->SetFillColor(8, 127, 91);
        $this->Rect(0, 0, 210, 2.3, 'F');

        $this->SetFillColor(232, 173, 22);
        $this->Rect(184, 0, 26, 2.3, 'F');

        $logoX = 13;
        $logoY = 6;
        $logoW = 19;
        $logoH = 19;

        $this->SetFillColor(255, 255, 255);
        $this->Rect($logoX, $logoY, $logoW, $logoH, 'F');

        if ($this->logoPath !== '' && is_file($this->logoPath)) {
            try {
                $this->Image(
                    $this->logoPath,
                    $logoX + 1.5,
                    $logoY + 1.5,
                    $logoW - 3,
                    $logoH - 3
                );
            } catch (Throwable) {
                // Mantém o bloco branco caso a imagem seja incompatível.
            }
        }

        $this->SetXY(37, 7);

        $this->SetTextColor(186, 213, 235);
        $this->SetFont('Arial', 'B', 7.2);
        $this->Cell(
            0,
            4,
            pdfText('PREFEITURA MUNICIPAL DE EXTREMA'),
            0,
            1
        );

        $this->SetX(37);
        $this->SetTextColor(255, 255, 255);
        $this->SetFont('Arial', 'B', 14.5);
        $this->Cell(
            0,
            6,
            pdfText('RELATÓRIO TÉCNICO DE ORDEM DE SERVIÇO'),
            0,
            1
        );

        $this->SetX(37);
        $this->SetTextColor(183, 208, 230);
        $this->SetFont('Arial', '', 7.5);
        $this->Cell(
            0,
            4,
            pdfText('Gerência de Tecnologia - Manutenção e Suporte'),
            0,
            1
        );

        $this->SetXY(160, 8);
        $this->SetTextColor(190, 215, 235);
        $this->SetFont('Arial', 'B', 6.4);
        $this->Cell(
            36,
            4,
            pdfText('ORDEM DE SERVIÇO'),
            0,
            1,
            'R'
        );

        $this->SetX(160);
        $this->SetTextColor(255, 255, 255);
        $this->SetFont('Arial', 'B', 13);
        $this->Cell(
            36,
            6,
            pdfText('#' . $this->numeroOs),
            0,
            1,
            'R'
        );

        $this->SetX(150);
        $this->SetTextColor(183, 208, 230);
        $this->SetFont('Arial', '', 6.2);
        $this->Cell(
            46,
            4,
            pdfText($this->codigoDocumento),
            0,
            1,
            'R'
        );

        $this->SetY(37);
    }

    public function Footer(): void
    {
        $this->SetY(-13);

        $this->SetDrawColor(208, 220, 231);
        $this->Line(13, $this->GetY(), 197, $this->GetY());

        $this->SetY(-10);

        $this->SetTextColor(105, 122, 141);
        $this->SetFont('Arial', '', 6.5);

        $this->Cell(
            105,
            4,
            pdfText(
                'Documento gerado eletronicamente em ' .
                date('d/m/Y H:i:s')
            ),
            0,
            0,
            'L'
        );

        $this->Cell(
            79,
            4,
            pdfText(
                'Página ' .
                $this->PageNo() .
                '/{nb}'
            ),
            0,
            0,
            'R'
        );
    }

    public function garantirEspaco(float $altura): void
    {
        if ($this->GetY() + $altura > 274) {
            $this->AddPage();
        }
    }

    public function badge(
        string $texto,
        array $fundo,
        array $corTexto,
        float $largura = 42
    ): void {
        $x = $this->GetX();
        $y = $this->GetY();

        $this->SetFillColor($fundo[0], $fundo[1], $fundo[2]);
        $this->Rect($x, $y, $largura, 7.5, 'F');

        $this->SetTextColor(
            $corTexto[0],
            $corTexto[1],
            $corTexto[2]
        );

        $this->SetFont('Arial', 'B', 7.2);
        $this->Cell(
            $largura,
            7.5,
            pdfText($texto),
            0,
            0,
            'C'
        );
    }

    public function tituloSecao(
        string $titulo,
        string $subtitulo = '',
        array $cor = [8, 57, 111]
    ): void {
        $this->garantirEspaco($subtitulo !== '' ? 15 : 11);

        $x = $this->GetX();
        $y = $this->GetY();

        $this->SetFillColor($cor[0], $cor[1], $cor[2]);
        $this->Rect($x, $y, 4, $subtitulo !== '' ? 11 : 8, 'F');

        $this->SetXY($x + 7, $y);

        $this->SetTextColor(23, 36, 56);
        $this->SetFont('Arial', 'B', 10.2);
        $this->Cell(0, 5, pdfText($titulo), 0, 1);

        if ($subtitulo !== '') {
            $this->SetX($x + 7);
            $this->SetTextColor(101, 117, 136);
            $this->SetFont('Arial', '', 6.7);
            $this->Cell(0, 4, pdfText($subtitulo), 0, 1);
        }

        $this->Ln(2);
    }

    public function infoCard(
        float $x,
        float $y,
        float $largura,
        float $altura,
        string $rotulo,
        string $valor,
        array $fundo = [246, 249, 252]
    ): void {
        $this->SetFillColor($fundo[0], $fundo[1], $fundo[2]);
        $this->SetDrawColor(220, 229, 238);
        $this->Rect($x, $y, $largura, $altura, 'DF');

        $this->SetXY($x + 3.5, $y + 3);

        $this->SetTextColor(111, 128, 148);
        $this->SetFont('Arial', 'B', 6);
        $this->Cell(
            $largura - 7,
            3.5,
            pdfText(mb_strtoupper($rotulo, 'UTF-8')),
            0,
            1
        );

        $this->SetXY($x + 3.5, $y + 7.2);
        $this->SetTextColor(24, 38, 58);
        $this->SetFont('Arial', 'B', 8.2);

        $this->MultiCell(
            $largura - 7,
            4,
            pdfText($valor),
            0,
            'L'
        );
    }

    public function duasColunasInfo(array $itens): void
    {
        $largura = 89.5;
        $gap = 5;
        $altura = 18;
        $xInicial = 13;

        foreach (array_chunk($itens, 2) as $linha) {
            $this->garantirEspaco($altura + 4);

            $y = $this->GetY();

            foreach ($linha as $indice => $item) {
                $x = $xInicial + ($indice * ($largura + $gap));

                $this->infoCard(
                    $x,
                    $y,
                    $largura,
                    $altura,
                    (string) $item['label'],
                    (string) $item['value'],
                    $item['fill'] ?? [246, 249, 252]
                );
            }

            $this->SetY($y + $altura + 4);
        }
    }

    public function calcularLinhas(float $largura, string $texto): int
    {
        $texto = str_replace("\r", '', $texto);
        $comprimento = strlen($texto);

        if ($comprimento === 0) {
            return 1;
        }

        $larguraMaxima = ($largura - 2) * 1000 / $this->FontSize;
        $separador = -1;
        $i = 0;
        $j = 0;
        $larguraLinha = 0;
        $linhas = 1;

        while ($i < $comprimento) {
            $caractere = $texto[$i];

            if ($caractere === "\n") {
                $i++;
                $separador = -1;
                $j = $i;
                $larguraLinha = 0;
                $linhas++;
                continue;
            }

            if ($caractere === ' ') {
                $separador = $i;
            }

            $codigo = ord($caractere);
            $larguraCaracter = $this->CurrentFont['cw'][$caractere]
                ?? $this->CurrentFont['cw'][chr($codigo)]
                ?? 500;

            $larguraLinha += $larguraCaracter;

            if ($larguraLinha > $larguraMaxima) {
                if ($separador === -1) {
                    if ($i === $j) {
                        $i++;
                    }
                } else {
                    $i = $separador + 1;
                }

                $separador = -1;
                $j = $i;
                $larguraLinha = 0;
                $linhas++;
            } else {
                $i++;
            }
        }

        return $linhas;
    }

    public function textoDestacado(
        string $titulo,
        string $texto,
        array $fundo,
        array $borda,
        array $corTitulo,
        array $corTexto
    ): void {
        $textoPdf = pdfText(
            $texto !== ''
                ? $texto
                : 'Não informado.'
        );

        $this->SetFont('Arial', '', 8.2);

        $linhas = $this->calcularLinhas(176, $textoPdf);
        $altura = max(27, 14 + ($linhas * 4.3));

        $this->garantirEspaco($altura + 4);

        $x = 13;
        $y = $this->GetY();

        $this->SetFillColor($fundo[0], $fundo[1], $fundo[2]);
        $this->SetDrawColor($borda[0], $borda[1], $borda[2]);
        $this->Rect($x, $y, 184, $altura, 'DF');

        $this->SetXY($x + 4, $y + 4);
        $this->SetTextColor(
            $corTitulo[0],
            $corTitulo[1],
            $corTitulo[2]
        );

        $this->SetFont('Arial', 'B', 7.3);
        $this->Cell(
            176,
            4,
            pdfText(mb_strtoupper($titulo, 'UTF-8')),
            0,
            1
        );

        $this->SetXY($x + 4, $y + 10);
        $this->SetTextColor(
            $corTexto[0],
            $corTexto[1],
            $corTexto[2]
        );

        $this->SetFont('Arial', '', 8.2);
        $this->MultiCell(
            176,
            4.3,
            $textoPdf,
            0,
            'J'
        );

        $this->SetY($y + $altura + 4);
    }

    public function linhaTimeline(
        string $tipo,
        string $descricao,
        string $usuario,
        string $data
    ): void {
        $descricaoPdf = pdfText($descricao);

        $this->SetFont('Arial', '', 7.2);
        $linhas = $this->calcularLinhas(143, $descricaoPdf);
        $altura = max(15, 9 + ($linhas * 3.8));

        $this->garantirEspaco($altura + 3);

        $x = 13;
        $y = $this->GetY();

        $this->SetFillColor(234, 244, 252);
        $this->SetDrawColor(211, 225, 236);
        $this->Rect($x, $y, 12, $altura, 'DF');

        $this->SetTextColor(8, 57, 111);
        $this->SetFont('Arial', 'B', 8);
        $this->SetXY($x, $y + 2);
        $this->Cell(12, 5, pdfText('•'), 0, 0, 'C');

        $this->SetFillColor(249, 251, 253);
        $this->Rect($x + 12, $y, 172, $altura, 'DF');

        $this->SetXY($x + 16, $y + 2.5);
        $this->SetTextColor(23, 36, 56);
        $this->SetFont('Arial', 'B', 7.3);
        $this->Cell(90, 4, pdfText($tipo), 0, 0);

        $this->SetTextColor(105, 122, 141);
        $this->SetFont('Arial', '', 6.2);
        $this->Cell(
            62,
            4,
            pdfText(dataPdf($data, 'Sem data')),
            0,
            1,
            'R'
        );

        $this->SetXY($x + 16, $y + 7);
        $this->SetTextColor(72, 88, 108);
        $this->SetFont('Arial', '', 7.2);
        $this->MultiCell(143, 3.8, $descricaoPdf, 0, 'L');

        if ($usuario !== '') {
            $this->SetXY($x + 161, $y + $altura - 5.5);
            $this->SetTextColor(8, 57, 111);
            $this->SetFont('Arial', 'I', 5.8);
            $this->Cell(
                20,
                3,
                pdfText($usuario),
                0,
                0,
                'R'
            );
        }

        $this->SetY($y + $altura + 3);
    }
}

/*
|--------------------------------------------------------------------------
| Buscar ordem de serviço
|--------------------------------------------------------------------------
*/

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

if (!$id || $id <= 0) {
    http_response_code(400);
    exit('ID inválido.');
}

$stmt = $mysqli->prepare("
    SELECT *
    FROM ordens_servico
    WHERE id = ?
    LIMIT 1
");

if (!$stmt) {
    http_response_code(500);
    exit('Não foi possível preparar a consulta da OS.');
}

$stmt->bind_param('i', $id);
$stmt->execute();

$os = $stmt->get_result()->fetch_assoc();
$stmt->close();

if (!$os) {
    http_response_code(404);
    exit('OS não encontrada.');
}

/*
|--------------------------------------------------------------------------
| Dados
|--------------------------------------------------------------------------
*/

$numeroOs = trim((string) ($os['numero_os'] ?? $id));
$statusOriginal = trim((string) ($os['status'] ?? 'Não informado'));
$statusNormalizado = textoStatus($statusOriginal);

$solicitante = trim(
    (string) ($os['nome_solicitante'] ?? 'Não informado')
);

$setor = trim((string) ($os['setor'] ?? 'Não informado'));
$telefone = trim((string) ($os['telefone'] ?? 'Não informado'));

$tipoEquipamento = trim(
    (string) ($os['tipo_equipamento'] ?? 'Não informado')
);

$marca = trim((string) ($os['marca'] ?? ''));
$modelo = trim((string) ($os['modelo'] ?? ''));

$marcaModelo = trim(
    implode(
        ' / ',
        array_filter([$marca, $modelo])
    )
);

$patrimonio = trim((string) ($os['patrimonio'] ?? ''));
$numeroSerie = trim((string) ($os['numero_serie'] ?? ''));

$prioridade = trim(
    (string) ($os['prioridade'] ?? 'Não informada')
);

$prazo = max(0, (int) ($os['prazo'] ?? 0));

$problema = trim((string) ($os['problema'] ?? ''));
$solucao = trim((string) ($os['solucao'] ?? ''));
$tecnico = trim((string) ($os['tecnico'] ?? ''));

$dataEntrada = dataPdf($os['data_entrada'] ?? null);
$dataConclusao = dataPdf(
    $os['data_saida'] ??
    $os['data_finalizacao'] ??
    null
);

$responsavelRetirada = trim(
    (string) ($os['responsavel_retirada'] ?? '')
);

$dataRetirada = dataPdf(
    $os['data_retirada'] ?? null
);

$assinaturaPath = caminhoArquivoSeguro(
    $os['assinatura'] ?? ''
);

$anexoPath = caminhoArquivoSeguro(
    $os['anexo'] ?? ''
);

$codigoDocumento = sprintf(
    'EXT-TI-OS-%06d',
    $id
);

/*
|--------------------------------------------------------------------------
| Logo
|--------------------------------------------------------------------------
*/

$logoPath = '';

$logosPossiveis = [
    __DIR__ . '/assets/logo_pref.jpg',
    __DIR__ . '/assets/logo.png',
    __DIR__ . '/assets/logo_pref.png',
    __DIR__ . '/assets/logobranca.avif'
];

foreach ($logosPossiveis as $possivel) {
    if (is_file($possivel)) {
        $extensao = strtolower(pathinfo($possivel, PATHINFO_EXTENSION));

        if (in_array($extensao, ['jpg', 'jpeg', 'png'], true)) {
            $logoPath = $possivel;
            break;
        }
    }
}

/*
|--------------------------------------------------------------------------
| Timeline opcional
|--------------------------------------------------------------------------
*/

$eventos = [];

if (tabelaExiste($mysqli, 'os_eventos')) {
    $stmtEventos = $mysqli->prepare("
        SELECT
            tipo,
            descricao,
            usuario,
            criado_em
        FROM os_eventos
        WHERE os_id = ?
        ORDER BY criado_em ASC, id ASC
        LIMIT 12
    ");

    if ($stmtEventos) {
        $stmtEventos->bind_param('i', $id);
        $stmtEventos->execute();

        $resultadoEventos = $stmtEventos->get_result();

        while ($evento = $resultadoEventos->fetch_assoc()) {
            $eventos[] = $evento;
        }

        $stmtEventos->close();
    }
}

/*
|--------------------------------------------------------------------------
| Status e cores
|--------------------------------------------------------------------------
*/

if (str_contains($statusNormalizado, 'finaliz')) {
    $statusTexto = 'FINALIZADA';
    $statusFundo = [226, 247, 239];
    $statusCor = [7, 102, 72];
} elseif (
    str_contains($statusNormalizado, 'pendente') &&
    str_contains($statusNormalizado, 'retirada')
) {
    $statusTexto = 'PENDENTE RETIRADA';
    $statusFundo = [229, 247, 251];
    $statusCor = [8, 96, 120];
} else {
    $statusTexto = mb_strtoupper($statusOriginal, 'UTF-8');
    $statusFundo = [255, 247, 230];
    $statusCor = [141, 92, 0];
}

$prioridadeNormalizada = textoStatus($prioridade);

if ($prioridadeNormalizada === 'urgente') {
    $prioridadeFundo = [255, 232, 236];
    $prioridadeCor = [151, 31, 51];
} elseif ($prioridadeNormalizada === 'alta') {
    $prioridadeFundo = [255, 239, 230];
    $prioridadeCor = [166, 65, 24];
} elseif ($prioridadeNormalizada === 'baixa') {
    $prioridadeFundo = [232, 248, 241];
    $prioridadeCor = [7, 100, 72];
} else {
    $prioridadeFundo = [255, 247, 230];
    $prioridadeCor = [141, 92, 0];
}

/*
|--------------------------------------------------------------------------
| Gerar PDF
|--------------------------------------------------------------------------
*/

$pdf = new RelatorioOSPDF(
    $logoPath,
    $numeroOs,
    $codigoDocumento
);

$pdf->SetTitle(pdfText('Relatório técnico da OS ' . $numeroOs));
$pdf->SetAuthor(pdfText('Prefeitura Municipal de Extrema'));
$pdf->SetCreator(pdfText('Sistema de Manutenção TI'));
$pdf->SetSubject(pdfText('Ordem de Serviço ' . $numeroOs));

$pdf->AddPage();

/*
|--------------------------------------------------------------------------
| Resumo executivo
|--------------------------------------------------------------------------
*/

$pdf->SetTextColor(23, 36, 56);
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(
    0,
    8,
    pdfText('RESUMO EXECUTIVO DO ATENDIMENTO'),
    0,
    1
);

$pdf->SetTextColor(101, 117, 136);
$pdf->SetFont('Arial', '', 7.5);
$pdf->MultiCell(
    0,
    4,
    pdfText(
        'Documento consolidado com os dados da solicitação, identificação ' .
        'do equipamento, diagnóstico relatado, solução técnica aplicada e ' .
        'registros de conclusão da ordem de serviço.'
    ),
    0,
    'L'
);

$pdf->Ln(3);

$pdf->badge(
    $statusTexto,
    $statusFundo,
    $statusCor,
    48
);

$pdf->SetX($pdf->GetX() + 4);

$pdf->badge(
    'PRIORIDADE ' . mb_strtoupper($prioridade, 'UTF-8'),
    $prioridadeFundo,
    $prioridadeCor,
    48
);

$pdf->SetX($pdf->GetX() + 4);

$pdf->badge(
    $prazo > 0
        ? 'PRAZO ' . $prazo . ' DIA(S)'
        : 'PRAZO NÃO DEFINIDO',
    [234, 244, 252],
    [8, 57, 111],
    48
);

$pdf->Ln(13);

/*
|--------------------------------------------------------------------------
| Solicitação
|--------------------------------------------------------------------------
*/

$pdf->tituloSecao(
    'DADOS DA SOLICITAÇÃO',
    'Identificação do servidor, unidade solicitante e período do atendimento.'
);

$pdf->duasColunasInfo([
    [
        'label' => 'Solicitante',
        'value' => $solicitante
    ],
    [
        'label' => 'Setor / unidade',
        'value' => $setor
    ],
    [
        'label' => 'Telefone',
        'value' => $telefone
    ],
    [
        'label' => 'Data de entrada',
        'value' => $dataEntrada
    ],
    [
        'label' => 'Data de conclusão',
        'value' => $dataConclusao
    ],
    [
        'label' => 'Código de validação',
        'value' => $codigoDocumento
    ]
]);

/*
|--------------------------------------------------------------------------
| Equipamento
|--------------------------------------------------------------------------
*/

$pdf->tituloSecao(
    'IDENTIFICAÇÃO DO EQUIPAMENTO',
    'Dados técnicos e patrimoniais relacionados ao atendimento.',
    [8, 127, 91]
);

$pdf->duasColunasInfo([
    [
        'label' => 'Tipo de equipamento',
        'value' => $tipoEquipamento !== ''
            ? $tipoEquipamento
            : 'Não informado'
    ],
    [
        'label' => 'Marca / modelo',
        'value' => $marcaModelo !== ''
            ? $marcaModelo
            : 'Não informado'
    ],
    [
        'label' => 'Patrimônio',
        'value' => $patrimonio !== ''
            ? $patrimonio
            : 'Não informado'
    ],
    [
        'label' => 'Número de série',
        'value' => $numeroSerie !== ''
            ? $numeroSerie
            : 'Não informado'
    ]
]);

/*
|--------------------------------------------------------------------------
| Problema e solução
|--------------------------------------------------------------------------
*/

$pdf->tituloSecao(
    'PROBLEMA RELATADO',
    'Descrição registrada no momento da abertura da ordem.',
    [189, 38, 61]
);

$pdf->textoDestacado(
    'Descrição da ocorrência',
    $problema,
    [255, 246, 248],
    [239, 203, 210],
    [151, 31, 51],
    [74, 58, 64]
);

$pdf->tituloSecao(
    'SOLUÇÃO TÉCNICA APLICADA',
    'Procedimentos, correções e validações registrados pelo responsável.',
    [8, 127, 91]
);

$pdf->textoDestacado(
    'Resultado do atendimento',
    $solucao,
    [239, 249, 244],
    [190, 229, 215],
    [7, 100, 72],
    [20, 93, 72]
);

/*
|--------------------------------------------------------------------------
| Conclusão
|--------------------------------------------------------------------------
*/

$pdf->tituloSecao(
    'CONCLUSÃO DO ATENDIMENTO',
    'Responsável técnico, situação final e retirada do equipamento.'
);

$pdf->duasColunasInfo([
    [
        'label' => 'Técnico responsável',
        'value' => $tecnico !== ''
            ? $tecnico
            : 'Não informado',
        'fill' => [239, 249, 244]
    ],
    [
        'label' => 'Status atual',
        'value' => $statusOriginal,
        'fill' => $statusFundo
    ],
    [
        'label' => 'Responsável pela retirada',
        'value' => $responsavelRetirada !== ''
            ? $responsavelRetirada
            : 'Ainda não registrado'
    ],
    [
        'label' => 'Data da retirada',
        'value' => $dataRetirada
    ]
]);

/*
|--------------------------------------------------------------------------
| Assinatura digital
|--------------------------------------------------------------------------
*/

$pdf->tituloSecao(
    'ASSINATURA E VALIDAÇÃO',
    'Comprovação digital registrada na finalização da ordem.',
    [96, 69, 184]
);

$pdf->garantirEspaco(42);

$assinaturaY = $pdf->GetY();

$pdf->SetFillColor(248, 246, 253);
$pdf->SetDrawColor(217, 209, 243);
$pdf->Rect(13, $assinaturaY, 184, 38, 'DF');

if ($assinaturaPath !== '') {
    try {
        $pdf->Image(
            $assinaturaPath,
            22,
            $assinaturaY + 4,
            55,
            25
        );
    } catch (Throwable) {
        $assinaturaPath = '';
    }
}

$pdf->SetXY(84, $assinaturaY + 5);
$pdf->SetTextColor(72, 53, 130);
$pdf->SetFont('Arial', 'B', 8.5);
$pdf->Cell(
    105,
    5,
    pdfText(
        $assinaturaPath !== ''
            ? 'ASSINATURA DIGITAL REGISTRADA'
            : 'ASSINATURA DIGITAL NÃO REGISTRADA'
    ),
    0,
    1
);

$pdf->SetX(84);
$pdf->SetTextColor(89, 103, 122);
$pdf->SetFont('Arial', '', 7);
$pdf->MultiCell(
    105,
    4,
    pdfText(
        $assinaturaPath !== ''
            ? (
                'Responsável técnico: ' .
                ($tecnico !== '' ? $tecnico : 'Não informado') .
                '. A imagem acima corresponde à assinatura armazenada ' .
                'durante a finalização da OS.'
            )
            : (
                'Não há imagem de assinatura vinculada a esta ordem. ' .
                'Consulte o termo de entrega para coleta manual.'
            )
    ),
    0,
    'L'
);

$pdf->SetXY(84, $assinaturaY + 27);
$pdf->SetTextColor(8, 57, 111);
$pdf->SetFont('Arial', 'B', 6.4);
$pdf->Cell(
    105,
    4,
    pdfText('Validação interna: ' . $codigoDocumento),
    0,
    1
);

$pdf->SetY($assinaturaY + 42);

/*
|--------------------------------------------------------------------------
| Evidência
|--------------------------------------------------------------------------
*/

if ($anexoPath !== '') {
    $pdf->tituloSecao(
        'EVIDÊNCIA ANEXADA',
        'Arquivo vinculado à finalização do atendimento.',
        [8, 127, 156]
    );

    $extensao = strtolower(
        pathinfo($anexoPath, PATHINFO_EXTENSION)
    );

    if (in_array($extensao, ['png', 'jpg', 'jpeg'], true)) {
        $pdf->garantirEspaco(62);

        $evidenciaY = $pdf->GetY();

        $pdf->SetFillColor(246, 249, 252);
        $pdf->SetDrawColor(220, 229, 238);
        $pdf->Rect(13, $evidenciaY, 184, 57, 'DF');

        try {
            $pdf->Image(
                $anexoPath,
                18,
                $evidenciaY + 4,
                72,
                49
            );
        } catch (Throwable) {
            // Continua exibindo a identificação textual do arquivo.
        }

        $pdf->SetXY(96, $evidenciaY + 8);
        $pdf->SetTextColor(23, 36, 56);
        $pdf->SetFont('Arial', 'B', 8.2);
        $pdf->Cell(
            92,
            5,
            pdfText('EVIDÊNCIA VISUAL DA FINALIZAÇÃO'),
            0,
            1
        );

        $pdf->SetX(96);
        $pdf->SetTextColor(101, 117, 136);
        $pdf->SetFont('Arial', '', 7);
        $pdf->MultiCell(
            92,
            4,
            pdfText(
                'Arquivo: ' .
                basename($anexoPath) .
                '. Esta imagem foi vinculada à ordem como evidência do ' .
                'procedimento ou resultado do atendimento.'
            ),
            0,
            'L'
        );

        $pdf->SetY($evidenciaY + 61);
    } else {
        $pdf->duasColunasInfo([
            [
                'label' => 'Anexo registrado',
                'value' => basename($anexoPath)
            ],
            [
                'label' => 'Tipo de arquivo',
                'value' => mb_strtoupper($extensao, 'UTF-8')
            ]
        ]);
    }
}

/*
|--------------------------------------------------------------------------
| Histórico
|--------------------------------------------------------------------------
*/

if ($eventos) {
    $pdf->tituloSecao(
        'HISTÓRICO DA ORDEM',
        'Principais eventos registrados na linha do tempo.',
        [8, 127, 156]
    );

    foreach ($eventos as $evento) {
        $pdf->linhaTimeline(
            trim((string) ($evento['tipo'] ?? 'Evento')),
            trim((string) ($evento['descricao'] ?? '')),
            trim((string) ($evento['usuario'] ?? '')),
            trim((string) ($evento['criado_em'] ?? ''))
        );
    }
}

/*
|--------------------------------------------------------------------------
| Declaração final
|--------------------------------------------------------------------------
*/

$pdf->garantirEspaco(30);

$pdf->Ln(2);

$pdf->SetFillColor(234, 244, 252);
$pdf->SetDrawColor(198, 216, 230);

$declaracaoY = $pdf->GetY();

$pdf->Rect(13, $declaracaoY, 184, 24, 'DF');

$pdf->SetXY(17, $declaracaoY + 4);
$pdf->SetTextColor(8, 57, 111);
$pdf->SetFont('Arial', 'B', 7.2);
$pdf->Cell(
    176,
    4,
    pdfText('DECLARAÇÃO DE INTEGRIDADE DO REGISTRO'),
    0,
    1
);

$pdf->SetX(17);
$pdf->SetTextColor(72, 88, 108);
$pdf->SetFont('Arial', '', 6.8);
$pdf->MultiCell(
    176,
    3.8,
    pdfText(
        'Este relatório reproduz as informações armazenadas no sistema ' .
        'institucional de manutenção. Alterações, entrega física do ' .
        'equipamento e ciência do solicitante devem permanecer registradas ' .
        'na ordem de serviço e em seus respectivos termos.'
    ),
    0,
    'J'
);

/*
|--------------------------------------------------------------------------
| Saída
|--------------------------------------------------------------------------
*/

$nomeSeguro = preg_replace(
    '/[^A-Za-z0-9_-]+/',
    '_',
    $numeroOs
) ?: (string) $id;

$pdf->Output(
    'I',
    'Relatorio_OS_' . $nomeSeguro . '.pdf'
);
