<?php
declare(strict_types=1);

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

date_default_timezone_set('America/Sao_Paulo');

if (!$mysqli instanceof mysqli) {
    http_response_code(500);
    exit('Conexão com o banco indisponível.');
}

$mysqli->set_charset('utf8mb4');

if (!telecomEhRenan()) {
    http_response_code(403);
    exit('Somente Renan pode executar este instalador.');
}

$csrf = telecomCsrf();
$resultados = [];
$erro = '';
$senhaTemporaria = 'Cynthia@TI2026!';

function instalarUsuarioCynthia(
    mysqli $mysqli,
    string $senhaTemporaria
): string {
    $resultado = $mysqli->query("SHOW TABLES LIKE 'usuarios'");

    if (!$resultado || $resultado->num_rows < 1) {
        throw new RuntimeException(
            'A tabela usuarios não foi encontrada.'
        );
    }

    $colunasResultado = $mysqli->query(
        "SHOW FULL COLUMNS FROM usuarios"
    );

    if (!$colunasResultado) {
        throw new RuntimeException(
            'Não foi possível analisar a tabela usuarios.'
        );
    }

    $colunas = [];

    while ($coluna = $colunasResultado->fetch_assoc()) {
        $colunas[(string) $coluna['Field']] = $coluna;
    }

    $loginColuna = null;

    foreach (['usuario', 'username', 'login', 'nome_usuario'] as $candidato) {
        if (isset($colunas[$candidato])) {
            $loginColuna = $candidato;
            break;
        }
    }

    $senhaColuna = null;

    foreach (['senha', 'password', 'senha_hash', 'password_hash'] as $candidato) {
        if (isset($colunas[$candidato])) {
            $senhaColuna = $candidato;
            break;
        }
    }

    if (!$loginColuna || !$senhaColuna) {
        throw new RuntimeException(
            'A tabela usuarios precisa possuir uma coluna de usuário e uma de senha.'
        );
    }

    $stmt = $mysqli->prepare(
        "SELECT * FROM usuarios
         WHERE LOWER(TRIM(`{$loginColuna}`)) = LOWER(TRIM(?))
         LIMIT 1"
    );

    if (!$stmt) {
        throw new RuntimeException(
            'Não foi possível verificar a usuária Cynthia.'
        );
    }

    $usuario = 'Cynthia';

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

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

    if ($existente) {
        return 'A usuária Cynthia já existe. A senha atual foi preservada.';
    }

    $amostraSenha = '';

    $resultadoSenha = $mysqli->query(
        "SELECT `{$senhaColuna}` AS senha
         FROM usuarios
         WHERE `{$senhaColuna}` IS NOT NULL
           AND `{$senhaColuna}` <> ''
         LIMIT 1"
    );

    if ($resultadoSenha) {
        $linhaSenha = $resultadoSenha->fetch_assoc();
        $amostraSenha = trim((string) ($linhaSenha['senha'] ?? ''));
    }

    if (
        str_starts_with($amostraSenha, '$2y$') ||
        str_starts_with($amostraSenha, '$2a$') ||
        str_starts_with($amostraSenha, '$argon')
    ) {
        $senhaGravada = password_hash(
            $senhaTemporaria,
            PASSWORD_DEFAULT
        );
        $formatoSenha = 'hash seguro';
    } elseif (
        $amostraSenha !== '' &&
        preg_match('/^[a-f0-9]{32}$/i', $amostraSenha)
    ) {
        $senhaGravada = md5($senhaTemporaria);
        $formatoSenha = 'MD5, igual aos usuários existentes';
    } elseif (
        $amostraSenha !== '' &&
        preg_match('/^[a-f0-9]{40}$/i', $amostraSenha)
    ) {
        $senhaGravada = sha1($senhaTemporaria);
        $formatoSenha = 'SHA-1, igual aos usuários existentes';
    } else {
        $senhaGravada = password_hash(
            $senhaTemporaria,
            PASSWORD_DEFAULT
        );
        $formatoSenha = 'hash seguro';
    }

    $dados = [
        $loginColuna => $usuario,
        $senhaColuna => $senhaGravada
    ];

    $agora = date('Y-m-d H:i:s');

    foreach ($colunas as $nome => $config) {
        if (array_key_exists($nome, $dados)) {
            continue;
        }

        $extra = strtolower((string) ($config['Extra'] ?? ''));
        $nulo = strtoupper((string) ($config['Null'] ?? 'YES')) === 'YES';
        $padraoExiste = array_key_exists('Default', $config);
        $padrao = $config['Default'] ?? null;

        if (
            str_contains($extra, 'auto_increment') ||
            $nulo ||
            ($padraoExiste && $padrao !== null) ||
            str_contains($extra, 'default_generated')
        ) {
            continue;
        }

        $normalizado = telecomNormalizar($nome);
        $tipo = strtolower((string) ($config['Type'] ?? ''));

        if (in_array($normalizado, ['nome', 'nomecompleto'], true)) {
            $dados[$nome] = 'Cynthia';
            continue;
        }

        if ($normalizado === 'email') {
            $dados[$nome] = 'cynthia@manutencao.local';
            continue;
        }

        if (in_array($normalizado, ['ativo', 'active', 'habilitado'], true)) {
            $dados[$nome] = 1;
            continue;
        }

        if ($normalizado === 'status') {
            $dados[$nome] = 'ATIVO';
            continue;
        }

        if (in_array($normalizado, ['perfil', 'role', 'nivel', 'tipo'], true)) {
            $dados[$nome] = 'USUARIO';
            continue;
        }

        if (
            str_contains($tipo, 'date') ||
            str_contains($tipo, 'time')
        ) {
            $dados[$nome] = $agora;
            continue;
        }

        throw new RuntimeException(
            'A tabela usuarios possui o campo obrigatório "' .
            $nome .
            '". Crie Cynthia manualmente nessa tabela ou ajuste o instalador.'
        );
    }

    $nomes = array_keys($dados);
    $marcadores = implode(', ', array_fill(0, count($nomes), '?'));
    $camposSql = implode(
        ', ',
        array_map(
            static fn(string $nome): string => '`' . $nome . '`',
            $nomes
        )
    );

    $sql = "INSERT INTO usuarios ({$camposSql}) VALUES ({$marcadores})";
    $stmt = $mysqli->prepare($sql);

    if (!$stmt) {
        throw new RuntimeException(
            'Não foi possível preparar a criação da usuária Cynthia.'
        );
    }

    $tipos = '';
    $valores = [];

    foreach ($dados as $valor) {
        if (is_int($valor)) {
            $tipos .= 'i';
        } else {
            $tipos .= 's';
        }

        $valores[] = $valor;
    }

    $referencias = [];

    foreach ($valores as $indice => $valor) {
        $referencias[$indice] = &$valores[$indice];
    }

    $stmt->bind_param($tipos, ...$referencias);

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

        throw new RuntimeException(
            'Não foi possível criar Cynthia: ' . $mensagem
        );
    }

    $stmt->close();

    return 'Usuária Cynthia criada usando ' . $formatoSenha . '.';
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        telecomValidarCsrf();
        telecomGarantirEstrutura($mysqli);

        $resultados[] =
            'Tabelas de chips, smartphones e movimentações criadas.';

        $resultados[] =
            instalarUsuarioCynthia($mysqli, $senhaTemporaria);
    } catch (Throwable $excecao) {
        $erro = $excecao->getMessage();
    }
}
?>
<!doctype html>
<html lang="pt-BR">
<head>
    <meta charset="utf-8">
    <meta
        name="viewport"
        content="width=device-width,initial-scale=1"
    >
    <title>Instalar módulo de telecom</title>
    <link
        href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"
        rel="stylesheet"
    >
    <style>
        body{
            margin:0;min-height:100vh;display:grid;place-items:center;
            padding:20px;font-family:Inter,Arial,sans-serif;color:#172438;
            background:radial-gradient(circle at 0 0,rgba(20,91,159,.14),transparent 28rem),#edf3f8;
        }
        .box{width:min(760px,100%);overflow:hidden;border-radius:26px;background:#fff;box-shadow:0 30px 90px rgba(8,57,111,.18)}
        .head{padding:25px;color:#fff;background:linear-gradient(145deg,#05294f,#08396f)}
        .head h1{margin:0;font-size:28px}.head p{margin:8px 0 0;color:rgba(255,255,255,.72)}
        .body{padding:25px}.notice,.ok,.error{margin-bottom:11px;padding:13px;border-radius:14px;line-height:1.5}
        .notice{color:#805400;background:#fff7e6}.ok{color:#076448;background:#e8f8f1}.error{color:#922138;background:#fff0f3}
        button,a{min-height:44px;display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:0 15px;border:0;border-radius:13px;color:#fff;background:#08396f;text-decoration:none;font-weight:800;cursor:pointer}
        a{background:#087f5b}.credential{display:block;margin:9px 0;padding:12px;border-radius:12px;background:#f3f6f9;font-family:monospace}
    </style>
</head>
<body>
<main class="box">
    <header class="head">
        <h1>
            <i class="bi bi-phone-fill"></i>
            Instalar Chips e Smartphones
        </h1>
        <p>
            Cria as tabelas do módulo, o login da Cynthia e prepara o acesso ao painel exclusivo.
        </p>
    </header>

    <section class="body">
        <?php if ($erro !== ''): ?>
            <div class="error">
                <strong>Erro:</strong>
                <?= telecomE($erro) ?>
            </div>
        <?php endif; ?>

        <?php foreach ($resultados as $resultado): ?>
            <div class="ok">
                <i class="bi bi-check-circle-fill"></i>
                <?= telecomE($resultado) ?>
            </div>
        <?php endforeach; ?>

        <?php if (empty($resultados)): ?>
            <div class="notice">
                Execute somente uma vez e depois apague
                <strong>instalar_telecom.php</strong> do servidor.
            </div>

            <form method="post">
                <input
                    type="hidden"
                    name="csrf_token"
                    value="<?= telecomE($csrf) ?>"
                >
                <button type="submit">
                    <i class="bi bi-database-fill-gear"></i>
                    Instalar módulo
                </button>
            </form>
        <?php else: ?>
            <h3>Login inicial</h3>

            <span class="credential">
                Usuário: Cynthia
            </span>

            <span class="credential">
                Senha temporária: <?= telecomE($senhaTemporaria) ?>
            </span>

            <p>
                Após testar o acesso, altere a senha da usuária conforme
                o procedimento normal do sistema.
            </p>

            <a href="dashboard_cynthia.php">
                <i class="bi bi-grid-1x2-fill"></i>
                Abrir Painel da Cynthia
            </a>

            <p style="margin-top:18px;color:#bf263d;font-weight:800;">
                Apague este instalador do servidor após concluir.
            </p>
        <?php endif; ?>
    </section>
</main>
</body>
</html>
