<?php
require_once __DIR__ . "/../../includes/db.php";

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


$mesa  = (int)($_GET["mesa"] ?? 0);
$token = (string)($_GET["token"] ?? "");

$erro = "";

// helpers
function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, "UTF-8"); }

function validarTelefoneBR(string $tel): bool {
  $tel = preg_replace('/\D+/', '', $tel);
  $len = strlen($tel);

  // Celular BR: DDD (2) + 9 + 8 dígitos = 11
  if ($len === 11) {
    return (bool)preg_match('/^[1-9]{2}9\d{8}$/', $tel);
  }

  // Fixo BR: DDD (2) + 8 dígitos = 10 (começa geralmente com 2 a 5)
  if ($len === 10) {
    return (bool)preg_match('/^[1-9]{2}[2-5]\d{7}$/', $tel);
  }

  return false;
}

function go(string $path, int $mesa, string $token){
  $qs = http_build_query(["mesa"=>$mesa, "token"=>$token]);
  header("Location: " . BASE_URL . $path . "?" . $qs);
  exit;
}

function validarMesa(PDO $pdo, int $mesa, string $token): array {
  if ($mesa <= 0 || $token === "") return ["ok"=>false, "error"=>"Mesa/token inválidos."];

  $st = $pdo->prepare("SELECT id, numero, token, ativa FROM mesas WHERE numero=? AND token=? AND ativa=1 LIMIT 1");
  $st->execute([$mesa, $token]);
  $m = $st->fetch();
  if (!$m) return ["ok"=>false, "error"=>"Mesa não encontrada ou inativa."];

  return ["ok"=>true, "mesa_id"=>(int)$m["id"]];
}

function table_exists(PDO $pdo, string $table): bool {
  try {
    $st = $pdo->prepare("SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? LIMIT 1");
    $st->execute([$table]);
    return (bool)$st->fetchColumn();
  } catch (Throwable $e) {
    return false;
  }
}

function mesa_ocupacao(PDO $pdo, int $mesaId): array {
  $st = $pdo->prepare("SELECT id FROM contas WHERE mesa_id=? AND status='ABERTA' ORDER BY id DESC LIMIT 1");
  $st->execute([$mesaId]);
  $c = $st->fetch();
  $contaId = $c ? (int)$c["id"] : 0;

  $ativos = 0;
  if ($contaId > 0 && table_exists($pdo, 'conta_participantes')) {
    $st2 = $pdo->prepare("SELECT COUNT(*) AS c FROM conta_participantes WHERE conta_id=? AND status='ATIVO'");
    $st2->execute([$contaId]);
    $ativos = (int)($st2->fetch()["c"] ?? 0);
  }
  return ["conta_id"=>$contaId, "ativos"=>$ativos];
}

function obterOuCriarContaAberta(PDO $pdo, int $mesaId): int {
  $st = $pdo->prepare("SELECT id FROM contas WHERE mesa_id=? AND status='ABERTA' ORDER BY id DESC LIMIT 1");
  $st->execute([$mesaId]);
  $c = $st->fetch();
  if ($c) return (int)$c["id"];

  $st2 = $pdo->prepare("INSERT INTO contas (mesa_id, status) VALUES (?, 'ABERTA')");
  $st2->execute([$mesaId]);
  return (int)$pdo->lastInsertId();
}

/**
 * Reconexão por cookie (se existir)
 * - garante que a conta está ABERTA
 * - garante que participação está ATIVO (evita reconectar pendente/negado)
 */
function cookies_read_reconnect(): array {
  $mesa = (int)($_COOKIE['reconnect_mesa'] ?? 0);
  $token = (string)($_COOKIE['reconnect_token'] ?? "");
  $conta = (int)($_COOKIE['reconnect_conta'] ?? 0);
  $cli   = (int)($_COOKIE['reconnect_cliente'] ?? 0);
  $sess  = (string)($_COOKIE['reconnect_sessao'] ?? "");
  return [$mesa,$token,$conta,$cli,$sess];
}
function cookies_clear_reconnect(){
  foreach (['reconnect_mesa','reconnect_token','reconnect_conta','reconnect_cliente','reconnect_sessao'] as $k){
    @setcookie($k, '', [
      'expires' => time()-3600,
      'path' => '/',
      'secure' => false,
      'httponly' => true,
      'samesite' => 'Lax'
    ]);
  }
}
function cookies_write_reconnect(int $mesa, string $token, int $contaId, int $clienteId, string $sessaoKey){
  $opts = [
    'expires' => time() + 60*60*24*30,
    'path' => '/',
    'secure' => false,
    'httponly' => true,
    'samesite' => 'Lax'
  ];
  @setcookie('reconnect_mesa', (string)$mesa, $opts);
  @setcookie('reconnect_token', $token, $opts);
  @setcookie('reconnect_conta', (string)$contaId, $opts);
  @setcookie('reconnect_cliente', (string)$clienteId, $opts);
  @setcookie('reconnect_sessao', $sessaoKey, $opts);
}

