<?php
declare(strict_types=1);

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

date_default_timezone_set('America/Sao_Paulo');

require_once __DIR__ . '/../permissoes_ti.php';

function atiE(mixed $valor): string
{
    return htmlspecialchars((string) $valor, ENT_QUOTES, 'UTF-8');
}

function atiNormalizar(string $texto): string
{
    $texto = trim($texto);
    if (function_exists('mb_strtolower')) {
        $texto = mb_strtolower($texto, 'UTF-8');
    } else {
        $texto = strtolower($texto);
    }

    $texto = strtr($texto, [
        'á'=>'a','à'=>'a','â'=>'a','ã'=>'a','ä'=>'a',
        'é'=>'e','è'=>'e','ê'=>'e','ë'=>'e',
        'í'=>'i','ì'=>'i','î'=>'i','ï'=>'i',
        'ó'=>'o','ò'=>'o','ô'=>'o','õ'=>'o','ö'=>'o',
        'ú'=>'u','ù'=>'u','û'=>'u','ü'=>'u','ç'=>'c'
    ]);

    return preg_replace('/[^a-z0-9]+/', '', $texto) ?? '';
}

function atiTexto(mixed $valor, int $limite = 255): string
{
    $texto = trim((string) $valor);
    $texto = preg_replace('/\s+/u', ' ', $texto) ?? $texto;
    if (function_exists('mb_substr')) {
        return mb_substr($texto, 0, $limite, 'UTF-8');
    }
    return substr($texto, 0, $limite);
}

function atiNulo(mixed $valor, int $limite = 255): ?string
{
    $texto = atiTexto($valor, $limite);
    return $texto === '' ? null : $texto;
}

function atiUsuario(): string
{
    return trim((string) ($_SESSION['usuario'] ?? ''));
}

function atiUsuarioNormalizado(): string
{
    return atiNormalizar(atiUsuario());
}

function atiExigirLogin(): void
{
    if (!empty($_SESSION['user_id']) && atiUsuario() !== '') return;
    header('Location: ' . tiPermUrl('login.php'));
    exit;
}

function atiTiposPermitidos(): array
{
    global $mysqli;
    if (!isset($mysqli) || !$mysqli instanceof mysqli || !tiPermEstruturaDisponivel($mysqli)) {
        return match (atiUsuarioNormalizado()) {
            'renan' => ['COMPUTADOR','IMPRESSORA','SMARTPHONE','CHIP'],
            'marcelo' => ['COMPUTADOR','IMPRESSORA'],
            default => []
        };
    }

    $tipos=[];
    if(tiPermPode($mysqli,'computadores','visualizar'))$tipos[]='COMPUTADOR';
    if(tiPermPode($mysqli,'impressoras','visualizar'))$tipos[]='IMPRESSORA';
    if(tiPermPode($mysqli,'smartphones','visualizar'))$tipos[]='SMARTPHONE';
    if(tiPermPode($mysqli,'chips','visualizar'))$tipos[]='CHIP';
    return $tipos;
}

function atiEhRenan(): bool
{
    return tiPermEhRenan();
}

function atiExigirAcesso(?string $tipo = null): void
{
    global $mysqli;
    atiExigirLogin();
    if (isset($mysqli) && $mysqli instanceof mysqli && tiPermEstruturaDisponivel($mysqli)) {
        tiPermExigir($mysqli,'central_ativos','visualizar');
    }
    $permitidos=atiTiposPermitidos();
    if($tipo===null ? $permitidos!==[] : in_array($tipo,$permitidos,true))return;
    http_response_code(403);
    echo '<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Acesso restrito</title><style>body{margin:0;min-height:100vh;display:grid;place-items:center;padding:20px;font-family:Arial,sans-serif;background:#edf3f8;color:#172438}.box{width:min(600px,100%);padding:34px;border-radius:25px;background:#fff;box-shadow:0 30px 80px rgba(8,57,111,.18);text-align:center}h1{color:#bf263d}a{display:inline-flex;margin-top:16px;padding:12px 16px;border-radius:12px;color:#fff;background:#08396f;text-decoration:none;font-weight:bold}</style></head><body><main class="box"><h1>Central de Ativos restrita</h1><p>Seu usuário não possui permissão para consultar estes ativos.</p><a href="'.atiE(tiPermPaginaInicial($mysqli)).'">Voltar ao meu painel</a></main></body></html>';
    exit;
}

