<?php
declare(strict_types=1);

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

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

$id = (int) ($_GET['id'] ?? $_POST['id'] ?? 0);
$csrf = spCsrfTecnico();
$erro = '';
$solicitacao = spBuscarPorId($mysqli, $id);

if (!$solicitacao) {
    http_response_code(404);
    exit('Solicitação não encontrada.');
}

$sugestao = spPrioridadeSugerida((string) $solicitacao['defeito']);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        spValidarCsrfTecnico();
        $acao = spTexto($_POST['acao'] ?? 'receber', 20);
        $tecnico = spTexto($_SESSION['usuario'] ?? 'Técnico', 150);

        if ($acao === 'cancelar') {
            $motivo = spTexto($_POST['motivo_cancelamento'] ?? '', 500);

            if (mb_strlen($motivo, 'UTF-8') < 5) {
                throw new RuntimeException(
                    'Informe o motivo do cancelamento.'
                );
            }

            $mysqli->begin_transaction();
            $atual = spBuscarPorId($mysqli, $id, true);

            if (!$atual || $atual['status'] !== 'AGUARDANDO_ENTREGA') {
                throw new RuntimeException(
                    'Esta solicitação não está mais aguardando entrega.'
                );
            }

            $stmt = $mysqli->prepare("
                UPDATE solicitacoes_os_publicas
                SET
                    status = 'CANCELADA',
                    motivo_cancelamento = ?,
                    cancelado_por = ?,
                    data_cancelamento = NOW()
                WHERE id = ?
            ");
            $stmt->bind_param('ssi', $motivo, $tecnico, $id);
            $stmt->execute();
            $stmt->close();
            $mysqli->commit();

            spFlash('sucesso', 'Solicitação cancelada com justificativa.');
            header('Location: solicitacoes_publicas.php');
            exit;
        }

        $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);
        $problema = trim((string) ($_POST['defeito'] ?? ''));
        $prioridade = spTexto($_POST['prioridade'] ?? 'Média', 20);
        $prazo = max(1, min(365, (int) ($_POST['prazo'] ?? 5)));

        if (
            $nome === '' ||
            $email === '' ||
            $telefone === '' ||
            $setor === '' ||
            $tipo === '' ||
            mb_strlen($problema, 'UTF-8') < 10
        ) {
            throw new RuntimeException(
                'Revise os dados obrigatórios antes de confirmar.'
            );
        }

        if (
            filter_var($email, FILTER_VALIDATE_EMAIL) === false
        ) {
            throw new RuntimeException('O e-mail informado é inválido.');
        }

        if (!in_array($prioridade, ['Baixa','Média','Alta','Urgente'], true)) {
            $prioridade = 'Média';
        }

        $mysqli->begin_transaction();
        $atual = spBuscarPorId($mysqli, $id, true);

        if (!$atual || $atual['status'] !== 'AGUARDANDO_ENTREGA') {
            throw new RuntimeException(
                'Esta solicitação já foi recebida ou cancelada.'
            );
        }

        $numeroOs = spNumeroOs();
        $statusOs = 'Em andamento';
        $tokenOs = osPublicoGerarToken();
        $acompanhamentoAtivo = 1;
        $mensagemPublica =
            'O equipamento foi recebido pela Gerência de Tecnologia. O prazo técnico começou a contar neste momento.';
        $dataSolicitacao = (string) $atual['data_solicitacao'];
        $anexo = spNulo($atual['anexo'] ?? '', 500);
        $origemId = (int) $atual['id'];

        $stmt = $mysqli->prepare("
            INSERT INTO ordens_servico (
                numero_os,
                nome_solicitante,
                setor,
                email,
                telefone,
                tipo_equipamento,
                marca,
                modelo,
                patrimonio,
                numero_serie,
                problema,
                data_entrada,
                status,
                prioridade,
                prazo,
                anexo,
                tecnico,
                vnc,
                origem_publica_id,
                data_solicitacao_publica,
                token_acompanhamento,
                acompanhamento_ativo,
                mensagem_publica
            )
            VALUES (
                ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
                NOW(),
                ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
            )
        ");

        if (!$stmt) {
            throw new RuntimeException(
                'Não foi possível preparar a criação da OS: ' .
                $mysqli->error
            );
        }

        $types =
            str_repeat('s', 13) .
            'i' .
            str_repeat('s', 3) .
            'i' .
            str_repeat('s', 2) .
            'i' .
            's';

        $stmt->bind_param(
            $types,
            $numeroOs,
            $nome,
            $setor,
            $email,
            $telefone,
            $tipo,
            $marca,
            $modelo,
            $patrimonio,
            $serie,
            $problema,
            $statusOs,
            $prioridade,
            $prazo,
            $anexo,
            $tecnico,
            $vnc,
            $origemId,
            $dataSolicitacao,
            $tokenOs,
            $acompanhamentoAtivo,
            $mensagemPublica
        );

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

        $osId = (int) $stmt->insert_id;
        $stmt->close();

        $stmt = $mysqli->prepare("
            UPDATE solicitacoes_os_publicas
            SET
                nome = ?,
                email = ?,
                telefone = ?,
                setor = ?,
                tipo_equipamento = ?,
                marca = ?,
                modelo = ?,
                patrimonio = ?,
                numero_serie = ?,
                vnc = ?,
                defeito = ?,
                status = 'RECEBIDA',
                data_recebimento = NOW(),
                recebido_por = ?,
                os_id = ?
            WHERE id = ?
        ");

        $stmt->bind_param(
            'ssssssssssssii',
            $nome,
            $email,
            $telefone,
            $setor,
            $tipo,
            $marca,
            $modelo,
            $patrimonio,
            $serie,
            $vnc,
            $problema,
            $tecnico,
            $osId,
            $id
        );
        $stmt->execute();
        $stmt->close();

        if (spTabelaExiste($mysqli, 'os_atualizacoes_publicas')) {
            osPublicoRegistrarAtualizacao(
                $mysqli,
                $osId,
                'Equipamento recebido',
                'A Gerência de Tecnologia confirmou a chegada do equipamento. O atendimento e a contagem de prazo foram iniciados.',
                'RECEBIDA',
                $tecnico,
                1
            );
        }

        $mysqli->commit();

        spFlash(
            'sucesso',
            'Equipamento recebido. A OS ' .
            $numeroOs .
            ' foi criada e o prazo começou agora.'
        );

        header('Location: detalhes_os.php?id=' . $osId);
        exit;
    } catch (Throwable $e) {
        try {
            $mysqli->rollback();
        } catch (Throwable) {
        }

        $erro = $e->getMessage();
        $solicitacao = spBuscarPorId($mysqli, $id) ?: $solicitacao;
    }
}
?>
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Confirmar chegada do equipamento</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=""></div><div><span class="eyebrow"><i class="bi bi-box-arrow-in-down"></i><?=spE($solicitacao['protocolo'])?></span><h1>Confirmar chegada do equipamento</h1><p>Revise os dados antes de criar a OS. Ao confirmar, a data de entrada será registrada como agora e o prazo começará imediatamente.</p></div></div><aside class="hero-side"><strong><?=spE($_SESSION['usuario']??'Técnico')?></strong><span>Esta confirmação ficará vinculada ao técnico autenticado.</span></aside></section>
<nav class="public-nav"><a class="nav-button" href="solicitacoes_publicas.php"><i class="bi bi-arrow-left"></i>Voltar à fila</a></nav>

