<?php
// os_form.php — Abrir nova Ordem de Serviço
$pageActive = 'ordens';
$pageTitle  = 'Nova OS';
require_once __DIR__ . '/functions.php';
require_once __DIR__ . '/auth.php';
requireLogin();

$erros    = [];
$preClienteId = (int)($_GET['cliente_id'] ?? 0);

// POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!verifyCsrf($_POST['csrf_token'] ?? '')) die('CSRF inválido');

    $clienteId  = (int)($_POST['cliente_id'] ?? 0);
    $tipo       = trim($_POST['tipo_os'] ?? '');
    $relato     = trim($_POST['relato_cliente'] ?? '');
    $protocolo  = trim($_POST['protocolo'] ?? '');
    $agendamento= trim($_POST['agendamento'] ?? '');
    $tecnicoId  = (int)($_POST['tecnico_id'] ?? 0) ?: null;
    $operadorId = usuarioLogado()['id'];
    $status     = trim($_POST['status'] ?? 'ABERTA');

    if (!$clienteId) $erros[] = 'Selecione um cliente.';
    if (!$tipo)      $erros[] = 'Selecione o tipo de OS.';

    if (empty($erros)) {
        // ── Inserção com proteção contra número duplicado ─────────────
        // Tenta até 5 vezes gerando um novo número a cada tentativa,
        // evitando o erro de duplicate entry em acessos simultâneos.
        $osId    = null;
        $numero  = null;
        $tentativas = 0;

        while ($tentativas < 5) {
            $tentativas++;
            $numero = gerarNumeroOS();

            try {
                $stmt = pdo()->prepare(
                    "INSERT INTO ordens_servico (numero_os, cliente_id, operador_suporte_id, tecnico_id,
                     tipo_os, status, relato_cliente, protocolo, agendamento)
                     VALUES (?,?,?,?,?,?,?,?,?)"
                );
                $stmt->execute([
                    $numero, $clienteId, $operadorId, $tecnicoId,
                    $tipo, $status, $relato, $protocolo ?: null,
                    $agendamento ? date('Y-m-d H:i:s', strtotime($agendamento)) : null,
                ]);
                $osId = (int)pdo()->lastInsertId();
                break; // sucesso — sai do loop

            } catch (PDOException $e) {
                // Código 23000 = violação de integridade (duplicate key)
                if ($e->getCode() === '23000' && $tentativas < 5) {
                    // Força geração de um número diferente adicionando microtempo
                    usleep(rand(10000, 50000)); // 10–50ms para desincronizar
                    continue;
                }
                // Outro erro ou esgotou tentativas
                $erros[] = 'Erro ao criar OS: ' . $e->getMessage();
                break;
            }
        }

        if ($osId) {
            header("Location: os_detalhe.php?id=$osId&msg=OS+$numero+aberta+com+sucesso!");
            exit;
        }
    }
}

$clientes = getClientes(['ativo' => 1]);
$tecnicos = getTecnicos();
$tiposOS  = [
    'INSTALACAO'=>'Instalação','SUPORTE_REMOTO'=>'Suporte Remoto','MANUTENCAO'=>'Manutenção',
    'VISITA_TECNICA'=>'Visita Técnica','CANCELAMENTO'=>'Cancelamento',
    'MUDANCA_ENDERECO'=>'Mudança de Endereço','CAMERA'=>'Câmera',
    'UPGRADE_PLANO'=>'Upgrade de Plano','TROCA_EQUIPAMENTO'=>'Troca de Equipamento','OUTROS'=>'Outros',
];

require_once __DIR__ . '/includes/header.php';
?>

<div class="topbar"><button class="btn-hamburger" onclick="abrirDrawer()" aria-label="Menu">&#9776;</button>
  <div>
    <div class="page-title">◈ Abrir Nova Ordem de Serviço</div>
    <div class="page-sub">O número será gerado automaticamente</div>
  </div>
  <div class="topbar-actions">
    <a href="ordens.php" class="btn btn-ghost">← Voltar</a>
  </div>
</div>

<div class="content">

<?php if ($erros): ?>
  <div class="alert alert-danger"><?= implode('<br>', array_map('e', $erros)) ?></div>
<?php endif; ?>

<div style="max-width:680px">
<form method="post">
<input type="hidden" name="csrf_token" value="<?= csrfToken() ?>"/>

<div class="form-card">
  <div class="form-section-title">◎ DADOS DA OS</div>
  <div class="form-grid">
    <div class="form-group full">
      <label class="form-label">CLIENTE *</label>
      <select class="form-select" name="cliente_id" required>
        <option value="">Selecione o cliente...</option>
        <?php foreach ($clientes as $c): ?>
          <option value="<?= $c['id'] ?>" <?= $c['id']===$preClienteId?'selected':'' ?>>
            <?= e($c['nome']) ?> — <?= e($c['endereco_cidade']) ?>
          </option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="form-group">
      <label class="form-label">TIPO DE OS *</label>
      <select class="form-select" name="tipo_os" required>
        <option value="">Selecione...</option>
        <?php foreach ($tiposOS as $val => $lbl): ?>
          <option value="<?= e($val) ?>"><?= e($lbl) ?></option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="form-group">
      <label class="form-label">STATUS INICIAL</label>
      <select class="form-select" name="status">
        <option value="ABERTA">Aberta</option>
        <option value="AGENDADA">Agendada</option>
        <option value="EM_ANDAMENTO">Em Andamento</option>
      </select>
    </div>

    <div class="form-group">
      <label class="form-label">AGENDAMENTO</label>
      <input class="form-input" type="datetime-local" name="agendamento"/>
    </div>

    <div class="form-group">
      <label class="form-label">TÉCNICO RESPONSÁVEL</label>
      <select class="form-select" name="tecnico_id">
        <option value="">Sem técnico definido</option>
        <?php foreach ($tecnicos as $t): ?>
          <option value="<?= $t['id'] ?>"><?= e($t['nome']) ?> (<?= e($t['perfil']) ?>)</option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="form-group">
      <label class="form-label">PROTOCOLO</label>
      <input class="form-input" type="text" name="protocolo" placeholder="PRO-00001 (opcional)"/>
    </div>

    <div class="form-group full">
      <label class="form-label">RELATO DO CLIENTE</label>
      <textarea class="form-textarea" name="relato_cliente" rows="4"
        placeholder="Descreva o problema ou solicitação relatada pelo cliente..."></textarea>
    </div>
  </div>
</div>

<div style="display:flex;gap:12px;justify-content:flex-end;margin-top:18px">
  <a href="ordens.php" class="btn btn-ghost">Cancelar</a>
  <button type="submit" class="btn btn-primary">✓ Abrir OS</button>
</div>

</form>
</div>
</div>

<?php require_once __DIR__ . '/includes/footer.php'; ?>