function atiTabelaExiste(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 atiColunaExiste(mysqli $mysqli, string $tabela, string $coluna): bool
{
    $stmt = $mysqli->prepare("SELECT COUNT(*) total FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? AND COLUMN_NAME=?");
    if (!$stmt) return false;
    $stmt->bind_param('ss', $tabela, $coluna);
    $stmt->execute();
    $linha = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    return (int) ($linha['total'] ?? 0) > 0;
}

function atiBind(mysqli_stmt $stmt, string $tipos, array &$valores): void
{
    if ($tipos === '') return;
    $args = [$tipos];
    foreach ($valores as $indice => $valor) {
        $args[] = &$valores[$indice];
    }
    $stmt->bind_param(...$args);
}

function atiCsrf(): string
{
    if (empty($_SESSION['csrf_central_ativos'])) {
        $_SESSION['csrf_central_ativos'] = bin2hex(random_bytes(24));
    }
    return (string) $_SESSION['csrf_central_ativos'];
}

function atiValidarCsrf(): void
{
    $recebido = (string) ($_POST['csrf_token'] ?? '');
    $esperado = (string) ($_SESSION['csrf_central_ativos'] ?? '');
    if ($recebido === '' || $esperado === '' || !hash_equals($esperado, $recebido)) {
        throw new RuntimeException('A sessão expirou. Atualize a página e tente novamente.');
    }
}

function atiFlash(string $tipo, string $mensagem): void
{
    $_SESSION['central_ativos_flash'] = ['tipo'=>$tipo,'mensagem'=>$mensagem];
}

function atiConsumirFlash(): ?array
{
    $flash = $_SESSION['central_ativos_flash'] ?? null;
    unset($_SESSION['central_ativos_flash']);
    return is_array($flash) ? $flash : null;
}

function atiRedirecionar(string $url): never
{
    header('Location: ' . $url);
    exit;
}

function atiValorValido(mixed $valor): bool
{
    $texto = atiNormalizar((string) $valor);
    return $texto !== '' && !in_array($texto, [
        '0','00','000','na','nada','naoha','naoinformado','naoidentificado',
        'desconhecido','semnumero','semsérie','semserie','null','nenhum'
    ], true);
}

function atiLimparIdentificador(mixed $valor): ?string
{
    if (!atiValorValido($valor)) return null;
    $normal = strtoupper(preg_replace('/[^A-Za-z0-9]+/', '', (string) $valor) ?? '');
    return $normal === '' ? null : $normal;
}

function atiQualidade(string $tipo, array $r): int
{
    $regras = match ($tipo) {
        'COMPUTADOR' => [
            'patrimonio'=>12,'numero_serie'=>10,'fabricante'=>7,'modelo'=>7,
            'responsavel_nome'=>13,'setor_nome'=>13,'ambiente_nome'=>8,
            'localizacao_texto'=>7,'nome_maquina'=>7,'processador'=>5,
            'memoria_ram_gb'=>4,'sistema_operacional'=>4,'status'=>3
        ],
        'IMPRESSORA' => [
            'patrimonio'=>12,'numero_serie'=>10,'marca'=>8,'modelo'=>8,
            'responsavel_nome'=>12,'setor_nome'=>13,'ambiente_nome'=>8,
            'localizacao_texto'=>7,'ip'=>5,'toner_modelo'=>7,'status'=>5,'condicao'=>5
        ],
        'SMARTPHONE' => [
            'patrimonio'=>8,'imei1'=>14,'numero_serie'=>9,'marca'=>8,'modelo'=>8,
            'responsavel_nome'=>14,'setor'=>14,'status'=>8,'condicao_aparelho'=>7,
            'sistema_operacional'=>5,'acessorios'=>5
        ],
        'CHIP' => [
            'numero_linha'=>18,'iccid'=>15,'operadora'=>10,'responsavel_nome'=>18,
            'setor'=>18,'status'=>10,'plano'=>6,'pacote_dados'=>5
        ],
        default => []
    };

    $pontos = 0;
    $total = array_sum($regras);
    foreach ($regras as $campo => $peso) {
        if (atiValorValido($r[$campo] ?? null)) $pontos += $peso;
    }
    return $total > 0 ? (int) round(($pontos / $total) * 100) : 0;
}

function atiCodigoPorId(int $id, ?string $ano = null): string
{
    $ano = $ano ?: date('Y');
    return 'ATI-' . $ano . '-' . str_pad((string) $id, 7, '0', STR_PAD_LEFT);
}

function atiRegistrarEvento(mysqli $mysqli, ?int $ativoId, string $tipo, string $titulo, ?string $detalhes = null): void
{
    $usuario = atiUsuario() ?: 'Usuário autenticado';
    $stmt = $mysqli->prepare("INSERT INTO ti_ativo_eventos(ativo_id,tipo_evento,titulo,detalhes,usuario) VALUES(NULLIF(?,0),?,?,?,?)");
    if (!$stmt) return;
    $id = $ativoId ?? 0;
    $stmt->bind_param('issss', $id, $tipo, $titulo, $detalhes, $usuario);
    $stmt->execute();
    $stmt->close();
}

function atiSincronizarLinha(mysqli $mysqli, string $tipo, string $tabela, array $r): array
{
    $origemId = (int) ($r['id'] ?? 0);
    if ($origemId <= 0) return ['criado'=>0,'atualizado'=>0];

    $patrimonio = atiLimparIdentificador($r['patrimonio'] ?? null);
    $serie = atiLimparIdentificador($r['numero_serie'] ?? ($r['iccid'] ?? null));
    $secundario = match ($tipo) {
        'SMARTPHONE' => atiLimparIdentificador($r['imei1'] ?? null),
        'CHIP' => atiLimparIdentificador($r['numero_linha'] ?? null),
        default => atiLimparIdentificador($r['codigo_interno'] ?? null)
    };
    $status = atiTexto($r['status'] ?? '', 50);
    $qualidade = atiQualidade($tipo, $r);
    $garantia = atiNulo($r['garantia_ate'] ?? null, 10);
    $usuario = atiUsuario() ?: 'Sincronização automática';

    $stmt = $mysqli->prepare("SELECT id,codigo_ativo FROM ti_ativos WHERE origem_tabela=? AND origem_id=? LIMIT 1");
    $stmt->bind_param('si', $tabela, $origemId);
    $stmt->execute();
    $existente = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if ($existente) {
        $ativoId = (int) $existente['id'];
        $stmt = $mysqli->prepare("UPDATE ti_ativos SET tipo_ativo=?,patrimonio_normalizado=?,serie_normalizada=?,identificador_secundario=?,status_global=?,qualidade_cadastro=?,garantia_ate=COALESCE(?,garantia_ate) WHERE id=?");
        $stmt->bind_param('sssssisi', $tipo, $patrimonio, $serie, $secundario, $status, $qualidade, $garantia, $ativoId);
        $stmt->execute();
        $stmt->close();
        return ['criado'=>0,'atualizado'=>1];
    }

    $stmt = $mysqli->prepare("INSERT INTO ti_ativos(tipo_ativo,origem_tabela,origem_id,patrimonio_normalizado,serie_normalizada,identificador_secundario,status_global,qualidade_cadastro,garantia_ate,criado_por) VALUES(?,?,?,?,?,?,?,?,?,?)");
    $stmt->bind_param('ssissssiss', $tipo, $tabela, $origemId, $patrimonio, $serie, $secundario, $status, $qualidade, $garantia, $usuario);
    if (!$stmt->execute()) {
        $erro = $stmt->error;
        $stmt->close();
        throw new RuntimeException('Falha ao integrar ativo: ' . $erro);
    }
    $ativoId = (int) $stmt->insert_id;
    $stmt->close();

    $codigo = atiCodigoPorId($ativoId);
    $stmt = $mysqli->prepare("UPDATE ti_ativos SET codigo_ativo=? WHERE id=?");
    $stmt->bind_param('si', $codigo, $ativoId);
    $stmt->execute();
    $stmt->close();

    atiRegistrarEvento($mysqli, $ativoId, 'INTEGRADO', 'Ativo integrado à Central', 'Origem: ' . $tabela . ' #' . $origemId);
    return ['criado'=>1,'atualizado'=>0];
}

function atiSincronizarTodos(mysqli $mysqli, ?array $somenteTipos = null): array
{
    $tipos = $somenteTipos ?? ['COMPUTADOR','IMPRESSORA','SMARTPHONE','CHIP'];
    $fontes = [
        'COMPUTADOR' => ['tabela'=>'ti_computadores','sql'=>"SELECT c.*,s.nome setor_nome,a.nome ambiente_nome FROM ti_computadores c LEFT JOIN ti_setores s ON s.id=c.setor_id LEFT JOIN ti_ambientes a ON a.id=c.ambiente_id"],
        'IMPRESSORA' => ['tabela'=>'ti_impressoras','sql'=>"SELECT i.*,s.nome setor_nome,a.nome ambiente_nome FROM ti_impressoras i LEFT JOIN ti_setores s ON s.id=i.setor_id LEFT JOIN ti_ambientes a ON a.id=i.ambiente_id"],
        'SMARTPHONE' => ['tabela'=>'telecom_smartphones','sql'=>"SELECT * FROM telecom_smartphones"],
        'CHIP' => ['tabela'=>'telecom_chips','sql'=>"SELECT * FROM telecom_chips"]
    ];

    $resultado = ['criados'=>0,'atualizados'=>0,'fontes'=>[]];
    $mysqli->begin_transaction();
    try {
        foreach ($tipos as $tipo) {
            if (!isset($fontes[$tipo])) continue;
            $fonte = $fontes[$tipo];
            if (!atiTabelaExiste($mysqli, $fonte['tabela'])) continue;
            $res = $mysqli->query($fonte['sql']);
            if (!$res) continue;
            $contagem = 0;
            while ($r = $res->fetch_assoc()) {
                $feito = atiSincronizarLinha($mysqli, $tipo, $fonte['tabela'], $r);
                $resultado['criados'] += $feito['criado'];
                $resultado['atualizados'] += $feito['atualizado'];
                $contagem++;
            }
            $res->free();
            $resultado['fontes'][$tipo] = $contagem;
        }
        $mysqli->commit();
    } catch (Throwable $e) {
        $mysqli->rollback();
        throw $e;
    }
    return $resultado;
}

function atiCarregarCentral(mysqli $mysqli, int $id): ?array
{
    $stmt = $mysqli->prepare("SELECT * FROM ti_ativos WHERE id=? LIMIT 1");
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $r = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    return $r ?: null;
}

function atiCarregarFonte(mysqli $mysqli, array $ativo): ?array
{
    $id = (int) $ativo['origem_id'];
    $tipo = (string) $ativo['tipo_ativo'];
    $sql = match ($tipo) {
        'COMPUTADOR' => "SELECT c.*,s.nome setor_nome,s.secretaria,s.predio,s.andar,a.nome ambiente_nome FROM ti_computadores c LEFT JOIN ti_setores s ON s.id=c.setor_id LEFT JOIN ti_ambientes a ON a.id=c.ambiente_id WHERE c.id=? LIMIT 1",
        'IMPRESSORA' => "SELECT i.*,s.nome setor_nome,s.secretaria,s.predio,s.andar,a.nome ambiente_nome FROM ti_impressoras i LEFT JOIN ti_setores s ON s.id=i.setor_id LEFT JOIN ti_ambientes a ON a.id=i.ambiente_id WHERE i.id=? LIMIT 1",
        'SMARTPHONE' => "SELECT * FROM telecom_smartphones WHERE id=? LIMIT 1",
        'CHIP' => "SELECT * FROM telecom_chips WHERE id=? LIMIT 1",
        default => null
    };
    if ($sql === null) return null;
    $stmt = $mysqli->prepare($sql);
    if (!$stmt) return null;
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $r = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    return $r ?: null;
}

function atiResumoFonte(string $tipo, array $r): array
{
    return match ($tipo) {
        'COMPUTADOR' => [
            'nome'=>trim(($r['fabricante']??'').' '.($r['modelo']??'')) ?: ($r['tipo']??'Computador'),
            'subtipo'=>$r['tipo']??'Computador','patrimonio'=>$r['patrimonio']??null,'serie'=>$r['numero_serie']??null,
            'responsavel'=>$r['responsavel_nome']??null,'setor'=>$r['setor_nome']??null,'ambiente'=>$r['ambiente_nome']??null,
            'local'=>$r['localizacao_texto']??null,'status'=>$r['status']??null,'condicao'=>$r['condicao']??null,
            'garantia'=>$r['garantia_ate']??null,'identificador'=>$r['nome_maquina']??null,'atualizado'=>$r['atualizado_em']??null,
            'modulo_url'=>'../computadores.php?buscar='.rawurlencode((string)($r['patrimonio']??$r['numero_serie']??''))
        ],
        'IMPRESSORA' => [
            'nome'=>trim(($r['marca']??'').' '.($r['modelo']??'')) ?: 'Impressora','subtipo'=>$r['tipo']??'Impressora',
            'patrimonio'=>$r['patrimonio']??null,'serie'=>$r['numero_serie']??null,'responsavel'=>$r['responsavel_nome']??null,
            'setor'=>$r['setor_nome']??null,'ambiente'=>$r['ambiente_nome']??null,'local'=>$r['localizacao_texto']??null,
            'status'=>$r['status']??null,'condicao'=>$r['condicao']??null,'garantia'=>$r['garantia_ate']??null,
            'identificador'=>$r['ip']??$r['nome_rede']??null,'atualizado'=>$r['atualizado_em']??null,
            'modulo_url'=>'../detalhes_impressora.php?id='.(int)($r['id']??0)
        ],
        'SMARTPHONE' => [
            'nome'=>trim(($r['marca']??'').' '.($r['modelo']??'')) ?: 'Smartphone','subtipo'=>'Smartphone',
            'patrimonio'=>$r['patrimonio']??null,'serie'=>$r['numero_serie']??null,'responsavel'=>$r['responsavel_nome']??null,
            'setor'=>$r['setor']??null,'ambiente'=>null,'local'=>null,'status'=>$r['status']??null,'condicao'=>$r['condicao_aparelho']??null,
            'garantia'=>null,'identificador'=>$r['imei1']??null,'atualizado'=>$r['atualizado_em']??null,
            'modulo_url'=>'../smartphones.php'
        ],
        'CHIP' => [
            'nome'=>'Linha '.(($r['numero_linha']??'') ?: ($r['codigo_interno']??'sem número')),'subtipo'=>'Chip móvel',
            'patrimonio'=>null,'serie'=>$r['iccid']??null,'responsavel'=>$r['responsavel_nome']??null,
            'setor'=>$r['setor']??null,'ambiente'=>null,'local'=>null,'status'=>$r['status']??null,'condicao'=>null,
            'garantia'=>null,'identificador'=>$r['numero_linha']??null,'atualizado'=>$r['atualizado_em']??null,
            'modulo_url'=>'../chips.php'
        ],
        default => []
    };
}

function atiListarResumos(mysqli $mysqli, array $tipos): array
{
    $ativos = [];

    foreach ($tipos as $tipo) {
        $sql = match ($tipo) {
            'COMPUTADOR' => atiTabelaExiste($mysqli, 'ti_computadores') ? "
                SELECT a.*, c.tipo subtipo,
                       TRIM(CONCAT(COALESCE(c.fabricante,''),' ',COALESCE(c.modelo,''))) nome,
                       c.patrimonio, c.numero_serie serie, c.responsavel_nome responsavel,
                       s.nome setor, s.secretaria secretaria, s.predio predio, am.nome ambiente, c.localizacao_texto local,
                       c.status, c.condicao, c.garantia_ate garantia,
                       c.nome_maquina identificador, c.atualizado_em atualizado
                FROM ti_ativos a
                JOIN ti_computadores c ON c.id=a.origem_id
                LEFT JOIN ti_setores s ON s.id=c.setor_id
                LEFT JOIN ti_ambientes am ON am.id=c.ambiente_id
                WHERE a.tipo_ativo='COMPUTADOR' AND a.origem_tabela='ti_computadores'
            " : null,
            'IMPRESSORA' => atiTabelaExiste($mysqli, 'ti_impressoras') ? "
                SELECT a.*, i.tipo subtipo,
                       TRIM(CONCAT(COALESCE(i.marca,''),' ',COALESCE(i.modelo,''))) nome,
                       i.patrimonio, i.numero_serie serie, i.responsavel_nome responsavel,
                       s.nome setor, s.secretaria secretaria, s.predio predio, am.nome ambiente, i.localizacao_texto local,
                       i.status, i.condicao, i.garantia_ate garantia,
                       COALESCE(NULLIF(i.ip,''),i.nome_rede) identificador,
                       i.atualizado_em atualizado
                FROM ti_ativos a
                JOIN ti_impressoras i ON i.id=a.origem_id
                LEFT JOIN ti_setores s ON s.id=i.setor_id
                LEFT JOIN ti_ambientes am ON am.id=i.ambiente_id
                WHERE a.tipo_ativo='IMPRESSORA' AND a.origem_tabela='ti_impressoras'
            " : null,
            'SMARTPHONE' => atiTabelaExiste($mysqli, 'telecom_smartphones') ? "
                SELECT a.*, 'SMARTPHONE' subtipo,
                       TRIM(CONCAT(COALESCE(s.marca,''),' ',COALESCE(s.modelo,''))) nome,
                       s.patrimonio, s.numero_serie serie, s.responsavel_nome responsavel,
                       s.setor, NULL secretaria, NULL predio, NULL ambiente, NULL local, s.status,
                       s.condicao_aparelho condicao, NULL garantia,
                       s.imei1 identificador, s.atualizado_em atualizado
                FROM ti_ativos a
                JOIN telecom_smartphones s ON s.id=a.origem_id
                WHERE a.tipo_ativo='SMARTPHONE' AND a.origem_tabela='telecom_smartphones'
            " : null,
            'CHIP' => atiTabelaExiste($mysqli, 'telecom_chips') ? "
                SELECT a.*, 'CHIP MOVEL' subtipo,
                       CONCAT('Linha ',COALESCE(NULLIF(c.numero_linha,''),c.codigo_interno)) nome,
                       NULL patrimonio, c.iccid serie, c.responsavel_nome responsavel,
                       c.setor, NULL secretaria, NULL predio, NULL ambiente, NULL local, c.status,
                       NULL condicao, NULL garantia, c.numero_linha identificador,
                       c.atualizado_em atualizado
                FROM ti_ativos a
                JOIN telecom_chips c ON c.id=a.origem_id
                WHERE a.tipo_ativo='CHIP' AND a.origem_tabela='telecom_chips'
            " : null,
            default => null
        };

        if ($sql === null) continue;
        $resultado = $mysqli->query($sql);
        if (!$resultado) continue;
        while ($linha = $resultado->fetch_assoc()) {
            $linha['nome'] = atiTexto($linha['nome'] ?? '', 300) ?: $tipo;
            $ativos[] = $linha;
        }
        $resultado->free();
    }

    usort($ativos, static fn(array $a, array $b): int => (int)$b['id'] <=> (int)$a['id']);
    return $ativos;
}

function atiStatusRotulo(?string $status): string
{
    $s = strtoupper(trim((string)$status));
    return match ($s) {
        'EM_USO' => 'Em uso', 'DISPONIVEL' => 'Disponível', 'RESERVA','ESTOQUE_RESERVA' => 'Reserva / estoque',
        'MANUTENCAO','EM_MANUTENCAO','AGUARDANDO_DIAGNOSTICO','AGUARDANDO_PECA','AGUARDANDO_TONER' => 'Em manutenção',
        'PRONTA_RETIRADA' => 'Pronta para retirada', 'EXTRAVIADO','NAO_LOCALIZADA' => 'Não localizado',
        'AGUARDANDO_BAIXA' => 'Aguardando baixa', 'BAIXADO','BAIXADA' => 'Baixado',
        'BLOQUEADO' => 'Bloqueado', 'SEM_IDENTIFICACAO','CADASTRO_INICIAL' => 'Cadastro incompleto',
        default => $status ? ucwords(strtolower(str_replace('_',' ',(string)$status))) : 'Não informado'
    };
}

function atiStatusClasse(?string $status): string
{
    $rotulo = atiNormalizar(atiStatusRotulo($status));
    return match (true) {
        str_contains($rotulo,'uso') => 'success',
        str_contains($rotulo,'disponivel') || str_contains($rotulo,'reserva') => 'info',
        str_contains($rotulo,'manutencao') || str_contains($rotulo,'retirada') => 'warning',
        str_contains($rotulo,'localizado') || str_contains($rotulo,'baixa') || str_contains($rotulo,'bloqueado') => 'danger',
        default => 'neutral'
    };
}

function atiData(?string $data, bool $hora = true): string
{
    if (!$data) return 'Não registrada';
    $ts = strtotime($data);
    if ($ts === false) return $data;
    return date($hora ? 'd/m/Y H:i' : 'd/m/Y', $ts);
}

function atiMoeda(mixed $valor): string
{
    return 'R$ ' . number_format((float)$valor, 2, ',', '.');
}

function atiOsDoAtivo(mysqli $mysqli, array $fonte, string $tipo): array
{
    if (!atiTabelaExiste($mysqli, 'ordens_servico')) return [];
    $condicoes=[];$tipos='';$valores=[];
    foreach (['patrimonio','numero_serie'] as $campo) {
        $valor = atiTexto($fonte[$campo] ?? '', 150);
        if (!atiValorValido($valor)) continue;
        $condicoes[] = "TRIM({$campo}) = TRIM(?)";
        $tipos .= 's'; $valores[] = $valor;
    }
    if ($tipo === 'SMARTPHONE' && atiValorValido($fonte['imei1'] ?? null)) {
        $condicoes[] = "TRIM(numero_serie)=TRIM(?)";
        $tipos .= 's'; $valores[] = atiTexto($fonte['imei1'], 150);
    }
    if ($condicoes === []) return [];
    $sql = "SELECT * FROM ordens_servico WHERE (".implode(' OR ',$condicoes).") ORDER BY data_entrada DESC,id DESC LIMIT 150";
    $stmt=$mysqli->prepare($sql);atiBind($stmt,$tipos,$valores);$stmt->execute();$r=$stmt->get_result();$linhas=[];
    while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}

function atiMovimentacoesFonte(mysqli $mysqli, array $ativo): array
{
    $tipo=(string)$ativo['tipo_ativo'];$origem=(int)$ativo['origem_id'];$linhas=[];
    if($tipo==='COMPUTADOR'&&atiTabelaExiste($mysqli,'ti_computador_movimentacoes')){
        $stmt=$mysqli->prepare("SELECT acao,status_anterior,status_novo,responsavel_anterior,responsavel_novo,setor_anterior,setor_novo,ambiente_anterior local_anterior,ambiente_novo local_novo,motivo detalhes,usuario,criado_em FROM ti_computador_movimentacoes WHERE computador_id=? ORDER BY criado_em DESC,id DESC");
    }elseif($tipo==='IMPRESSORA'&&atiTabelaExiste($mysqli,'ti_impressora_movimentacoes')){
        $stmt=$mysqli->prepare("SELECT acao,status_anterior,status_novo,NULL responsavel_anterior,NULL responsavel_novo,setor_anterior,setor_novo,local_anterior,local_novo,detalhes,usuario,criado_em FROM ti_impressora_movimentacoes WHERE impressora_id=? ORDER BY criado_em DESC,id DESC");
    }elseif(in_array($tipo,['SMARTPHONE','CHIP'],true)&&atiTabelaExiste($mysqli,'telecom_movimentacoes')){
        $tipoItem=$tipo==='SMARTPHONE'?'SMARTPHONE':'CHIP';
        $stmt=$mysqli->prepare("SELECT acao,status_anterior,status_novo,responsavel_anterior,responsavel_novo,setor_anterior,setor_novo,NULL local_anterior,NULL local_novo,detalhes,usuario,criado_em FROM telecom_movimentacoes WHERE tipo_item=? AND item_id=? ORDER BY criado_em DESC,id DESC");
        $stmt->bind_param('si',$tipoItem,$origem);$stmt->execute();$r=$stmt->get_result();while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
    }else return [];
    $stmt->bind_param('i',$origem);$stmt->execute();$r=$stmt->get_result();while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}

function atiTermosFonte(mysqli $mysqli, array $ativo, array $os): array
{
    $linhas=[];$tipo=(string)$ativo['tipo_ativo'];$origem=(int)$ativo['origem_id'];
    if($tipo==='COMPUTADOR'&&atiTabelaExiste($mysqli,'ti_computador_termos')){
        $stmt=$mysqli->prepare("SELECT id,numero_termo,tipo,status,arquivo_assinado,nome_original,tecnico_nome,responsavel_nome pessoa_nome,criado_em,'COMPUTADOR' origem FROM ti_computador_termos WHERE computador_id=? ORDER BY criado_em DESC,id DESC");
        $stmt->bind_param('i',$origem);$stmt->execute();$r=$stmt->get_result();while($l=$r->fetch_assoc()){$l['url']='../termo_responsabilidade_computador.php?termo_id='.(int)$l['id'];$linhas[]=$l;}$stmt->close();
    }
    if($tipo==='IMPRESSORA'&&atiTabelaExiste($mysqli,'ti_impressora_termos')){
        $stmt=$mysqli->prepare("SELECT id,numero_termo,tipo,status,NULL arquivo_assinado,NULL nome_original,tecnico_nome,pessoa_nome,criado_em,'IMPRESSORA' origem FROM ti_impressora_termos WHERE impressora_id=? ORDER BY criado_em DESC,id DESC");
        $stmt->bind_param('i',$origem);$stmt->execute();$r=$stmt->get_result();while($l=$r->fetch_assoc()){$l['url']=$l['tipo']==='ENTRADA'?'../termo_entrada_impressora.php?termo_id='.(int)$l['id']:'../termo_entrega_impressora.php?termo_id='.(int)$l['id'];$linhas[]=$l;}$stmt->close();
    }
    if($os&&atiTabelaExiste($mysqli,'os_termos_assinados')){
        $ids=array_values(array_filter(array_map(static fn($x)=>(int)($x['id']??0),$os)));
        if($ids){$place=implode(',',array_fill(0,count($ids),'?'));$stmt=$mysqli->prepare("SELECT t.id,CONCAT('TERMO-OS-',t.os_id) numero_termo,'OS_ASSINADA' tipo,IF(t.ativo=1,'ATIVO','SUBSTITUIDO') status,t.arquivo arquivo_assinado,t.nome_original,t.enviado_por tecnico_nome,o.nome_solicitante pessoa_nome,t.enviado_em criado_em,'ORDEM_SERVICO' origem,t.os_id FROM os_termos_assinados t JOIN ordens_servico o ON o.id=t.os_id WHERE t.os_id IN ({$place}) ORDER BY t.enviado_em DESC");$params=$ids;atiBind($stmt,str_repeat('i',count($ids)),$params);$stmt->execute();$r=$stmt->get_result();while($l=$r->fetch_assoc()){$l['url']='../visualizar_termo_assinado.php?os_id='.(int)$l['os_id'];$linhas[]=$l;}$stmt->close();}
    }
    usort($linhas,static fn($a,$b)=>strtotime((string)$b['criado_em'])<=>strtotime((string)$a['criado_em']));return $linhas;
}

function atiManutencoesFonte(mysqli $mysqli, array $ativo): array
{
    if($ativo['tipo_ativo']!=='IMPRESSORA'||!atiTabelaExiste($mysqli,'ti_impressora_manutencoes'))return [];
    $id=(int)$ativo['origem_id'];$stmt=$mysqli->prepare("SELECT * FROM ti_impressora_manutencoes WHERE impressora_id=? ORDER BY data_entrada DESC,id DESC");$stmt->bind_param('i',$id);$stmt->execute();$r=$stmt->get_result();$linhas=[];while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}

function atiConsumosFonte(mysqli $mysqli, array $ativo): array
{
    if($ativo['tipo_ativo']!=='IMPRESSORA'||!atiTabelaExiste($mysqli,'ti_impressora_consumos'))return [];
    $id=(int)$ativo['origem_id'];$stmt=$mysqli->prepare("SELECT * FROM ti_impressora_consumos WHERE impressora_id=? ORDER BY criado_em DESC,id DESC");$stmt->bind_param('i',$id);$stmt->execute();$r=$stmt->get_result();$linhas=[];while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}

function atiCentralDocumentos(mysqli $mysqli,int $ativoId): array
{
    $stmt=$mysqli->prepare("SELECT * FROM ti_ativo_documentos WHERE ativo_id=? ORDER BY enviado_em DESC,id DESC");$stmt->bind_param('i',$ativoId);$stmt->execute();$r=$stmt->get_result();$linhas=[];while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}

function atiConferencias(mysqli $mysqli,int $ativoId): array
{
    $stmt=$mysqli->prepare("SELECT * FROM ti_ativo_conferencias WHERE ativo_id=? ORDER BY conferido_em DESC,id DESC");$stmt->bind_param('i',$ativoId);$stmt->execute();$r=$stmt->get_result();$linhas=[];while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}

function atiCustos(mysqli $mysqli,int $ativoId): array
{
    $stmt=$mysqli->prepare("SELECT * FROM ti_ativo_custos WHERE ativo_id=? ORDER BY data_custo DESC,id DESC");$stmt->bind_param('i',$ativoId);$stmt->execute();$r=$stmt->get_result();$linhas=[];while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}

function atiRelacionamentos(mysqli $mysqli,int $ativoId): array
{
    $stmt=$mysqli->prepare("SELECT r.*,CASE WHEN r.ativo_origem_id=? THEN r.ativo_destino_id ELSE r.ativo_origem_id END outro_ativo_id,a.codigo_ativo,a.tipo_ativo,a.origem_id,a.origem_tabela FROM ti_ativo_relacionamentos r JOIN ti_ativos a ON a.id=CASE WHEN r.ativo_origem_id=? THEN r.ativo_destino_id ELSE r.ativo_origem_id END WHERE (r.ativo_origem_id=? OR r.ativo_destino_id=?) AND r.ativo=1 ORDER BY r.inicio_em DESC");$stmt->bind_param('iiii',$ativoId,$ativoId,$ativoId,$ativoId);$stmt->execute();$res=$stmt->get_result();$linhas=[];while($l=$res->fetch_assoc()){$fonte=atiCarregarFonte($mysqli,$l);$l['resumo_outro']=$fonte?atiResumoFonte((string)$l['tipo_ativo'],$fonte):[];$linhas[]=$l;}$stmt->close();return $linhas;
}

function atiEventos(mysqli $mysqli,int $ativoId): array
{
    $stmt=$mysqli->prepare("SELECT * FROM ti_ativo_eventos WHERE ativo_id=? ORDER BY criado_em DESC,id DESC LIMIT 100");$stmt->bind_param('i',$ativoId);$stmt->execute();$r=$stmt->get_result();$linhas=[];while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}

function atiDuplicidades(mysqli $mysqli,array $ativo): array
{
    $cond=[];$tipos='';$valores=[];
    foreach(['patrimonio_normalizado','serie_normalizada','identificador_secundario'] as $campo){$v=$ativo[$campo]??null;if(!atiValorValido($v))continue;$cond[]="{$campo}=?";$tipos.='s';$valores[]=$v;}
    if(!$cond)return [];$sql="SELECT id,codigo_ativo,tipo_ativo,patrimonio_normalizado,serie_normalizada FROM ti_ativos WHERE id<>? AND (".implode(' OR ',$cond).") ORDER BY id";$tipos='i'.$tipos;array_unshift($valores,(int)$ativo['id']);$stmt=$mysqli->prepare($sql);atiBind($stmt,$tipos,$valores);$stmt->execute();$r=$stmt->get_result();$linhas=[];while($l=$r->fetch_assoc())$linhas[]=$l;$stmt->close();return $linhas;
}
