<?php
declare(strict_types=1);

require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/conexao.php';
require_once __DIR__ . '/computadores_helpers.php';

date_default_timezone_set('America/Sao_Paulo');

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');

function patrimonioResponder(array $dados, int $status = 200): never
{
    http_response_code($status);

    echo json_encode(
        $dados,
        JSON_UNESCAPED_UNICODE |
        JSON_UNESCAPED_SLASHES |
        JSON_HEX_TAG |
        JSON_HEX_APOS |
        JSON_HEX_QUOT |
        JSON_HEX_AMP
    );

    exit;
}

function patrimonioTabelaExiste(
    mysqli $mysqli,
    string $tabela
): bool {
    $nome = $mysqli->real_escape_string($tabela);
    $resultado = $mysqli->query("SHOW TABLES LIKE '{$nome}'");

    return $resultado instanceof mysqli_result &&
        $resultado->num_rows > 0;
}

function patrimonioCompacto(string $valor): string
{
    return preg_replace(
        '/[^a-z0-9]+/i',
        '',
        compNormalizar($valor)
    ) ?? '';
}

function patrimonioSqlCompacto(string $campo): string
{
    return "LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CAST(COALESCE({$campo}, '') AS CHAR), ' ', ''), '.', ''), '-', ''), '/', ''), '(', ''), ')', ''), '+', ''), '_', ''), ':', ''))";
}

function patrimonioData(?string $data): string
{
    $data = trim((string) $data);

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

    $timestamp = strtotime($data);

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

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

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

    $normalizado = compNormalizar($texto);

    $invalidos = [
        '',
        'na',
        'n/a',
        'nao',
        'naoha',
        'naoinformado',
        'naoinformada',
        'naoidentificado',
        'naoidentificada',
        'semregistro',
        'sem informacao',
        'sem identificação',
        'desconhecido',
        'desconhecida',
        'null',
        '0',
        '-',
        '--'
    ];

    $invalidosNormalizados = array_map(
        static fn(string $item): string => compNormalizar($item),
        $invalidos
    );

    return in_array($normalizado, $invalidosNormalizados, true)
        ? null
        : $texto;
}

function patrimonioPrimeiroValor(
    array $linhas,
    string $campo
): ?string {
    foreach ($linhas as $linha) {
        $valor = patrimonioValorUtil($linha[$campo] ?? null);

        if ($valor !== null) {
            return $valor;
        }
    }

    return null;
}

function patrimonioTipoComputador(?string $tipo): ?string
{
    $normalizado = compNormalizar((string) $tipo);

    if ($normalizado === '') {
        return null;
    }

    if (str_contains($normalizado, 'notebook') ||
        str_contains($normalizado, 'laptop')) {
        return 'NOTEBOOK';
    }

    if (str_contains($normalizado, 'allinone') ||
        str_contains($normalizado, 'all in one')) {
        return 'ALL_IN_ONE';
    }

    if (str_contains($normalizado, 'minipc')) {
        return 'MINI_PC';
    }

    if (str_contains($normalizado, 'workstation')) {
        return 'WORKSTATION';
    }

    if (str_contains($normalizado, 'thinclient')) {
        return 'THIN_CLIENT';
    }

    if (
        str_contains($normalizado, 'cpu') ||
        str_contains($normalizado, 'desktop') ||
        str_contains($normalizado, 'computador') ||
        $normalizado === 'pc'
    ) {
        return 'DESKTOP';
    }

    return null;
}

if (compEhCynthia()) {
    patrimonioResponder([
        'ok' => false,
        'message' => 'Seu perfil não possui acesso ao cadastro de computadores.'
    ], 403);
}

if (!$mysqli instanceof mysqli) {
    patrimonioResponder([
        'ok' => false,
        'message' => 'Conexão com o banco indisponível.'
    ], 500);
}

$mysqli->set_charset('utf8mb4');

