<?php
declare(strict_types=1);

session_start();

require_once __DIR__ . '/conexao.php';
require_once __DIR__ . '/solicitacao_publica_helpers.php';

date_default_timezone_set('America/Sao_Paulo');
$mysqli->set_charset('utf8mb4');

$csrf = spCsrfPublico();
$erro = '';
$instalado = spTabelaExiste($mysqli, 'solicitacoes_os_publicas');

if ($_SERVER['REQUEST_METHOD'] === 'POST' && $instalado) {
    try {
        spValidarCsrfPublico();

        if (trim((string) ($_POST['website'] ?? '')) !== '') {
            throw new RuntimeException('Não foi possível registrar a solicitação.');
        }

        $agora = time();
        $ultimoEnvio = (int) ($_SESSION['ultima_solicitacao_publica'] ?? 0);

        if ($ultimoEnvio > 0 && ($agora - $ultimoEnvio) < 30) {
            throw new RuntimeException(
                'Aguarde alguns segundos antes de enviar outra solicitação.'
            );
        }

        $nome = spTexto($_POST['nome'] ?? '', 150);
        $email = spTexto($_POST['email'] ?? '', 180);
        $telefone = spTexto($_POST['telefone'] ?? '', 60);
        $setor = spTexto($_POST['setor'] ?? '', 150);
        $tipo = spTexto($_POST['tipo_equipamento'] ?? '', 80);
        $marca = spNulo($_POST['marca'] ?? '', 100);
        $modelo = spNulo($_POST['modelo'] ?? '', 150);
        $patrimonio = spNulo($_POST['patrimonio'] ?? '', 80);
        $serie = spNulo($_POST['numero_serie'] ?? '', 120);
        $vnc = spNulo($_POST['vnc'] ?? '', 120);
        $defeito = trim((string) ($_POST['defeito'] ?? ''));
        $aceite = !empty($_POST['aceite']);

        if ($nome === '') {
            throw new RuntimeException('Informe seu nome completo.');
        }

        if (
            $email === '' ||
            filter_var($email, FILTER_VALIDATE_EMAIL) === false
        ) {
            throw new RuntimeException('Informe um e-mail válido.');
        }

        if ($telefone === '') {
            throw new RuntimeException('Informe o telefone ou ramal.');
        }

        if ($setor === '') {
            throw new RuntimeException('Informe o setor onde você trabalha.');
        }

        if ($tipo === '') {
            throw new RuntimeException('Selecione o tipo de equipamento.');
        }

        if (mb_strlen($defeito, 'UTF-8') < 15) {
            throw new RuntimeException(
                'Descreva o defeito com pelo menos 15 caracteres.'
            );
        }

        if (!$aceite) {
            throw new RuntimeException(
                'Confirme que as informações estão corretas.'
            );
        }

        $ip = spTexto($_SERVER['REMOTE_ADDR'] ?? '', 45);
        $userAgent = spTexto($_SERVER['HTTP_USER_AGENT'] ?? '', 500);

        $stmt = $mysqli->prepare("
            SELECT COUNT(*) AS total
            FROM solicitacoes_os_publicas
            WHERE ip_origem = ?
              AND data_solicitacao >= DATE_SUB(NOW(), INTERVAL 20 MINUTE)
        ");

        $stmt->bind_param('s', $ip);
        $stmt->execute();
        $recentes = (int) (
            $stmt->get_result()->fetch_assoc()['total'] ?? 0
        );
        $stmt->close();

        if ($recentes >= 5) {
            throw new RuntimeException(
                'Muitas solicitações foram enviadas deste dispositivo. Aguarde alguns minutos.'
            );
        }

        $anexo = spSalvarAnexo($_FILES['anexo'] ?? []);
        $protocolo = spProtocolo();
        $token = spToken();

        $stmt = $mysqli->prepare("
            INSERT INTO solicitacoes_os_publicas (
                protocolo,
                token_publico,
                nome,
                email,
                telefone,
                setor,
                tipo_equipamento,
                marca,
                modelo,
                patrimonio,
                numero_serie,
                vnc,
                defeito,
                anexo,
                anexo_nome_original,
                anexo_mime,
                anexo_tamanho,
                anexo_hash,
                status,
                ip_origem,
                user_agent
            )
            VALUES (
                ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
                'AGUARDANDO_ENTREGA', ?, ?
            )
        ");

        if (!$stmt) {
            throw new RuntimeException(
                'Não foi possível preparar o registro da solicitação.'
            );
        }

        $stmt->bind_param(
            'ssssssssssssssssisss',
            $protocolo,
            $token,
            $nome,
            $email,
            $telefone,
            $setor,
            $tipo,
            $marca,
            $modelo,
            $patrimonio,
            $serie,
            $vnc,
            $defeito,
            $anexo['caminho'],
            $anexo['nome_original'],
            $anexo['mime'],
            $anexo['tamanho'],
            $anexo['hash'],
            $ip,
            $userAgent
        );

        if (!$stmt->execute()) {
            $mensagem = $stmt->error;
            $stmt->close();
            throw new RuntimeException(
                'Não foi possível registrar a solicitação: ' . $mensagem
            );
        }

        $stmt->close();

        $_SESSION['ultima_solicitacao_publica'] = $agora;
        $_SESSION['csrf_solicitacao_publica'] = bin2hex(random_bytes(24));

        header(
            'Location: solicitacao_enviada.php?token=' .
            rawurlencode($token)
        );
        exit;
    } catch (Throwable $e) {
        $erro = $e->getMessage();
    }
}

function old(string $campo): string
{
    return spE($_POST[$campo] ?? '');
}
?>
<!doctype html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<meta name="theme-color" content="#0b3b78">
<title>Abrir Solicitação de Manutenção TI</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet">
<link href="solicitacao_publica_style.css?v=1" rel="stylesheet">
</head>
<body>
<div class="top-line"></div><div class="bg-grid"></div>
<main class="page">
<section class="hero">
    <div class="brand">
        <div class="logo"><img src="assets/logo_pref.jpg" alt="Prefeitura de Extrema"></div>
        <div>
            <span class="eyebrow"><i class="bi bi-headset"></i>Gerência de Tecnologia</span>
            <h1>Solicitação pública de manutenção</h1>
            <p>Registre os dados do equipamento antes de levá-lo à TI. O prazo técnico só começa quando a equipe confirmar a chegada.</p>
        </div>
    </div>
    <aside class="hero-side">
        <strong>Como funciona</strong>
        <div class="hero-steps">
            <div class="hero-step"><i class="bi bi-1-circle-fill"></i>Preencha e envie a solicitação.</div>
            <div class="hero-step"><i class="bi bi-2-circle-fill"></i>Leve o equipamento à Gerência de Tecnologia.</div>
            <div class="hero-step"><i class="bi bi-3-circle-fill"></i>O técnico confirma a chegada e a OS começa.</div>
        </div>
    </aside>
</section>


<section class="card">
    <div class="card-head">
        <div class="card-title"><span class="card-icon"><i class="bi bi-clipboard2-plus-fill"></i></span><div><h2>Dados da solicitação</h2><p>Campos com * são obrigatórios.</p></div></div>
    </div>

    <?php if (!$instalado): ?>
        <div class="notice danger"><i class="bi bi-database-fill-exclamation"></i><span>O módulo ainda não foi instalado. A equipe de TI deve executar o instalador antes de divulgar esta página.</span></div>
    <?php endif; ?>

    <?php if ($erro !== ''): ?>
        <div class="notice danger"><i class="bi bi-exclamation-triangle-fill"></i><span><?= spE($erro) ?></span></div>
    <?php endif; ?>

    <div class="notice warning"><i class="bi bi-stopwatch-fill"></i><span><strong>O prazo ainda não começa agora.</strong> Sua solicitação ficará como “Aguardando entrega na TI”. A contagem da OS será iniciada somente após o técnico confirmar a chegada do equipamento.</span></div>

    <form method="post" enctype="multipart/form-data" autocomplete="on">
        <input type="hidden" name="csrf_token" value="<?= spE($csrf) ?>">
        <div class="honeypot" aria-hidden="true">
            <label>Não preencha<input type="text" name="website" tabindex="-1" autocomplete="off"></label>
        </div>

        <section class="form-section">
            <h3 class="section-title"><i class="bi bi-person-vcard-fill"></i>Seus dados</h3>
            <div class="form-grid">
                <div class="field-group"><label>Nome completo *</label><input class="control" name="nome" maxlength="150" required value="<?= old('nome') ?>"></div>
                <div class="field-group"><label>E-mail institucional *</label><input class="control" type="email" name="email" maxlength="180" required value="<?= old('email') ?>"></div>
                <div class="field-group"><label>Telefone ou ramal *</label><input class="control" name="telefone" maxlength="60" required value="<?= old('telefone') ?>"></div>
                <div class="field-group full"><label>Secretaria, setor ou unidade *</label><input class="control" name="setor" maxlength="150" required placeholder="Ex.: Secretaria de Educação — EMETI Nildes" value="<?= old('setor') ?>"></div>
            </div>
        </section>

        <section class="form-section">
            <h3 class="section-title"><i class="bi bi-pc-display-horizontal"></i>Equipamento</h3>
            <div class="form-grid">
                <div class="field-group">
                    <label>Tipo de equipamento *</label>
                    <select class="control" name="tipo_equipamento" required>
                        <option value="">Selecione</option>
                        <?php foreach ([
                            'COMPUTADOR / CPU','NOTEBOOK','IMPRESSORA',
                            'MONITOR','SMARTPHONE','NOBREAK',
                            'EQUIPAMENTO DE REDE','OUTRO'
                        ] as $tipo): ?>
                            <option value="<?= spE($tipo) ?>" <?= ($_POST['tipo_equipamento'] ?? '') === $tipo ? 'selected' : '' ?>><?= spE($tipo) ?></option>
                        <?php endforeach; ?>
                    </select>
                </div>
                <div class="field-group"><label>Patrimônio <span class="optional">opcional</span></label><input class="control" name="patrimonio" maxlength="80" value="<?= old('patrimonio') ?>"></div>
                <div class="field-group"><label>Número de série <span class="optional">opcional</span></label><input class="control" name="numero_serie" maxlength="120" value="<?= old('numero_serie') ?>"></div>
                <div class="field-group"><label>Marca <span class="optional">opcional</span></label><input class="control" name="marca" maxlength="100" value="<?= old('marca') ?>"></div>
                <div class="field-group"><label>Modelo <span class="optional">opcional</span></label><input class="control" name="modelo" maxlength="150" value="<?= old('modelo') ?>"></div>
                <div class="field-group"><label>Código VNC / AnyDesk <span class="optional">opcional</span></label><input class="control" name="vnc" maxlength="120" value="<?= old('vnc') ?>" placeholder="Somente o código de acesso"><span class="help">Nunca informe senha neste campo.</span></div>
            </div>
        </section>

        <section class="form-section">
            <h3 class="section-title"><i class="bi bi-bug-fill"></i>Defeito relatado</h3>
            <div class="form-grid">
                <div class="field-group full"><label>O que está acontecendo? *</label><textarea class="control" name="defeito" required minlength="15" maxlength="5000" placeholder="Explique o problema, quando começou e o que já foi tentado."><?= spE($_POST['defeito'] ?? '') ?></textarea></div>
                <div class="field-group full"><label>Foto ou documento <span class="optional">opcional</span></label><input class="control" type="file" name="anexo" accept=".pdf,.jpg,.jpeg,.png"><span class="help">PDF, JPG ou PNG, até 8 MB.</span></div>
            </div>
        </section>

        <label class="consent"><input type="checkbox" name="aceite" value="1" required <?= !empty($_POST['aceite']) ? 'checked' : '' ?>><span>Confirmo que os dados informados estão corretos e entendi que o prazo técnico começará somente depois que a TI confirmar o recebimento do equipamento.</span></label>

        <div class="form-actions">
            <button class="button primary" type="submit" <?= !$instalado ? 'disabled' : '' ?>><i class="bi bi-send-check-fill"></i>Enviar solicitação</button>
        </div>
    </form>
</section>

<footer class="footer"><span>Prefeitura de Extrema — Gerência de Tecnologia</span><span><i class="bi bi-shield-check"></i> Seus dados serão utilizados somente para o atendimento técnico.</span></footer>
</main>
</body>
</html>