// 1) Se já tem sessão PHP válida, vai direto
if (!empty($_SESSION["cliente_id"]) && !empty($_SESSION["conta_id"]) && !empty($_SESSION["sessao_key"])) {
  go("/public/pedidos/index.php", $mesa, $token);
}

// 2) Se não tem sessão PHP, tenta reconectar por cookies
[$cm, $ct, $cc, $ccli, $cs] = cookies_read_reconnect();
if ($cm > 0 && $ct !== "" && $cc > 0 && $ccli > 0 && $cs !== "") {
  // valida mesa/token do cookie
  $v = validarMesa($pdo, $cm, $ct);
  if ($v["ok"]) {
    // valida a conta (ABERTA e da mesma mesa)
    $st = $pdo->prepare("SELECT c.id, c.status, c.mesa_id FROM contas c WHERE c.id=? LIMIT 1");
    $st->execute([$cc]);
    $c = $st->fetch();

    if ($c && ($c['status'] ?? '') === 'ABERTA' && (int)($c['mesa_id'] ?? 0) === (int)$v['mesa_id']) {
      // valida cliente existe (evita cookie velho)
      $st2 = $pdo->prepare("SELECT id FROM clientes WHERE id=? LIMIT 1");
      $st2->execute([$ccli]);
      $cli = $st2->fetch();

      if ($cli) {
        // valida participação (precisa estar ATIVO para reconectar)
        $okPart = true;
        if (table_exists($pdo, 'conta_participantes')) {
          $st3 = $pdo->prepare("SELECT status FROM conta_participantes WHERE conta_id=? AND cliente_id=? AND sessao_key=? ORDER BY id DESC LIMIT 1");
          $st3->execute([$cc, $ccli, $cs]);
          $pr = $st3->fetch();
          $okPart = ($pr && ($pr['status'] ?? '') === 'ATIVO');
        }

        if ($okPart) {
          $_SESSION['cliente_id'] = $ccli;
          $_SESSION['conta_id'] = $cc;
          $_SESSION['sessao_key'] = $cs;
          go("/public/pedidos/index.php", $mesa, $token);
        }
      }
    }
  }

  // se falhou, não fica preso em loop — limpa cookies de reconexão
  cookies_clear_reconnect();
}

// POST (identificação)
if ($_SERVER["REQUEST_METHOD"] === "POST") {
  $nome = trim($_POST["nome"] ?? "");
  $cel  = preg_replace('/\D+/', '', $_POST["celular"] ?? "");

  $v = validarMesa($pdo, $mesa, $token);
  if (!$v["ok"]) {
    $erro = $v["error"];
  } elseif ($nome === "" || strlen($nome) < 2) {
    $erro = "Informe seu nome.";
  } elseif (!validarTelefoneBR($cel)) {
    $erro = "Informe um telefone válido com DDD (ex: 11987654321).";
  } else {
    $mesaId = (int)$v["mesa_id"];
    $contaId = obterOuCriarContaAberta($pdo, $mesaId);

    if (!table_exists($pdo, 'conta_participantes')) {
      $erro = "Falta criar a tabela de autorização (conta_participantes).";
    } else {
      // cria cliente
      $st = $pdo->prepare("INSERT INTO clientes (nome, celular) VALUES (?, ?)"); // (igual seu projeto)
      $st->execute([$nome, $cel]);
      $clienteId = (int)$pdo->lastInsertId();

      // sessao_key (simples, igual seu projeto já usa)
      $sessaoKey = substr(bin2hex(random_bytes(8)), 0, 12);

      // verifica se a mesa já tem alguém ATIVO (mesa ocupada)
      $ativos = 0;
      $stA = $pdo->prepare("SELECT COUNT(*) AS c FROM conta_participantes WHERE conta_id=? AND status='ATIVO'");
      $stA->execute([$contaId]);
      $ativos = (int)($stA->fetch()["c"] ?? 0);

      $statusPart = ($ativos > 0) ? "PENDENTE" : "ATIVO";

      // registra participação (PENDENTE precisa ser aprovada por alguém ATIVO)
      $stP = $pdo->prepare("INSERT INTO conta_participantes (conta_id, cliente_id, sessao_key, status) VALUES (?,?,?,?)");
      $stP->execute([$contaId, $clienteId, $sessaoKey, $statusPart]);

      $_SESSION["cliente_id"] = $clienteId;
      $_SESSION["conta_id"] = $contaId;
      $_SESSION["sessao_key"] = $sessaoKey;

      // grava cookies para reconectar automaticamente se o cliente fechar a página
      cookies_write_reconnect($mesa, $token, $contaId, $clienteId, $sessaoKey);

      go("/public/pedidos/index.php", $mesa, $token);
    }
  }
}