$patrimonio = compTexto($_GET['patrimonio'] ?? '', 80);
$ignorarComputadorId = max(
    0,
    (int) ($_GET['ignorar_computador_id'] ?? 0)
);

$tamanho = function_exists('mb_strlen')
    ? mb_strlen($patrimonio, 'UTF-8')
    : strlen($patrimonio);

if ($tamanho < 2) {
    patrimonioResponder([
        'ok' => false,
        'message' => 'Informe pelo menos dois caracteres do patrimônio.'
    ], 422);
}

$compacto = patrimonioCompacto($patrimonio);

if ($compacto === '') {
    patrimonioResponder([
        'ok' => false,
        'message' => 'O patrimônio informado não possui caracteres pesquisáveis.'
    ], 422);
}

$computadorExistente = null;

if (patrimonioTabelaExiste($mysqli, 'ti_computadores')) {
    $expressao = patrimonioSqlCompacto('c.patrimonio');

    $sql = "
        SELECT
            c.id,
            c.codigo_interno,
            c.tipo,
            c.patrimonio,
            c.numero_serie,
            c.nome_maquina,
            c.fabricante,
            c.modelo,
            c.status,
            c.responsavel_nome,
            c.localizacao_texto,
            s.nome AS setor_nome,
            a.nome AS ambiente_nome
        FROM ti_computadores AS c
        LEFT JOIN ti_setores AS s
            ON s.id = c.setor_id
        LEFT JOIN ti_ambientes AS a
            ON a.id = c.ambiente_id
        WHERE c.id <> ?
          AND (
              LOWER(TRIM(COALESCE(c.patrimonio, ''))) = LOWER(TRIM(?))
              OR {$expressao} = ?
          )
        ORDER BY c.atualizado_em DESC, c.id DESC
        LIMIT 1
    ";

    $stmt = $mysqli->prepare($sql);

    if ($stmt) {
        $stmt->bind_param(
            'iss',
            $ignorarComputadorId,
            $patrimonio,
            $compacto
        );

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

        if ($linha) {
            $computadorExistente = [
                'id' => (int) $linha['id'],
                'codigo_interno' => (string) $linha['codigo_interno'],
                'tipo' => (string) $linha['tipo'],
                'patrimonio' => (string) $linha['patrimonio'],
                'numero_serie' => (string) ($linha['numero_serie'] ?? ''),
                'nome_maquina' => (string) ($linha['nome_maquina'] ?? ''),
                'fabricante' => (string) ($linha['fabricante'] ?? ''),
                'modelo' => (string) ($linha['modelo'] ?? ''),
                'status' => (string) ($linha['status'] ?? ''),
                'responsavel_nome' => (string) ($linha['responsavel_nome'] ?? ''),
                'setor_nome' => (string) ($linha['setor_nome'] ?? ''),
                'ambiente_nome' => (string) ($linha['ambiente_nome'] ?? ''),
                'localizacao_texto' => (string) ($linha['localizacao_texto'] ?? '')
            ];
        }
    }
}

$historico = [];
$totalHistorico = 0;

if (patrimonioTabelaExiste($mysqli, 'ordens_servico')) {
    $expressao = patrimonioSqlCompacto('patrimonio');

    $sqlContagem = "
        SELECT COUNT(*) AS total
        FROM ordens_servico
        WHERE
            LOWER(TRIM(COALESCE(patrimonio, ''))) = LOWER(TRIM(?))
            OR {$expressao} = ?
    ";

    $stmt = $mysqli->prepare($sqlContagem);

    if ($stmt) {
        $stmt->bind_param('ss', $patrimonio, $compacto);
        $stmt->execute();
        $totalHistorico = (int) (
            $stmt->get_result()->fetch_assoc()['total'] ?? 0
        );
        $stmt->close();
    }

    $sqlHistorico = "
        SELECT
            id,
            numero_os,
            nome_solicitante,
            setor,
            telefone,
            tipo_equipamento,
            marca,
            modelo,
            patrimonio,
            numero_serie,
            problema,
            diagnostico,
            solucao,
            pecas,
            status,
            prioridade,
            tecnico,
            responsavel_retirada,
            data_entrada,
            data_saida,
            data_retirada
        FROM ordens_servico
        WHERE
            LOWER(TRIM(COALESCE(patrimonio, ''))) = LOWER(TRIM(?))
            OR {$expressao} = ?
        ORDER BY data_entrada DESC, id DESC
        LIMIT 30
    ";

    $stmt = $mysqli->prepare($sqlHistorico);

    if ($stmt) {
        $stmt->bind_param('ss', $patrimonio, $compacto);
        $stmt->execute();
        $resultado = $stmt->get_result();

        while ($linha = $resultado->fetch_assoc()) {
            $historico[] = $linha;
        }

        $stmt->close();
    }
}

