<?php
declare(strict_types=1);

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

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

    $valor = strtr($valor, [
        'á'=>'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]+/', '', $valor) ?? '';
}

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

function compEhCynthia(): bool
{
    return compNormalizar(compUsuarioAtual()) === 'cynthia';
}

function compEhRenan(): bool
{
    return compNormalizar(compUsuarioAtual()) === 'renan';
}

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

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

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

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

function compCodigo(string $prefixo = 'EQP'): string
{
    return $prefixo . '-' . date('YmdHis') . '-' . strtoupper(bin2hex(random_bytes(2)));
}

function compFlash(string $tipo, string $mensagem, ?string $url = null): void
{
    $_SESSION['computadores_flash'] = [
        'tipo' => $tipo,
        'mensagem' => $mensagem,
        'url' => $url
    ];
}

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

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

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

function compGarantirEstrutura(mysqli $mysqli): void
{
    $sqls = [
        "CREATE TABLE IF NOT EXISTS ti_setores (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            nome VARCHAR(150) NOT NULL,
            secretaria VARCHAR(150) NULL,
            predio VARCHAR(150) NULL,
            andar VARCHAR(80) NULL,
            codigo VARCHAR(50) NULL,
            ativo TINYINT(1) NOT NULL DEFAULT 1,
            criado_por VARCHAR(150) NOT NULL,
            criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            atualizado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uk_ti_setor_nome_predio (nome, predio),
            INDEX idx_ti_setor_ativo (ativo)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",

        "CREATE TABLE IF NOT EXISTS ti_ambientes (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            setor_id INT UNSIGNED NOT NULL,
            nome VARCHAR(150) NOT NULL,
            codigo VARCHAR(50) NULL,
            tipo VARCHAR(50) NOT NULL DEFAULT 'SALA',
            grid_coluna TINYINT UNSIGNED NOT NULL DEFAULT 1,
            grid_linha TINYINT UNSIGNED NOT NULL DEFAULT 1,
            grid_largura TINYINT UNSIGNED NOT NULL DEFAULT 3,
            grid_altura TINYINT UNSIGNED NOT NULL DEFAULT 1,
            ordem INT NOT NULL DEFAULT 0,
            cor VARCHAR(20) NULL,
            observacoes VARCHAR(500) NULL,
            ativo TINYINT(1) NOT NULL DEFAULT 1,
            criado_por VARCHAR(150) NOT NULL,
            criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            atualizado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uk_ti_ambiente_setor_nome (setor_id, nome),
            INDEX idx_ti_ambiente_setor (setor_id, ativo),
            CONSTRAINT fk_ti_ambiente_setor FOREIGN KEY (setor_id)
                REFERENCES ti_setores(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",

        "CREATE TABLE IF NOT EXISTS ti_computadores (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            codigo_interno VARCHAR(40) NOT NULL,
            tipo VARCHAR(30) NOT NULL DEFAULT 'DESKTOP',
            patrimonio VARCHAR(50) NULL,
            numero_serie VARCHAR(100) NULL,
            nome_maquina VARCHAR(100) NULL,
            fabricante VARCHAR(100) NOT NULL DEFAULT 'Não identificado',
            modelo VARCHAR(150) NOT NULL DEFAULT 'Não identificado',
            processador VARCHAR(180) NULL,
            memoria_ram_gb DECIMAL(8,2) NULL,
            armazenamento_tipo VARCHAR(30) NULL,
            armazenamento_gb INT UNSIGNED NULL,
            sistema_operacional VARCHAR(120) NULL,
            arquitetura VARCHAR(20) NULL,
            mac_rede VARCHAR(30) NULL,
            mac_wifi VARCHAR(30) NULL,
            ip_fixo VARCHAR(45) NULL,
            dominio VARCHAR(120) NULL,
            data_aquisicao DATE NULL,
            garantia_ate DATE NULL,
            condicao VARCHAR(30) NOT NULL DEFAULT 'NAO_AVALIADO',
            status VARCHAR(30) NOT NULL DEFAULT 'CADASTRO_INICIAL',
            responsavel_nome VARCHAR(150) NULL,
            responsavel_matricula VARCHAR(50) NULL,
            responsavel_cargo VARCHAR(120) NULL,
            setor_id INT UNSIGNED NULL,
            ambiente_id INT UNSIGNED NULL,
            localizacao_texto VARCHAR(180) NULL,
            acessorios TEXT NULL,
            observacoes TEXT NULL,
            data_entrega DATETIME NULL,
            data_devolucao DATETIME NULL,
            tecnico_ultima_entrega VARCHAR(150) NULL,
            criado_por VARCHAR(150) NOT NULL,
            criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            atualizado_por VARCHAR(150) NOT NULL,
            atualizado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uk_ti_computador_codigo (codigo_interno),
            UNIQUE KEY uk_ti_computador_patrimonio (patrimonio),
            UNIQUE KEY uk_ti_computador_serie (numero_serie),
            UNIQUE KEY uk_ti_computador_nome_maquina (nome_maquina),
            INDEX idx_ti_computador_status (status),
            INDEX idx_ti_computador_tipo (tipo),
            INDEX idx_ti_computador_responsavel (responsavel_nome),
            INDEX idx_ti_computador_setor (setor_id),
            INDEX idx_ti_computador_ambiente (ambiente_id),
            INDEX idx_ti_computador_fabricante_modelo (fabricante, modelo),
            CONSTRAINT fk_ti_computador_setor FOREIGN KEY (setor_id)
                REFERENCES ti_setores(id) ON DELETE SET NULL,
            CONSTRAINT fk_ti_computador_ambiente FOREIGN KEY (ambiente_id)
                REFERENCES ti_ambientes(id) ON DELETE SET NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",

        "CREATE TABLE IF NOT EXISTS ti_computador_movimentacoes (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            computador_id INT UNSIGNED NOT NULL,
            acao VARCHAR(50) NOT NULL,
            status_anterior VARCHAR(30) NULL,
            status_novo VARCHAR(30) NULL,
            responsavel_anterior VARCHAR(150) NULL,
            responsavel_novo VARCHAR(150) NULL,
            setor_anterior VARCHAR(150) NULL,
            setor_novo VARCHAR(150) NULL,
            ambiente_anterior VARCHAR(150) NULL,
            ambiente_novo VARCHAR(150) NULL,
            motivo VARCHAR(500) NULL,
            usuario VARCHAR(150) NOT NULL,
            criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_ti_mov_computador (computador_id, criado_em),
            INDEX idx_ti_mov_usuario (usuario),
            CONSTRAINT fk_ti_mov_computador FOREIGN KEY (computador_id)
                REFERENCES ti_computadores(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",

        "CREATE TABLE IF NOT EXISTS ti_computador_termos (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            computador_id INT UNSIGNED NOT NULL,
            movimentacao_id BIGINT UNSIGNED NULL,
            numero_termo VARCHAR(50) NOT NULL,
            tipo VARCHAR(30) NOT NULL DEFAULT 'RESPONSABILIDADE',
            responsavel_nome VARCHAR(150) NOT NULL,
            responsavel_matricula VARCHAR(50) NULL,
            responsavel_cargo VARCHAR(120) NULL,
            setor_nome VARCHAR(150) NOT NULL,
            ambiente_nome VARCHAR(150) NULL,
            localizacao_texto VARCHAR(180) NULL,
            tecnico_nome VARCHAR(150) NOT NULL,
            equipamento_json LONGTEXT NOT NULL,
            acessorios TEXT NULL,
            condicao_entrega VARCHAR(30) NULL,
            declaracao TEXT NULL,
            token CHAR(64) NOT NULL,
            status VARCHAR(30) NOT NULL DEFAULT 'GERADO',
            arquivo_assinado VARCHAR(500) NULL,
            nome_original VARCHAR(255) NULL,
            mime_type VARCHAR(100) NULL,
            tamanho_bytes BIGINT UNSIGNED NULL,
            hash_sha256 CHAR(64) NULL,
            enviado_por VARCHAR(150) NULL,
            enviado_em DATETIME NULL,
            criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            UNIQUE KEY uk_ti_termo_numero (numero_termo),
            UNIQUE KEY uk_ti_termo_token (token),
            INDEX idx_ti_termo_computador (computador_id, criado_em),
            INDEX idx_ti_termo_status (status),
            CONSTRAINT fk_ti_termo_computador FOREIGN KEY (computador_id)
                REFERENCES ti_computadores(id) ON DELETE CASCADE,
            CONSTRAINT fk_ti_termo_movimentacao FOREIGN KEY (movimentacao_id)
                REFERENCES ti_computador_movimentacoes(id) ON DELETE SET NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
    ];

    foreach ($sqls as $sql) {
        if (!$mysqli->query($sql)) {
            throw new RuntimeException('Não foi possível preparar o módulo de computadores: ' . $mysqli->error);
        }
    }
}

function compObterOuCriarSetor(
    mysqli $mysqli,
    string $nome,
    ?string $secretaria,
    ?string $predio,
    ?string $andar
): int {
    $nome = compTexto($nome, 150);
    if ($nome === '') {
        throw new RuntimeException('Informe o setor do equipamento.');
    }

    $stmt = $mysqli->prepare("SELECT id FROM ti_setores WHERE nome = ? AND (predio <=> ?) LIMIT 1");
    $stmt->bind_param('ss', $nome, $predio);
    $stmt->execute();
    $linha = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if ($linha) {
        $id = (int) $linha['id'];
        $stmt = $mysqli->prepare("UPDATE ti_setores SET secretaria = COALESCE(?, secretaria), andar = COALESCE(?, andar), ativo = 1 WHERE id = ?");
        $stmt->bind_param('ssi', $secretaria, $andar, $id);
        $stmt->execute();
        $stmt->close();
        return $id;
    }

    $usuario = compUsuarioAtual() ?: 'Usuário autenticado';
    $stmt = $mysqli->prepare("INSERT INTO ti_setores (nome, secretaria, predio, andar, criado_por) VALUES (?, ?, ?, ?, ?)");
    $stmt->bind_param('sssss', $nome, $secretaria, $predio, $andar, $usuario);
    if (!$stmt->execute()) {
        $erro = $stmt->error;
        $stmt->close();
        throw new RuntimeException('Não foi possível cadastrar o setor: ' . $erro);
    }
    $id = (int) $stmt->insert_id;
    $stmt->close();
    return $id;
}

function compObterOuCriarAmbiente(mysqli $mysqli, int $setorId, ?string $nome): ?int
{
    $nome = compNulo($nome, 150);
    if ($nome === null) {
        return null;
    }

    $stmt = $mysqli->prepare("SELECT id FROM ti_ambientes WHERE setor_id = ? AND nome = ? LIMIT 1");
    $stmt->bind_param('is', $setorId, $nome);
    $stmt->execute();
    $linha = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    if ($linha) {
        return (int) $linha['id'];
    }

    $usuario = compUsuarioAtual() ?: 'Usuário autenticado';
    $stmt = $mysqli->prepare("SELECT COALESCE(MAX(ordem), 0) + 1 AS proxima FROM ti_ambientes WHERE setor_id = ?");
    $stmt->bind_param('i', $setorId);
    $stmt->execute();
    $ordem = (int) (($stmt->get_result()->fetch_assoc()['proxima'] ?? 1));
    $stmt->close();

    $coluna = (($ordem - 1) % 4) * 3 + 1;
    $linhaGrid = intdiv($ordem - 1, 4) + 1;
    $stmt = $mysqli->prepare("INSERT INTO ti_ambientes (setor_id, nome, grid_coluna, grid_linha, ordem, criado_por) VALUES (?, ?, ?, ?, ?, ?)");
    $stmt->bind_param('isiiis', $setorId, $nome, $coluna, $linhaGrid, $ordem, $usuario);
    if (!$stmt->execute()) {
        $erro = $stmt->error;
        $stmt->close();
        throw new RuntimeException('Não foi possível cadastrar o ambiente: ' . $erro);
    }
    $id = (int) $stmt->insert_id;
    $stmt->close();
    return $id;
}

function compNomeSetor(mysqli $mysqli, ?int $setorId): ?string
{
    if (!$setorId) return null;
    $stmt = $mysqli->prepare("SELECT nome FROM ti_setores WHERE id = ?");
    $stmt->bind_param('i', $setorId);
    $stmt->execute();
    $nome = $stmt->get_result()->fetch_assoc()['nome'] ?? null;
    $stmt->close();
    return $nome !== null ? (string) $nome : null;
}

function compNomeAmbiente(mysqli $mysqli, ?int $ambienteId): ?string
{
    if (!$ambienteId) return null;
    $stmt = $mysqli->prepare("SELECT nome FROM ti_ambientes WHERE id = ?");
    $stmt->bind_param('i', $ambienteId);
    $stmt->execute();
    $nome = $stmt->get_result()->fetch_assoc()['nome'] ?? null;
    $stmt->close();
    return $nome !== null ? (string) $nome : null;
}

function compRegistrarMovimentacao(
    mysqli $mysqli,
    int $computadorId,
    string $acao,
    ?string $statusAnterior,
    ?string $statusNovo,
    ?string $responsavelAnterior,
    ?string $responsavelNovo,
    ?string $setorAnterior,
    ?string $setorNovo,
    ?string $ambienteAnterior,
    ?string $ambienteNovo,
    ?string $motivo
): int {
    $usuario = compUsuarioAtual() ?: 'Usuário autenticado';
    $stmt = $mysqli->prepare("INSERT INTO ti_computador_movimentacoes (
        computador_id, acao, status_anterior, status_novo,
        responsavel_anterior, responsavel_novo, setor_anterior, setor_novo,
        ambiente_anterior, ambiente_novo, motivo, usuario
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param(
        'isssssssssss',
        $computadorId, $acao, $statusAnterior, $statusNovo,
        $responsavelAnterior, $responsavelNovo, $setorAnterior, $setorNovo,
        $ambienteAnterior, $ambienteNovo, $motivo, $usuario
    );
    if (!$stmt->execute()) {
        $erro = $stmt->error;
        $stmt->close();
        throw new RuntimeException('Não foi possível registrar a movimentação: ' . $erro);
    }
    $id = (int) $stmt->insert_id;
    $stmt->close();
    return $id;
}

function compCriarTermo(mysqli $mysqli, array $computador, ?int $movimentacaoId, string $tipo = 'RESPONSABILIDADE'): int
{
    $responsavel = compTexto($computador['responsavel_nome'] ?? '', 150);
    $setor = compTexto($computador['setor_nome'] ?? '', 150);
    if ($responsavel === '' || $setor === '') {
        throw new RuntimeException('O termo exige responsável e setor definidos.');
    }

    $numero = 'TRC-' . date('Ymd') . '-' . str_pad((string) random_int(1, 999999), 6, '0', STR_PAD_LEFT);
    $token = hash('sha256', $numero . '|' . random_bytes(24));
    $tecnico = compUsuarioAtual() ?: 'Técnico autenticado';
    $equipamentoJson = json_encode([
        'codigo_interno' => $computador['codigo_interno'] ?? '',
        'tipo' => $computador['tipo'] ?? '',
        'patrimonio' => $computador['patrimonio'] ?? '',
        'numero_serie' => $computador['numero_serie'] ?? '',
        'nome_maquina' => $computador['nome_maquina'] ?? '',
        'fabricante' => $computador['fabricante'] ?? '',
        'modelo' => $computador['modelo'] ?? '',
        'processador' => $computador['processador'] ?? '',
        'memoria_ram_gb' => $computador['memoria_ram_gb'] ?? '',
        'armazenamento_tipo' => $computador['armazenamento_tipo'] ?? '',
        'armazenamento_gb' => $computador['armazenamento_gb'] ?? '',
        'sistema_operacional' => $computador['sistema_operacional'] ?? '',
        'condicao' => $computador['condicao'] ?? ''
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

    if ($equipamentoJson === false) {
        throw new RuntimeException('Não foi possível preparar os dados do termo.');
    }

    $declaracao = 'Declaro que recebi o equipamento e os acessórios descritos neste termo, em condições compatíveis com o registro, comprometendo-me a utilizá-los exclusivamente no exercício das atividades institucionais, zelar pela conservação, não transferir a terceiros sem registro da TI e comunicar imediatamente qualquer dano, perda, furto, alteração de setor ou devolução.';

    $responsavelMatricula = compNulo($computador['responsavel_matricula'] ?? '', 50);
    $responsavelCargo = compNulo($computador['responsavel_cargo'] ?? '', 120);
    $ambiente = compNulo($computador['ambiente_nome'] ?? '', 150);
    $local = compNulo($computador['localizacao_texto'] ?? '', 180);
    $acessorios = compNulo($computador['acessorios'] ?? '', 3000);
    $condicao = compNulo($computador['condicao'] ?? '', 30);
    $computadorId = (int) $computador['id'];

    $stmt = $mysqli->prepare("INSERT INTO ti_computador_termos (
        computador_id, movimentacao_id, numero_termo, tipo,
        responsavel_nome, responsavel_matricula, responsavel_cargo,
        setor_nome, ambiente_nome, localizacao_texto, tecnico_nome,
        equipamento_json, acessorios, condicao_entrega, declaracao, token
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param(
        'iissssssssssssss',
        $computadorId, $movimentacaoId, $numero, $tipo,
        $responsavel, $responsavelMatricula, $responsavelCargo,
        $setor, $ambiente, $local, $tecnico,
        $equipamentoJson, $acessorios, $condicao, $declaracao, $token
    );
    if (!$stmt->execute()) {
        $erro = $stmt->error;
        $stmt->close();
        throw new RuntimeException('Não foi possível gerar o termo: ' . $erro);
    }
    $id = (int) $stmt->insert_id;
    $stmt->close();
    return $id;
}

function compCarregarComputador(mysqli $mysqli, int $id, bool $forUpdate = false): ?array
{
    $sql = "SELECT c.*, s.nome AS setor_nome, s.secretaria, s.predio, s.andar, a.nome AS 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 = ?" . ($forUpdate ? ' FOR UPDATE' : '');
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $linha = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    return $linha ?: null;
}

function compData(?string $data, bool $somenteData = false): string
{
    if (!$data) return 'Não informada';
    $timestamp = strtotime($data);
    if ($timestamp === false) return $data;
    return date($somenteData ? 'd/m/Y' : 'd/m/Y H:i', $timestamp);
}

function compStatus(string $status): array
{
    return match (strtoupper(trim($status))) {
        'EM_USO' => ['Em uso', 'info', 'bi-person-check-fill'],
        'DISPONIVEL' => ['Disponível', 'success', 'bi-check-circle-fill'],
        'MANUTENCAO' => ['Em manutenção', 'purple', 'bi-tools'],
        'RESERVA' => ['Reserva técnica', 'warning', 'bi-shield-fill-check'],
        'EXTRAVIADO' => ['Extraviado', 'danger', 'bi-exclamation-octagon-fill'],
        'AGUARDANDO_BAIXA' => ['Aguardando baixa', 'dark', 'bi-hourglass-split'],
        'BAIXADO' => ['Baixado', 'muted', 'bi-archive-fill'],
        default => ['Cadastro inicial', 'warning', 'bi-clipboard2-plus-fill']
    };
}

function compTipo(string $tipo): array
{
    return match (strtoupper(trim($tipo))) {
        'NOTEBOOK' => ['Notebook', 'bi-laptop-fill'],
        'ALL_IN_ONE' => ['All in One', 'bi-display-fill'],
        'MINI_PC' => ['Mini PC', 'bi-pc-display-horizontal'],
        'WORKSTATION' => ['Workstation', 'bi-cpu-fill'],
        'THIN_CLIENT' => ['Thin Client', 'bi-terminal-fill'],
        default => ['Desktop', 'bi-pc-display']
    };
}