<section class="card">
<?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>Solicitação feita em <?=spE(spData($solicitacao['data_solicitacao']))?>. Esse período <strong>não será contado</strong> na OS.</span></div>

<form method="post">
<input type="hidden" name="csrf_token" value="<?=spE($csrf)?>"><input type="hidden" name="id" value="<?=$id?>"><input type="hidden" name="acao" value="receber">
<section class="form-section"><h3 class="section-title"><i class="bi bi-person-vcard-fill"></i>Solicitante</h3><div class="form-grid">
<div class="field-group"><label>Nome *</label><input class="control" name="nome" required value="<?=spE($solicitacao['nome'])?>"></div>
<div class="field-group"><label>E-mail *</label><input class="control" type="email" name="email" required value="<?=spE($solicitacao['email'])?>"></div>
<div class="field-group"><label>Telefone *</label><input class="control" name="telefone" required value="<?=spE($solicitacao['telefone'])?>"></div>
<div class="field-group full"><label>Setor *</label><input class="control" name="setor" required value="<?=spE($solicitacao['setor'])?>"></div>
</div></section>

<section class="form-section"><h3 class="section-title"><i class="bi bi-pc-display"></i>Equipamento recebido</h3><div class="form-grid">
<div class="field-group"><label>Tipo *</label><input class="control" name="tipo_equipamento" required value="<?=spE($solicitacao['tipo_equipamento'])?>"></div>
<div class="field-group"><label>Patrimônio</label><input class="control" name="patrimonio" value="<?=spE($solicitacao['patrimonio'])?>"></div>
<div class="field-group"><label>Número de série</label><input class="control" name="numero_serie" value="<?=spE($solicitacao['numero_serie'])?>"></div>
<div class="field-group"><label>Marca</label><input class="control" name="marca" value="<?=spE($solicitacao['marca'])?>"></div>
<div class="field-group"><label>Modelo</label><input class="control" name="modelo" value="<?=spE($solicitacao['modelo'])?>"></div>
<div class="field-group"><label>VNC / AnyDesk</label><input class="control" name="vnc" value="<?=spE($solicitacao['vnc'])?>"></div>
<div class="field-group full"><label>Defeito relatado *</label><textarea class="control" name="defeito" required><?=spE($solicitacao['defeito'])?></textarea></div>
</div></section>

