<?php
declare(strict_types=1);

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

date_default_timezone_set('America/Sao_Paulo');
impressorasExigirAcesso();

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

$mysqli->set_charset('utf8mb4');
$csrf = impCsrf();
$resultados = [];
$erro = '';
$senhaTemporaria = 'Marcelo@TI2026!';

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

    if (!$resultado || $resultado->num_rows < 1) {
        return 'Tabela usuarios não encontrada; Marcelo não foi criado automaticamente.';
    }

    $colunas = [];
    $resultado = $mysqli->query(
        'SHOW FULL COLUMNS FROM usuarios'
    );

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

    $loginColuna = null;
    $senhaColuna = null;

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

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

    if (!$loginColuna || !$senhaColuna) {
        return 'Estrutura da tabela usuarios não reconhecida; crie Marcelo manualmente.';
    }

    $nome = 'Marcelo';

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

    $stmt->bind_param('s', $nome);
    $stmt->execute();
    $existe = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if ($existe) {
        return 'Usuário Marcelo já existe; a senha atual foi preservada.';
    }

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

    if ($resultado) {
        $amostra = (string) (
            $resultado->fetch_assoc()['senha'] ?? ''
        );
    }

    if (
        str_starts_with($amostra, '$2') ||
        str_starts_with($amostra, '$argon')
    ) {
        $senhaGravada = password_hash(
            $senha,
            PASSWORD_DEFAULT
        );
    } elseif (preg_match('/^[a-f0-9]{32}$/i', $amostra)) {
        $senhaGravada = md5($senha);
    } elseif (preg_match('/^[a-f0-9]{40}$/i', $amostra)) {
        $senhaGravada = sha1($senha);
    } else {
        $senhaGravada = password_hash(
            $senha,
            PASSWORD_DEFAULT
        );
    }

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

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

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

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

        $normalizado = impNormalizar($campo);
        $tipo = strtolower((string) ($config['Type'] ?? ''));

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

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

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

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

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

        if (
            str_contains($tipo, 'date') ||
            str_contains($tipo, 'time')
        ) {
            $dados[$campo] = date('Y-m-d H:i:s');
            continue;
        }

        return 'Campo obrigatório "' . $campo . '" impediu a criação automática de Marcelo.';
    }

    $campos = array_keys($dados);
    $camposSql = implode(
        ', ',
        array_map(
            static fn(string $campo): string => '`' . $campo . '`',
            $campos
        )
    );

    $marcadores = implode(
        ', ',
        array_fill(0, count($campos), '?')
    );

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

    if (!$stmt) {
        return 'Não foi possível preparar a criação do usuário Marcelo.';
    }

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

    foreach ($dados as $valor) {
        $tipos .= is_int($valor) ? 'i' : '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();
        return 'Falha ao criar Marcelo: ' . $mensagem;
    }

    $stmt->close();

    return 'Usuário Marcelo criado com senha temporária ' . $senha;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        impValidarCsrf();

        $sql = file_get_contents(
            __DIR__ . '/SQL_IMPRESSORAS.sql'
        );

        if ($sql === false) {
            throw new RuntimeException(
                'SQL_IMPRESSORAS.sql não encontrado.'
            );
        }

        if (!$mysqli->multi_query($sql)) {
            throw new RuntimeException(
                'Erro ao criar as tabelas: ' . $mysqli->error
            );
        }

        do {
            if ($resultado = $mysqli->store_result()) {
                $resultado->free();
            }

            if (!$mysqli->more_results()) {
                break;
            }
        } while ($mysqli->next_result());

        if ($mysqli->errno) {
            throw new RuntimeException(
                'Erro ao concluir a estrutura: ' . $mysqli->error
            );
        }

        $pasta = __DIR__ . '/uploads/impressoras';

        if (
            !is_dir($pasta) &&
            !mkdir($pasta, 0775, true) &&
            !is_dir($pasta)
        ) {
            throw new RuntimeException(
                'Não foi possível criar uploads/impressoras.'
            );
        }

        $resultados[] = 'Estrutura do banco criada ou confirmada.';
        $resultados[] = impInstalarMarcelo(
            $mysqli,
            $senhaTemporaria
        );
        $resultados[] = 'Pasta de anexos preparada.';
    } catch (Throwable $e) {
        $erro = $e->getMessage();
    }
}
?>
<!doctype html>
<html lang="pt-BR">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Instalar Impressoras</title>
    <style>
        body{margin:0;min-height:100vh;display:grid;place-items:center;padding:20px;font-family:Arial,sans-serif;color:#172438;background:#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:24px;color:#fff;background:linear-gradient(145deg,#05294f,#08396f)}
        .body{padding:24px}.ok,.err,.warn{margin-bottom:10px;padding:12px;border-radius:13px}.ok{color:#076448;background:#e8f8f1}.err{color:#922138;background:#fff0f3}.warn{color:#805400;background:#fff7e6}
        button,a{min-height:44px;display:inline-flex;align-items:center;justify-content:center;padding:0 15px;border:0;border-radius:13px;color:#fff;background:#08396f;text-decoration:none;font-weight:bold;cursor:pointer}
    </style>
</head>
<body>
<main class="box">
    <header class="head"><h1>Instalar Controle de Impressoras</h1><p>Marcelo e Renan terão acesso exclusivo ao módulo.</p></header>
    <section class="body">
        <?php if ($erro): ?><div class="err"><?= impE($erro) ?></div><?php endif; ?>
        <?php foreach ($resultados as $resultado): ?><div class="ok"><?= impE($resultado) ?></div><?php endforeach; ?>
        <?php if (!$resultados): ?>
            <div class="warn">Execute uma única vez e apague este instalador depois.</div>
            <form method="post"><input type="hidden" name="csrf_token" value="<?= impE($csrf) ?>"><button>INSTALAR MÓDULO</button></form>
        <?php else: ?>
            <p><strong>Login temporário do Marcelo:</strong><br>Usuário: Marcelo<br>Senha: Marcelo@TI2026!</p>
            <a href="impressoras.php">Abrir Controle de Impressoras</a>
            <p style="color:#bf263d;font-weight:bold">Apague instalar_impressoras.php do servidor.</p>
        <?php endif; ?>
    </section>
</main>
</body>
</html>