// ====== Info para UI (mesa válida / ocupada) ======
$mesaValid = validarMesa($pdo, $mesa, $token);
$mesaOk = (bool)($mesaValid["ok"] ?? false);
$mesaOcupada = false;
$ocupAtivos = 0;
if ($mesaOk) {
  $oc = mesa_ocupacao($pdo, (int)$mesaValid["mesa_id"]);
  $ocupAtivos = (int)($oc["ativos"] ?? 0);
  $mesaOcupada = ($ocupAtivos > 0);
} else {
  // se veio pela URL com mesa/token, exibimos erro na tela (entrada só em mesas cadastradas)
  if ($mesa > 0 && $token !== "") {
    $erro = $erro ?: ($mesaValid["error"] ?? "Mesa inválida.");
  }
}

?>
<!doctype html>
<html lang="pt-br">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
  <title>Identificação</title>
  <style>
    /* ====== Windows 10 Dark (estilo "Fluent" bem simples) ====== */
    :root{
      --bg:#1e1e1e;
      --card:#252526;
      --card2:#2d2d30;
      --text:#f3f3f3;
      --muted:#bdbdbd;
      --line: rgba(255,255,255,.10);
      --shadow: 0 10px 24px rgba(0,0,0,.35);
      --radius: 18px;

      --primary:#3b82f6;
      --danger:#ef4444;
      --btn: rgba(255,255,255,.06);
      --btnHover: rgba(255,255,255,.10);
      --chip: rgba(255,255,255,.06);
    }
    [data-theme="light"]{
      --bg:#f6f7fb;
      --card:#ffffff;
      --card2:#f1f5f9;
      --text:#0f172a;
      --muted:#64748b;
      --line: rgba(15,23,42,.10);
      --shadow: 0 10px 24px rgba(15,23,42,.10);

      --primary:#2563eb;
      --danger:#b91c1c;
      --btn: rgba(2,6,23,.04);
      --btnHover: rgba(2,6,23,.08);
      --chip: rgba(2,6,23,.04);
    }

    *{box-sizing:border-box}
    body{
      margin:0;
      font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Arial, "Noto Sans", "Apple Color Emoji","Segoe UI Emoji";
      background: var(--bg);
      color: var(--text);
      min-height:100vh;
      display:flex;
      align-items:center;
      justify-content:center;
      padding:20px;
    }
    .wrap{ width:min(520px, 100%); }
    .top{
      display:flex; align-items:center; justify-content:space-between; gap:12px;
      margin-bottom:14px;
    }
    .brand{
      display:flex; align-items:center; gap:10px;
      padding:10px 12px;
      background: var(--card);
      border:1px solid var(--line);
      border-radius: 16px;
      box-shadow: var(--shadow);
    }
    .logo{
      width:40px; height:40px; border-radius: 12px;
      display:grid; place-items:center;
      background: linear-gradient(135deg, var(--primary), color-mix(in srgb, var(--primary) 30%, black));
      font-weight:950;
    }
    .brand h1{ font-size:16px; margin:0; }
    .sub{ font-size:12px; color: var(--muted); margin-top:2px; }
    .btn{
      border:1px solid var(--line);
      background: var(--btn);
      color: var(--text);
      border-radius: 14px;
      padding:10px 12px;
      font-weight:900;
      cursor:pointer;
      transition:.15s;
    }
    .btn:hover{ background: var(--btnHover); }
    .card{
      background: color-mix(in srgb, var(--card) 92%, transparent);
      border:1px solid var(--line);
      border-radius: var(--radius);
      box-shadow: var(--shadow);
      overflow:hidden;
    }
    .head{
      padding:14px 14px 12px;
      background: linear-gradient(180deg, color-mix(in srgb, var(--card2) 80%, transparent), transparent);
      border-bottom:1px solid var(--line);
    }
    .body{ padding:14px; }
    label{ font-size:12px; color: var(--muted); display:block; margin:0 0 6px; }
    input{
      width:100%;
      background: var(--btn);
      border:1px solid var(--line);
      color: var(--text);
      padding:12px 12px;
      border-radius: 14px;
      outline:none;
      font-size:15px;
    }
    input:focus{ border-color: color-mix(in srgb, var(--primary) 40%, var(--line)); }
    .row{ display:grid; grid-template-columns: 1fr 1fr; gap:10px; }
    @media (max-width: 520px){
      .row{ grid-template-columns: 1fr; }
    }
    .primary{
      width:100%;
      border:none;
      background: linear-gradient(135deg, var(--primary), color-mix(in srgb, var(--primary) 25%, black));
      color:white;
      padding:12px 14px;
      border-radius: 14px;
      font-weight:950;
      cursor:pointer;
      transition:.15s;
      margin-top:6px;
    }
    .primary:disabled{
      opacity:.55;
      cursor:not-allowed;
    }
    .err{
      background: color-mix(in srgb, var(--danger) 20%, transparent);
      border:1px solid color-mix(in srgb, var(--danger) 40%, var(--line));
      color: color-mix(in srgb, var(--danger) 65%, var(--text));
      padding:10px 12px;
      border-radius: 14px;
      margin-bottom:10px;
      font-weight:800;
    }
  </style>