<section class="form-section"><h3 class="section-title"><i class="bi bi-speedometer2"></i>Prazo iniciado no recebimento</h3><div class="form-grid">
<div class="field-group"><label>Prioridade</label><select class="control" name="prioridade"><?php foreach(['Baixa','Média','Alta','Urgente'] as $p):?><option value="<?=$p?>" <?=$sugestao['prioridade']===$p?'selected':''?>><?=$p?></option><?php endforeach;?></select></div>
<div class="field-group"><label>Prazo em dias</label><input class="control" type="number" min="1" max="365" name="prazo" value="<?=(int)$sugestao['prazo']?>"></div>
<div class="field-group"><label>Início da contagem</label><input class="control" value="<?=date('d/m/Y H:i')?>" readonly></div>
</div></section>

<div class="form-actions"><button class="button green" type="submit" onclick="return confirm('Confirmar que o equipamento chegou e iniciar a OS agora?')"><i class="bi bi-check2-circle"></i>Equipamento chegou — criar OS</button></div>
</form>

<form method="post" style="margin-top:13px" onsubmit="return confirm('Cancelar esta solicitação?')">
<input type="hidden" name="csrf_token" value="<?=spE($csrf)?>"><input type="hidden" name="id" value="<?=$id?>"><input type="hidden" name="acao" value="cancelar">
<section class="form-section"><h3 class="section-title"><i class="bi bi-x-octagon-fill"></i>Cancelar antes do recebimento</h3><div class="form-grid"><div class="field-group full"><label>Motivo do cancelamento</label><input class="control" name="motivo_cancelamento" minlength="5" maxlength="500" placeholder="Ex.: solicitação duplicada, equipamento não será enviado..."></div></div></section>
<div class="form-actions"><button class="button" type="submit"><i class="bi bi-x-circle"></i>Cancelar solicitação</button></div>
</form>
</section>
</main></body></html>
