<?php
declare(strict_types=1);

/**
 * /pedidos/extrato.php
 * Extrato da CONTA (mesa) — acesso por link temporário (token).
 *
 * URL: /pedidos/extrato.php?conta=123&t=TOKEN
 */

function try_require(string $path): bool {
  if (is_file($path)) { require_once $path; return true; }
  return false;
}

// tenta caminhos comuns
if (!try_require(__DIR__ . "/../includes/db.php")) {
  if (!try_require(__DIR__ . "/../../includes/db.php")) {
    http_response_code(500);
    echo "Erro: db.php não encontrado.";
    exit;
  }
}

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

function table_exists(PDO $pdo, string $table): bool {
  static $cache = [];
  if (array_key_exists($table, $cache)) return $cache[$table];
  try{
    $st = $pdo->prepare("
      SELECT COUNT(*) AS c
      FROM information_schema.tables
      WHERE table_schema = DATABASE()
        AND table_name = ?
      LIMIT 1
    ");
    $st->execute([$table]);
    $r = $st->fetch(PDO::FETCH_ASSOC);
    $cache[$table] = ((int)($r["c"] ?? 0) > 0);
  }catch(Throwable $e){
    $cache[$table] = false;
  }
  return $cache[$table];
}

function column_exists(PDO $pdo, string $table, string $col): bool {
  static $cache = [];
  $k = $table . "." . $col;
  if (array_key_exists($k, $cache)) return $cache[$k];
  try{
    $st = $pdo->prepare("
      SELECT COUNT(*) AS c
      FROM information_schema.columns
      WHERE table_schema = DATABASE()
        AND table_name = ?
        AND column_name = ?
      LIMIT 1
    ");
    $st->execute([$table, $col]);
    $r = $st->fetch(PDO::FETCH_ASSOC);
    $cache[$k] = ((int)($r["c"] ?? 0) > 0);
  }catch(Throwable $e){
    $cache[$k] = false;
  }
  return $cache[$k];
}

function money($v): string {
  $n = is_numeric($v) ? (float)$v : 0.0;
  return "R$ " . number_format($n, 2, ",", ".");
}

$contaId = (int)($_GET["conta"] ?? 0);
$token   = trim((string)($_GET["t"] ?? ""));

if ($contaId <= 0 || $token === "") {
  http_response_code(400);
  echo "Link inválido.";
  exit;
}

if (!table_exists($pdo, "conta_extratos")) {
  http_response_code(403);
  echo "Link de extrato inválido ou expirado.";
  exit;
}

// ✅ valida token
$st = $pdo->prepare("
  SELECT id, expira_em
  FROM conta_extratos
  WHERE conta_id = ?
    AND token = ?
    AND expira_em >= NOW()
  LIMIT 1
");
$st->execute([$contaId, $token]);
$linkRow = $st->fetch(PDO::FETCH_ASSOC);

if (!$linkRow) {
  http_response_code(403);
  echo "Link de extrato inválido ou expirado.";
  exit;
}

// marca usado (best-effort)
try{
  $pdo->prepare("UPDATE conta_extratos SET usado_em = COALESCE(usado_em, NOW()) WHERE id=?")
      ->execute([(int)$linkRow["id"]]);
}catch(Throwable $e){}

// ===================== Dados da conta/mesa =====================
$mesa = "-";
$statusConta = "";
if (table_exists($pdo, "contas") && table_exists($pdo, "mesas") && column_exists($pdo, "contas", "mesa_id")) {
  $st = $pdo->prepare("
    SELECT c.id, c.status, m.numero AS mesa
    FROM contas c
    JOIN mesas m ON m.id = c.mesa_id
    WHERE c.id=?
    LIMIT 1
  ");
  $st->execute([$contaId]);
  $c = $st->fetch(PDO::FETCH_ASSOC) ?: null;
  if ($c) {
    $mesa = (string)($c["mesa"] ?? "-");
    $statusConta = (string)($c["status"] ?? "");
  }
}

// ===================== Pedidos (itens) =====================
$itens = [];
$totalEntregue = 0.0;
$totalAndamento = 0.0;

if (table_exists($pdo, "pedidos") && table_exists($pdo, "pedido_itens")) {
  $qtdCol   = column_exists($pdo, "pedido_itens", "qtd") ? "qtd" : (column_exists($pdo, "pedido_itens", "quantidade") ? "quantidade" : "");
  $precoCol = column_exists($pdo, "pedido_itens", "preco_unit") ? "preco_unit" : (column_exists($pdo, "pedido_itens", "preco") ? "preco" : "");

  $hasNomeItem = column_exists($pdo, "pedido_itens", "nome") || column_exists($pdo, "pedido_itens", "produto_nome");
  $nomeCol = column_exists($pdo, "pedido_itens", "nome") ? "nome" : (column_exists($pdo, "pedido_itens", "produto_nome") ? "produto_nome" : "");

  $hasProdutoId = column_exists($pdo, "pedido_itens", "produto_id");
  $hasProdutos  = table_exists($pdo, "produtos") && column_exists($pdo, "produtos", "nome");

  $dateCol = column_exists($pdo, "pedidos", "criado_em") ? "criado_em" : (column_exists($pdo, "pedidos", "created_at") ? "created_at" : "");

  $selectDate = $dateCol ? "p.$dateCol AS criado_em," : "";
  $selectNome = $hasNomeItem ? "i.$nomeCol AS item_nome," : ($hasProdutoId && $hasProdutos ? "pr.nome AS item_nome," : "'' AS item_nome,");
  $joinProd   = ($hasProdutoId && $hasProdutos) ? "LEFT JOIN produtos pr ON pr.id = i.produto_id" : "";

  if ($qtdCol && $precoCol) {
    $sql = "
      SELECT
        p.id AS pedido_id,
        p.status AS pedido_status,
        $selectDate
        i.$qtdCol AS qtd,
        i.$precoCol AS preco_unit,
        $selectNome
        (i.$qtdCol * i.$precoCol) AS subtotal
      FROM pedidos p
      JOIN pedido_itens i ON i.pedido_id = p.id
      $joinProd
      WHERE p.conta_id = ?
        AND p.status NOT IN ('CANCELADO','RECUSADO')
      ORDER BY p.id DESC
    ";
    $st = $pdo->prepare($sql);
    $st->execute([$contaId]);
    $rows = $st->fetchAll(PDO::FETCH_ASSOC);

    foreach ($rows as $r) {
      $status = (string)($r["pedido_status"] ?? "");
      $sub = (float)($r["subtotal"] ?? 0);
      if ($status === "ENTREGUE") $totalEntregue += $sub;
      if (in_array($status, ["ENVIADO","ACEITO","EM_PREPARO"], true)) $totalAndamento += $sub;

      $itens[] = [
        "pedido_id" => (int)($r["pedido_id"] ?? 0),
        "status" => $status,
        "criado_em" => (string)($r["criado_em"] ?? ""),
        "nome" => (string)($r["item_nome"] ?? "Item"),
        "qtd" => (float)($r["qtd"] ?? 0),
        "preco" => (float)($r["preco_unit"] ?? 0),
        "subtotal" => $sub,
      ];
    }
  }
}

// ===================== Avulsos (lancamentos) =====================
$avulsos = [];
$totalAvulsos = 0.0;

if (table_exists($pdo, "lancamentos")) {
  $st = $pdo->prepare("
    SELECT descricao, valor, criado_em
    FROM lancamentos
    WHERE conta_id = ?
      AND status = 'CONFIRMADO'
    ORDER BY id DESC
  ");
  $st->execute([$contaId]);
  foreach ($st->fetchAll(PDO::FETCH_ASSOC) as $r) {
    $v = (float)($r["valor"] ?? 0);
    $totalAvulsos += $v;
    $avulsos[] = [
      "descricao" => (string)($r["descricao"] ?? ""),
      "valor" => $v,
      "criado_em" => (string)($r["criado_em"] ?? ""),
    ];
  }
}

// ===================== Pagamentos =====================
$pagamentos = [];
$totalPago = 0.0;

if (table_exists($pdo, "pagamentos")) {
  $st = $pdo->prepare("
    SELECT valor, metodo, confirmado_em
    FROM pagamentos
    WHERE conta_id = ?
      AND status = 'CONFIRMADO'
    ORDER BY id DESC
  ");
  $st->execute([$contaId]);
  foreach ($st->fetchAll(PDO::FETCH_ASSOC) as $r) {
    $v = (float)($r["valor"] ?? 0);
    $totalPago += $v;
    $pagamentos[] = [
      "metodo" => (string)($r["metodo"] ?? ""),
      "valor" => $v,
      "confirmado_em" => (string)($r["confirmado_em"] ?? ""),
    ];
  }
}

$totalFatura = ($totalEntregue + $totalAvulsos);
$saldoFatura = ($totalFatura - $totalPago);

?>
<!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>Extrato • Mesa <?=h($mesa)?></title>
  <style>
    :root{
      --bg:#0f0f10;
      --text:#f3f3f3;
      --muted:rgba(243,243,243,.70);

      --card:rgba(32,32,34,.92);
      --input:rgba(18,18,20,.92);

      --line:rgba(255,255,255,.12);
      --line2:rgba(255,255,255,.08);

      --accent:#60cdff;
      --danger:#ff5a5f;
      --ok:#22c55e;
      --warn:#f59e0b;

      --radius:18px;
      --tap:48px;
    }

    *{ box-sizing:border-box }
    body{
      margin:0;
      background:var(--bg);
      color:var(--text);
      font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial;
      padding:16px;
    }
    .wrap{ max-width:980px; margin:0 auto; }

    .top{
      border:1px solid var(--line2);
      background:var(--card);
      border-radius: var(--radius);
      padding:14px;
      display:flex;
      gap:12px;
      align-items:center;
      justify-content:space-between;
      flex-wrap:wrap;
    }

    .title b{ display:block; font-size:16px; letter-spacing:.2px }
    .title span{ display:block; color:var(--muted); font-size:12px; margin-top:4px }

    .pill{
      display:inline-flex;
      align-items:center;
      justify-content:center;
      gap:8px;
      padding:7px 10px;
      border-radius:999px;
      border:1px solid var(--line);
      background: rgba(255,255,255,.04);
      font-size:12px;
      font-weight:900;
      white-space:nowrap;
    }
    .pill.ok{ border-color: rgba(34,197,94,.45); color:#bff7d2 }
    .pill.warn{ border-color: rgba(245,158,11,.45); color:#ffe7b8 }
    .pill.danger{ border-color: rgba(255,90,95,.45); color:#ffd2d2 }

    .grid{
      margin-top:12px;
      display:grid;
      grid-template-columns: 1fr;
      gap:12px;
    }

    .card{
      border:1px solid var(--line2);
      background:var(--card);
      border-radius: var(--radius);
      padding:14px;
    }
    .card h2{
      margin:0;
      font-size:14px;
      font-weight:950;
      letter-spacing:.2px;
    }
    .sub{ color:var(--muted); font-size:12px; margin-top:6px }

    .rows{ margin-top:10px; display:flex; flex-direction:column; gap:10px; }
    .row{
      border:1px solid var(--line2);
      background: rgba(255,255,255,.03);
      border-radius: 16px;
      padding:12px;
      display:flex;
      gap:10px;
      justify-content:space-between;
      align-items:flex-start;
    }
    .row .left{ min-width:0; }
    .row b{ font-size:13px; font-weight:950; display:block; }
    .row .meta{ color:var(--muted); font-size:12px; margin-top:6px; line-height:1.35 }
    .row .val{ font-weight:950; white-space:nowrap; }

    .tot{
      margin-top:10px;
      border-top:1px solid var(--line2);
      padding-top:10px;
      display:flex;
      gap:10px;
      flex-wrap:wrap;
      justify-content:space-between;
      align-items:flex-end;
    }
    .tot .k{ color:var(--muted); font-size:12px }
    .tot .v{ font-weight:950; font-size:18px; letter-spacing:.2px }

    .footer{
      margin-top:14px;
      color: rgba(243,243,243,.55);
      font-size:12px;
      text-align:center;
    }

    @media (max-width:520px){
      body{ padding:12px; }
      .row{ flex-direction:column; }
      .row .val{ align-self:flex-end; }
      .tot .v{ font-size:16px; }
    }
  </style>
</head>
<body>
  <div class="wrap">
    <div class="top">
      <div class="title">
        <b>Extrato da Mesa <?=h($mesa)?></b>
        <span>Conta #<?=h($contaId)?> <?= $statusConta ? "• " . h($statusConta) : "" ?></span>
      </div>

      <?php
        $pillClass = "warn";
        $pillText  = "Em aberto";
        if ($statusConta === "FECHADA") { $pillClass="ok"; $pillText="Conta encerrada"; }
        if ($saldoFatura > 0.01) { $pillClass="danger"; $pillText="Saldo pendente"; }
      ?>
      <div class="pill <?=$pillClass?>"><?=h($pillText)?> • <?=h(money($saldoFatura))?></div>
    </div>

    <div class="grid">
      <div class="card">
        <h2>🍽️ Itens do consumo</h2>
        <div class="sub">Pedidos (entregues e em andamento). Valores em andamento não entram no total da fatura.</div>

        <div class="rows">
          <?php if (!$itens): ?>
            <div class="sub">Nenhum item encontrado.</div>
          <?php else: ?>
            <?php foreach ($itens as $r): ?>
              <div class="row">
                <div class="left">
                  <b><?=h($r["nome"] ?: "Item")?></b>
                  <div class="meta">
                    <?=h($r["status"])?>
                    • <?=h((string)$r["qtd"])?> × <?=h(money($r["preco"]))?>
                    <?php if ($r["criado_em"]): ?> • <?=h($r["criado_em"])?><?php endif; ?>
                  </div>
                </div>
                <div class="val"><?=h(money($r["subtotal"]))?></div>
              </div>
            <?php endforeach; ?>
          <?php endif; ?>
        </div>

        <div class="tot">
          <div>
            <div class="k">Pedidos entregues</div>
            <div class="v"><?=h(money($totalEntregue))?></div>
          </div>
          <div style="text-align:right">
            <div class="k">Em andamento</div>
            <div class="v" style="font-size:14px; color:var(--muted)"><?=h(money($totalAndamento))?></div>
          </div>
        </div>
      </div>

      <div class="card">
        <h2>🧾 Lançamentos avulsos</h2>
        <div class="sub">Taxas/itens lançados manualmente (confirmados).</div>

        <div class="rows">
          <?php if (!$avulsos): ?>
            <div class="sub">Nenhum lançamento avulso.</div>
          <?php else: ?>
            <?php foreach ($avulsos as $r): ?>
              <div class="row">
                <div class="left">
                  <b><?=h($r["descricao"] ?: "Lançamento")?></b>
                  <div class="meta"><?=h($r["criado_em"] ?: "")?></div>
                </div>
                <div class="val"><?=h(money($r["valor"]))?></div>
              </div>
            <?php endforeach; ?>
          <?php endif; ?>
        </div>

        <div class="tot">
          <div>
            <div class="k">Total avulsos</div>
            <div class="v"><?=h(money($totalAvulsos))?></div>
          </div>
        </div>
      </div>

      <div class="card">
        <h2>💳 Pagamentos</h2>
        <div class="sub">Pagamentos confirmados para esta conta.</div>

        <div class="rows">
          <?php if (!$pagamentos): ?>
            <div class="sub">Nenhum pagamento registrado.</div>
          <?php else: ?>
            <?php foreach ($pagamentos as $r): ?>
              <div class="row">
                <div class="left">
                  <b><?=h($r["metodo"] ?: "Pagamento")?></b>
                  <div class="meta"><?=h($r["confirmado_em"] ?: "")?></div>
                </div>
                <div class="val">- <?=h(money($r["valor"]))?></div>
              </div>
            <?php endforeach; ?>
          <?php endif; ?>
        </div>

        <div class="tot">
          <div>
            <div class="k">Total pago</div>
            <div class="v"><?=h(money($totalPago))?></div>
          </div>
        </div>
      </div>

      <div class="card">
        <h2>📌 Resumo</h2>
        <div class="sub">Total da fatura = pedidos entregues + avulsos.</div>

        <div class="tot">
          <div>
            <div class="k">Total fatura</div>
            <div class="v"><?=h(money($totalFatura))?></div>
          </div>
          <div style="text-align:right">
            <div class="k">Saldo</div>
            <div class="v" style="<?=($saldoFatura>0.01?'color:var(--danger)':'color:var(--ok)')?>"><?=h(money($saldoFatura))?></div>
          </div>
        </div>
      </div>
    </div>

    <div class="footer">© <?=date('Y')?> • Extrato da Mesa</div>
  </div>
</body>
</html>
