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

header("Content-Type: application/json; charset=utf-8");

function jexit($ok, $data = [], $http = 200){
  http_response_code($http);
  echo json_encode(array_merge(["ok"=>$ok], $data), JSON_UNESCAPED_UNICODE);
  exit;
}

function getParam($k, $default=null){
  return isset($_GET[$k]) ? trim((string)$_GET[$k]) : $default;
}

$action = getParam("action", "");
$codigo = getParam("c", "");


if ($action === "") jexit(false, ["error"=>"Ação inválida."], 400);
if ($codigo === "") jexit(false, ["error"=>"Cartão não informado."], 400);

try {
  /**
   * REGRA: extrato só para cartão ATIVO (EM_USO)
   * Quando fecha, você muda status para LIVRE e preenche fechado_em.
   * Então basta validar status='EM_USO' (sem fechado_em).
   */
  $sql = "SELECT id, codigo, status, nome, celular, mesa, aberto_em, fechado_em, atualizado_em
          FROM cartoes
          WHERE codigo = ?
            AND status = 'EM_USO'
          LIMIT 1";
  $st = $pdo->prepare($sql);
  $st->execute([$codigo]);
  $cartao = $st->fetch(PDO::FETCH_ASSOC);

  if (!$cartao) {
    jexit(false, ["error"=>"Cartão não está ativo. Para ver o extrato, o cartão precisa estar em uso."], 403);
  }

  // Se existir token no banco, exige token na URL
  if (!empty($cartao["token"])) {
    if ($token === "" || !hash_equals((string)$cartao["token"], (string)$token)) {
      jexit(false, ["error"=>"Acesso não autorizado."], 403);
    }
  }

  if ($action === "info") {
    $st2 = $pdo->prepare("
        SELECT
            COALESCE(SUM(CASE WHEN operacao='C' THEN valor ELSE 0 END),0) AS creditos,
            COALESCE(SUM(CASE WHEN operacao='E' THEN valor ELSE 0 END),0) AS estornos,
            COALESCE(SUM(CASE WHEN operacao='D' THEN valor ELSE 0 END),0) AS debitos
        FROM cartao_movimentos
        WHERE cartao_id = ?
            AND criado_em >= ?
        ");
        $st2->execute([(int)$cartao["id"], $cartao["aberto_em"]]);
        $s = $st2->fetch(PDO::FETCH_ASSOC);

        $creditos = (float)$s["creditos"];   // NÃO inclui estorno
        $estornos = (float)$s["estornos"];   // separado
        $debitos  = (float)$s["debitos"]-$estornos;

        $saldo = $creditos + $estornos - ($debitos+$estornos);


    jexit(true, [
      "cartao" => [
        "id" => (int)$cartao["id"],
        "codigo" => $cartao["codigo"],
        "status" => $cartao["status"],
        "nome" => $cartao["nome"],
        "celular" => $cartao["celular"],
        "mesa" => $cartao["mesa"] ? (int)$cartao["mesa"] : null,
        "aberto_em" => $cartao["aberto_em"],
        "fechado_em" => $cartao["fechado_em"],
        "atualizado_em" => $cartao["atualizado_em"],
      ],
      "saldo" => [
            "creditos" => round($creditos, 2),
            "estornos" => round($estornos, 2),
            "debitos"  => round($debitos, 2),
            "saldo"    => round($saldo, 2),
           ]
    ]);
  }

  if ($action === "extrato") {
    $limit = (int)getParam("limit", 60);
    if ($limit < 10) $limit = 10;
    if ($limit > 200) $limit = 200;

    $st3 = $pdo->prepare("
        SELECT id, ref_mov_id, operacao, motivo, valor, origem, criado_em
        FROM cartao_movimentos
        WHERE cartao_id = ?
            AND criado_em >= ?
        ORDER BY criado_em DESC, id DESC
        LIMIT $limit
        ");
    $st3->execute([(int)$cartao["id"], $cartao["aberto_em"]]);
    $rows = $st3->fetchAll(PDO::FETCH_ASSOC);

    foreach ($rows as &$r) {
      $r["id"] = (int)$r["id"];
      $r["ref_mov_id"] = $r["ref_mov_id"] !== null ? (int)$r["ref_mov_id"] : null;
      $r["valor"] = round((float)$r["valor"], 2);
    }

    jexit(true, ["itens" => $rows]);
  }

  jexit(false, ["error"=>"Ação desconhecida."], 400);

} catch (Throwable $e) {
  jexit(false, ["error"=>"Erro interno: " . $e->getMessage()], 500);
}