</head>
<body>
<div class="wrap">
  <div class="top">
    <div class="brand">
      <div class="logo">🍔</div>
      <div>
        <h1>Identificação</h1>
        <div class="sub">Mesa: <b><?= htmlspecialchars((string)$mesa) ?></b></div>
      </div>
    </div>
    <button class="btn" onclick="toggleTheme()">🌗 Tema</button>
  </div>

  <div class="card">
    <div class="head">
      <div style="font-weight:950">Informe seus dados</div>
      <?php if (!$mesaOk): ?>
        <div class="sub">Mesa inválida. Entre apenas por um QRCode válido.</div>
      <?php else: ?>
        <?php if ($mesaOcupada): ?>
          <div class="sub">🔒 Mesa ocupada (<?= (int)$ocupAtivos ?> pessoa(s)). Solicite entrada — alguém que já está na mesa precisa autorizar.</div>
        <?php else: ?>
          <div class="sub">✅ Mesa livre. Você entrará automaticamente.</div>
        <?php endif; ?>
      <?php endif; ?>
    </div>
    <div class="body">
      <?php if ($erro): ?><div class="err"><?= htmlspecialchars($erro) ?></div><?php endif; ?>

      <form method="post" style="display:grid; gap:10px">
        <div class="row">
          <div>
            <label>Seu nome</label>
            <input name="nome" placeholder="Ex: João" value="<?= h($_POST['nome'] ?? '') ?>" <?= (!$mesaOk ? 'disabled' : '') ?> required>
          </div>
          <div>
            <label>Celular</label>
            <input id="celular" name="celular" type="tel" inputmode="numeric" autocomplete="tel" placeholder="(DDD) 99999-9999" maxlength="15" value="<?= h($_POST['celular'] ?? '') ?>" <?= (!$mesaOk ? 'disabled' : '') ?> required>
          </div>
        </div>

        <button class="primary" type="submit" <?= (!$mesaOk ? 'disabled' : '') ?>>
          <?= ($mesaOk && $mesaOcupada) ? 'Solicitar entrada' : 'Entrar na mesa' ?>
        </button>
      </form>
    </div>
  </div>
</div>

<script>
function applyTheme(t){
  document.documentElement.setAttribute("data-theme", t);
  localStorage.setItem("cliente_theme", t);
}
function toggleTheme(){
  const cur = document.documentElement.getAttribute("data-theme") || "dark";
  applyTheme(cur === "dark" ? "light" : "dark");
}
(function(){
  const saved = localStorage.getItem("cliente_theme") || "dark";
  applyTheme(saved);
})();

/* Máscara automática de telefone (BR)
   - 11 dígitos: (DD) 9XXXX-XXXX
   - 10 dígitos: (DD) XXXX-XXXX
*/
function maskTelefoneBR(el){
  if (!el) return;
  let v = (el.value || "").replace(/\D/g, "");
  if (v.length > 11) v = v.slice(0, 11);

  if (v.length <= 2){
    el.value = v;
    return;
  }

  const ddd = v.slice(0,2);
  const resto = v.slice(2);

  if (v.length <= 6){
    el.value = `(${ddd}) ${resto}`;
    return;
  }

  if (v.length === 10){
    // fixo: 8 dígitos após DDD
    el.value = `(${ddd}) ${resto.slice(0,4)}-${resto.slice(4,8)}`;
    return;
  }

  // celular (padrão): 9 dígitos após DDD
  el.value = `(${ddd}) ${resto.slice(0,5)}-${resto.slice(5,9)}`;
}

(function(){
  const cel = document.getElementById('celular');
  if (cel){
    cel.addEventListener('input', ()=>maskTelefoneBR(cel));
    cel.addEventListener('blur',  ()=>maskTelefoneBR(cel));
    // aplica ao carregar (caso tenha valor preenchido)
    maskTelefoneBR(cel);
  }
})();

</script>
</body>
</html>