$sugestao = null;

if ($historico) {
    $ultima = $historico[0];
    $responsavel = patrimonioPrimeiroValor(
        $historico,
        'nome_solicitante'
    );
    $setor = patrimonioPrimeiroValor($historico, 'setor');

    $sugestao = [
        'tipo' => patrimonioTipoComputador(
            patrimonioPrimeiroValor(
                $historico,
                'tipo_equipamento'
            )
        ),
        'patrimonio' => patrimonioPrimeiroValor(
            $historico,
            'patrimonio'
        ) ?: $patrimonio,
        'numero_serie' => patrimonioPrimeiroValor(
            $historico,
            'numero_serie'
        ),
        'fabricante' => patrimonioPrimeiroValor(
            $historico,
            'marca'
        ),
        'modelo' => patrimonioPrimeiroValor(
            $historico,
            'modelo'
        ),
        'responsavel_nome' => $responsavel,
        'setor_nome' => $setor,
        'status' => ($responsavel !== null && $setor !== null)
            ? 'EM_USO'
            : 'CADASTRO_INICIAL',
        'ultima_os_id' => (int) ($ultima['id'] ?? 0),
        'ultima_os_numero' => (string) (
            $ultima['numero_os'] ??
            $ultima['id'] ??
            ''
        ),
        'ultima_data' => patrimonioData(
            $ultima['data_entrada'] ?? null
        ),
        'ultimo_problema' => patrimonioValorUtil(
            $ultima['problema'] ?? null
        ),
        'ultima_solucao' => patrimonioValorUtil(
            $ultima['solucao'] ?? null
        )
    ];
}

$historicoResumo = array_map(
    static function (array $linha): array {
        return [
            'id' => (int) ($linha['id'] ?? 0),
            'numero_os' => (string) (
                $linha['numero_os'] ??
                $linha['id'] ??
                ''
            ),
            'data' => patrimonioData(
                $linha['data_entrada'] ?? null
            ),
            'solicitante' => (string) (
                $linha['nome_solicitante'] ?? ''
            ),
            'setor' => (string) ($linha['setor'] ?? ''),
            'equipamento' => trim(
                implode(
                    ' • ',
                    array_filter([
                        patrimonioValorUtil(
                            $linha['tipo_equipamento'] ?? null
                        ),
                        patrimonioValorUtil($linha['marca'] ?? null),
                        patrimonioValorUtil($linha['modelo'] ?? null)
                    ])
                )
            ),
            'serie' => (string) ($linha['numero_serie'] ?? ''),
            'problema' => (string) ($linha['problema'] ?? ''),
            'solucao' => (string) ($linha['solucao'] ?? ''),
            'status' => (string) ($linha['status'] ?? '')
        ];
    },
    array_slice($historico, 0, 8)
);

patrimonioResponder([
    'ok' => true,
    'patrimonio' => $patrimonio,
    'computador_existente' => $computadorExistente,
    'total_historico' => $totalHistorico,
    'sugestao' => $sugestao,
    'historico' => $historicoResumo
]);
