<?php
declare(strict_types=1);

require_once __DIR__ . '/permissoes_ti.php';

function telecomNormalizar(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 telecomUsuarioAtual(): string
{
    return trim((string) ($_SESSION['usuario'] ?? ''));
}

function telecomAcessoPermitido(): bool
{
    global $mysqli;

    if (isset($mysqli) && $mysqli instanceof mysqli && tiPermEstruturaDisponivel($mysqli)) {
        $arquivo = strtolower(basename((string) ($_SERVER['SCRIPT_FILENAME'] ?? '')));
        $modulo = str_contains($arquivo, 'smartphone') ? 'smartphones' : 'chips';
        return tiPermPode($mysqli, $modulo, 'visualizar');
    }

    return in_array(
        telecomNormalizar(telecomUsuarioAtual()),
        ['renan', 'cynthia'],
        true
    );
}

function telecomEhRenan(): bool
{
    return telecomNormalizar(telecomUsuarioAtual()) === 'renan';
}

function telecomEhCynthia(): bool
{
    return telecomNormalizar(telecomUsuarioAtual()) === 'cynthia';
}

function telecomExigirAcesso(): void
{
    if (telecomAcessoPermitido()) {
        return;
    }

    http_response_code(403);

    $usuario = htmlspecialchars(
        telecomUsuarioAtual() ?: 'Usuário autenticado',
        ENT_QUOTES,
        'UTF-8'
    );

    echo '<!doctype html><html lang="pt-BR"><head>';
    echo '<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">';
    echo '<title>Acesso restrito</title><style>';
    echo 'body{margin:0;min-height:100vh;display:grid;place-items:center;padding:20px;';
    echo 'font-family:Inter,Arial,sans-serif;color:#172438;background:#edf3f8}';
    echo '.box{width:min(580px,100%);padding:34px;border-radius:26px;background:#fff;';
    echo 'box-shadow:0 30px 90px rgba(8,57,111,.18);text-align:center}';
    echo '.icon{width:70px;height:70px;display:grid;place-items:center;margin:0 auto 18px;';
    echo 'border-radius:22px;color:#fff;background:#bf263d;font-size:32px}';
    echo 'h1{margin:0;color:#08396f}p{color:#62738a;line-height:1.6}';
    echo 'a{display:inline-flex;margin-top:12px;padding:12px 16px;border-radius:13px;';
    echo 'color:#fff;background:#08396f;text-decoration:none;font-weight:800}';
    echo '</style></head><body><main class="box">';
    echo '<div class="icon">!</div><h1>Acesso restrito</h1>';
    echo '<p>' . $usuario . ', as telas de Chips e Smartphones são exclusivas para Cynthia e Renan.</p>';
    echo '<a href="listar_os.php">Voltar ao sistema</a>';
    echo '</main></body></html>';
    exit;
}

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

function telecomCsrf(): string
{
    if (empty($_SESSION['csrf_telecom'])) {
        $_SESSION['csrf_telecom'] = bin2hex(random_bytes(24));
    }

    return (string) $_SESSION['csrf_telecom'];
}

function telecomValidarCsrf(): void
{
    $recebido = (string) ($_POST['csrf_token'] ?? '');
    $esperado = (string) ($_SESSION['csrf_telecom'] ?? '');

    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 telecomTexto(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 telecomNulo(mixed $valor, int $limite = 255): ?string
{
    $texto = telecomTexto($valor, $limite);

    return $texto === '' ? null : $texto;
}

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

function telecomConsumirFlash(): ?array
{
    $flash = $_SESSION['telecom_flash'] ?? null;
    unset($_SESSION['telecom_flash']);

    return is_array($flash) ? $flash : null;
}

function telecomRedirecionar(string $arquivo): never
{
    header('Location: ' . $arquivo);
    exit;
}

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

function telecomGarantirEstrutura(mysqli $mysqli): void
{
    $sqls = [
        "
        CREATE TABLE IF NOT EXISTS telecom_chips (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            codigo_interno VARCHAR(40) NOT NULL,
            numero_linha VARCHAR(30) NULL,
            iccid VARCHAR(40) NULL,
            operadora VARCHAR(50) NOT NULL DEFAULT 'Não informada',
            plano VARCHAR(120) NULL,
            pacote_dados VARCHAR(80) NULL,
            status VARCHAR(30) NOT NULL DEFAULT 'SEM_IDENTIFICACAO',
            responsavel_nome VARCHAR(150) NULL,
            responsavel_matricula VARCHAR(50) NULL,
            responsavel_cargo VARCHAR(120) NULL,
            setor VARCHAR(150) NULL,
            smartphone_id INT UNSIGNED NULL,
            data_entrega DATETIME NULL,
            data_devolucao DATETIME NULL,
            observacoes TEXT 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_telecom_chip_codigo (codigo_interno),
            UNIQUE KEY uk_telecom_chip_numero (numero_linha),
            UNIQUE KEY uk_telecom_chip_iccid (iccid),
            INDEX idx_telecom_chip_status (status),
            INDEX idx_telecom_chip_responsavel (responsavel_nome),
            INDEX idx_telecom_chip_setor (setor),
            INDEX idx_telecom_chip_smartphone (smartphone_id)
        ) ENGINE=InnoDB
          DEFAULT CHARSET=utf8mb4
          COLLATE=utf8mb4_unicode_ci
        ",
        "
        CREATE TABLE IF NOT EXISTS telecom_smartphones (
            id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            codigo_interno VARCHAR(40) NOT NULL,
            patrimonio VARCHAR(50) NULL,
            imei1 VARCHAR(30) NULL,
            imei2 VARCHAR(30) NULL,
            numero_serie VARCHAR(80) NULL,
            marca VARCHAR(80) NOT NULL DEFAULT 'Não identificada',
            modelo VARCHAR(120) NOT NULL DEFAULT 'Não identificado',
            cor VARCHAR(50) NULL,
            armazenamento VARCHAR(50) NULL,
            sistema_operacional VARCHAR(80) NULL,
            condicao_aparelho VARCHAR(30) NOT NULL DEFAULT 'NAO_AVALIADO',
            status VARCHAR(30) NOT NULL DEFAULT 'SEM_IDENTIFICACAO',
            responsavel_nome VARCHAR(150) NULL,
            responsavel_matricula VARCHAR(50) NULL,
            responsavel_cargo VARCHAR(120) NULL,
            setor VARCHAR(150) NULL,
            chip_id INT UNSIGNED NULL,
            possui_carregador TINYINT(1) NOT NULL DEFAULT 0,
            acessorios TEXT NULL,
            data_entrega DATETIME NULL,
            data_devolucao DATETIME NULL,
            observacoes TEXT 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_telecom_smart_codigo (codigo_interno),
            UNIQUE KEY uk_telecom_smart_patrimonio (patrimonio),
            UNIQUE KEY uk_telecom_smart_imei1 (imei1),
            UNIQUE KEY uk_telecom_smart_imei2 (imei2),
            UNIQUE KEY uk_telecom_smart_serie (numero_serie),
            INDEX idx_telecom_smart_status (status),
            INDEX idx_telecom_smart_responsavel (responsavel_nome),
            INDEX idx_telecom_smart_setor (setor),
            INDEX idx_telecom_smart_chip (chip_id)
        ) ENGINE=InnoDB
          DEFAULT CHARSET=utf8mb4
          COLLATE=utf8mb4_unicode_ci
        ",
        "
        CREATE TABLE IF NOT EXISTS telecom_movimentacoes (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            tipo_item VARCHAR(20) NOT NULL,
            item_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,
            detalhes TEXT NULL,
            usuario VARCHAR(150) NOT NULL,
            criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_telecom_mov_item (tipo_item, item_id, criado_em),
            INDEX idx_telecom_mov_usuario (usuario),
            INDEX idx_telecom_mov_data (criado_em)
        ) 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 telecom: ' .
                $mysqli->error
            );
        }
    }
}

function telecomRegistrarHistorico(
    mysqli $mysqli,
    string $tipoItem,
    int $itemId,
    string $acao,
    ?string $statusAnterior,
    ?string $statusNovo,
    ?string $responsavelAnterior,
    ?string $responsavelNovo,
    ?string $setorAnterior,
    ?string $setorNovo,
    ?string $detalhes = null
): void {
    $usuario = telecomUsuarioAtual() ?: 'Usuário autenticado';

    $stmt = $mysqli->prepare("
        INSERT INTO telecom_movimentacoes (
            tipo_item,
            item_id,
            acao,
            status_anterior,
            status_novo,
            responsavel_anterior,
            responsavel_novo,
            setor_anterior,
            setor_novo,
            detalhes,
            usuario
        )
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ");

    if (!$stmt) {
        throw new RuntimeException(
            'Não foi possível preparar o histórico.'
        );
    }

    $stmt->bind_param(
        'sisssssssss',
        $tipoItem,
        $itemId,
        $acao,
        $statusAnterior,
        $statusNovo,
        $responsavelAnterior,
        $responsavelNovo,
        $setorAnterior,
        $setorNovo,
        $detalhes,
        $usuario
    );

    if (!$stmt->execute()) {
        $erro = $stmt->error;
        $stmt->close();

        throw new RuntimeException(
            'Não foi possível registrar o histórico: ' . $erro
        );
    }

    $stmt->close();
}

function telecomData(?string $data): string
{
    if (!$data) {
        return 'Não registrada';
    }

    $timestamp = strtotime($data);

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

function telecomStatusChip(string $status): array
{
    return match (strtoupper(trim($status))) {
        'DISPONIVEL' => ['Disponível', 'success', 'bi-check-circle-fill'],
        'EM_USO' => ['Em uso', 'info', 'bi-person-check-fill'],
        'BLOQUEADO' => ['Bloqueado', 'warning', 'bi-slash-circle-fill'],
        'EXTRAVIADO' => ['Extraviado', 'danger', 'bi-exclamation-octagon-fill'],
        'CANCELADO' => ['Cancelado', 'neutral', 'bi-x-circle-fill'],
        default => ['Sem identificação', 'unknown', 'bi-question-circle-fill']
    };
}

function telecomStatusSmartphone(string $status): array
{
    return match (strtoupper(trim($status))) {
        'DISPONIVEL' => ['Disponível', 'success', 'bi-check-circle-fill'],
        'EM_USO' => ['Em uso', 'info', 'bi-person-check-fill'],
        'MANUTENCAO' => ['Em manutenção', 'purple', 'bi-tools'],
        'EXTRAVIADO' => ['Extraviado', 'danger', 'bi-exclamation-octagon-fill'],
        'BAIXADO' => ['Baixado', 'neutral', 'bi-archive-fill'],
        default => ['Sem identificação', 'unknown', 'bi-question-circle-fill']
    };
}
