<?php
require 'config.php';
require 'trade_engine.php';

date_default_timezone_set('America/Sao_Paulo');

if (!isset($_SESSION['user'])) {
    header("Location: login.php");
    exit;
}

$userId = (int)$_SESSION['user'];

$stmt = $conn->prepare("SELECT id, nome, saldo FROM users WHERE id=? LIMIT 1");
$stmt->execute([$userId]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$user) {
    header("Location: logout.php");
    exit;
}

// fecha expirados do próprio usuário ao carregar a página
trade_settle_expired($conn, $userId);

$erro = null;
$sucesso = null;
$assets = trade_get_assets();
$payoutPadrao = 80.00;

if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'open_trade') {
    $ativo = trim($_POST['ativo'] ?? '');
    $direcao = trim($_POST['direcao'] ?? '');
    $tempo = (int)($_POST['tempo_minutos'] ?? 0);
    $valor = (float)str_replace(',', '.', $_POST['valor'] ?? '0');

    if (!isset($assets[$ativo])) {
        $erro = "Ativo inválido.";
    } elseif (!in_array($direcao, ['up', 'down'], true)) {
        $erro = "Direção inválida.";
    } elseif (!in_array($tempo, [1, 5], true)) {
        $erro = "Tempo inválido.";
    } elseif ($valor <= 0) {
        $erro = "Informe um valor válido.";
    } else {
        $saldoAtual = (float)$user['saldo'];
        $maxPorSaldo = floor(($saldoAtual * 0.20) * 100) / 100;
        $maxEntrada = min(300, $maxPorSaldo);

        if ($valor < 10) {
            $erro = "Valor mínimo por operação: R$ 10,00.";
        } elseif ($maxEntrada < 10) {
            $erro = "Seu saldo está baixo para abrir operações.";
        } elseif ($valor > $maxEntrada) {
            $erro = "Máximo permitido no momento: R$ " . number_format($maxEntrada, 2, ',', '.');
        } elseif ($saldoAtual < $valor) {
            $erro = "Saldo insuficiente.";
        }
    }

    if (!$erro) {
        // máximo de 2 abertas
        $st = $conn->prepare("SELECT COUNT(*) FROM trades WHERE user_id=? AND status='aberta'");
        $st->execute([$userId]);
        $abertas = (int)$st->fetchColumn();

        if ($abertas >= 5) {
            $erro = "Você já possui 2 operações abertas.";
        }
    }

    if (!$erro) {
        // cooldown 8 segundos
        $st = $conn->prepare("
            SELECT criado_em
            FROM trades
            WHERE user_id=?
            ORDER BY id DESC
            LIMIT 1
        ");
        $st->execute([$userId]);
        $lastTradeAt = $st->fetchColumn();

        if ($lastTradeAt) {
            $diff = time() - strtotime($lastTradeAt);
            if ($diff < 8) {
                $erro = "Aguarde alguns segundos para abrir nova operação.";
            }
        }
    }

    if (!$erro) {
        $precoEntrada = trade_get_entry_price($ativo);
        $criadoEm = date('Y-m-d H:i:s');
        $expiraEm = date('Y-m-d H:i:s', time() + ($tempo * 60));

        try {
            $conn->beginTransaction();

            $lockUser = $conn->prepare("SELECT saldo FROM users WHERE id=? FOR UPDATE");
            $lockUser->execute([$userId]);
            $saldoLocked = (float)$lockUser->fetchColumn();

            if ($saldoLocked < $valor) {
                throw new Exception("Saldo insuficiente.");
            }

            $upSaldo = $conn->prepare("UPDATE users SET saldo = saldo - ? WHERE id=? LIMIT 1");
            $upSaldo->execute([$valor, $userId]);

            $in = $conn->prepare("
                INSERT INTO trades
                (user_id, ativo, direcao, tempo_minutos, valor_entrada, payout_percent, preco_entrada, criado_em, expira_em, resultado, status)
                VALUES
                (?, ?, ?, ?, ?, ?, ?, ?, ?, 'pendente', 'aberta')
            ");
            $in->execute([
                $userId,
                $ativo,
                $direcao,
                $tempo,
                $valor,
                $payoutPadrao,
                $precoEntrada,
                $criadoEm,
                $expiraEm
            ]);

            $conn->commit();
            header("Location: trade.php?ok=1");
            exit;
        } catch (Exception $e) {
            if ($conn->inTransaction()) $conn->rollBack();
            $erro = "Erro ao abrir operação: " . $e->getMessage();
        }
    }
}

if (isset($_GET['ok']) && $_GET['ok'] === '1') {
    $sucesso = "Operação aberta com sucesso.";
}

$stmt = $conn->prepare("SELECT id, nome, saldo FROM users WHERE id=? LIMIT 1");
$stmt->execute([$userId]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

$openTrades = [];
try {
    $st = $conn->prepare("
        SELECT *
        FROM trades
        WHERE user_id=? AND status='aberta'
        ORDER BY id DESC
    ");
    $st->execute([$userId]);
    $openTrades = $st->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {}

$history = [];
try {
    $st = $conn->prepare("
        SELECT *
        FROM trades
        WHERE user_id=? AND status='fechada'
        ORDER BY id DESC
        LIMIT 20
    ");
    $st->execute([$userId]);
    $history = $st->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {}
?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Trade</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
*{box-sizing:border-box}
:root{
  --bg:#050607;
  --card:#0b1018;
  --card2:#121926;
  --text:#f8fafc;
  --muted:#9ca3af;
  --border:rgba(212,175,55,.16);
  --gold:#d4af37;
  --gold2:#f6e6a9;
  --green:#22c55e;
  --red:#ef4444;
}
body{
  margin:0;
  background:
    radial-gradient(circle at top left, rgba(212,175,55,.08), transparent 24%),
    linear-gradient(180deg,#030405 0%, #090c11 100%);
  color:var(--text);
  font-family:Arial,sans-serif;
}
.container{
  max-width:460px;
  margin:0 auto;
  padding:14px 14px 30px;
}
.top{
  display:flex;
  justify-content:space-between;
  align-items:center;
  margin-bottom:14px;
}
.back,.history-link{
  text-decoration:none;
  color:#111;
  background:linear-gradient(135deg,var(--gold),var(--gold2));
  padding:10px 14px;
  border-radius:14px;
  font-weight:900;
}
.title{
  color:var(--gold2);
  font-size:18px;
  font-weight:1000;
}
.card{
  background:linear-gradient(145deg,#0b1018,#121926);
  border:1px solid var(--border);
  border-radius:22px;
  padding:14px;
  margin-bottom:14px;
}
.balance{
  text-align:center;
  margin-bottom:12px;
}
.balance .v{
  font-size:30px;
  color:var(--gold2);
  font-weight:1000;
}
.balance .s{
  color:var(--muted);
  font-size:12px;
  font-weight:800;
}
.select, .input{
  width:100%;
  padding:13px 14px;
  border-radius:14px;
  border:1px solid rgba(255,255,255,.08);
  background:#0b1018;
  color:#fff;
  margin-top:8px;
}
.label{
  margin-top:10px;
  color:var(--muted);
  font-size:12px;
  font-weight:800;
}
.grid2{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:10px;
}
.grid3{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:10px;
  margin-top:8px;
}
.btn-time{
  padding:12px;
  border-radius:14px;
  background:#111827;
  border:1px solid rgba(255,255,255,.08);
  color:#fff;
  font-weight:900;
  cursor:pointer;
}
.btn-time.active{
  border-color:rgba(212,175,55,.30);
  color:var(--gold2);
}
.chart{
  height:170px;
  border-radius:18px;
  margin:12px 0;
  background:linear-gradient(180deg,#0a1322,#0f172a);
  border:1px solid rgba(255,255,255,.06);
  padding:10px;
}
.actions{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:10px;
  margin-top:12px;
}
.btn-up,.btn-down{
  padding:15px;
  border:none;
  border-radius:16px;
  color:#fff;
  font-weight:1000;
  cursor:pointer;
}
.btn-up{background:linear-gradient(135deg,#15803d,#22c55e)}
.btn-down{background:linear-gradient(135deg,#b91c1c,#ef4444)}
.alert{
  padding:12px;
  border-radius:14px;
  font-weight:900;
  text-align:center;
  margin-bottom:12px;
}
.alert.error{
  background:rgba(239,68,68,.08);
  color:#fecaca;
  border:1px solid rgba(239,68,68,.18);
}
.alert.success{
  background:rgba(34,197,94,.08);
  color:#bbf7d0;
  border:1px solid rgba(34,197,94,.18);
}
.trade-item{
  padding:12px;
  border-radius:16px;
  background:rgba(255,255,255,.03);
  border:1px solid rgba(255,255,255,.06);
  margin-bottom:10px;
}
.row{
  display:flex;
  justify-content:space-between;
  gap:10px;
  margin-top:6px;
  font-size:13px;
}
.muted{color:var(--muted)}
.win{color:#86efac;font-weight:1000}
.loss{color:#fca5a5;font-weight:1000}
.pending{color:var(--gold2);font-weight:1000}
small.badge{
  display:inline-block;
  padding:5px 8px;
  border-radius:999px;
  background:rgba(212,175,55,.08);
  color:var(--gold2);
  border:1px solid rgba(212,175,55,.16);
  font-weight:900;
}
</style>
</head>
<body>
<div class="container">

  <div class="top">
    <a href="dashboard.php" class="back">Voltar</a>
    <div class="title">Quick Trade</div>
    <a href="#historico" class="history-link">Histórico</a>
  </div>

  <div class="card">
    <div class="balance">
      <div class="v">R$ <?= number_format((float)$user['saldo'], 2, ',', '.') ?></div>
      <div class="s">Saldo disponível</div>
    </div>

    <?php if ($erro): ?>
      <div class="alert error"><?= htmlspecialchars($erro) ?></div>
    <?php endif; ?>

    <?php if ($sucesso): ?>
      <div class="alert success"><?= htmlspecialchars($sucesso) ?></div>
    <?php endif; ?>

    <form method="post" id="tradeForm">
      <input type="hidden" name="action" value="open_trade">
      <input type="hidden" name="direcao" id="direcaoInput">
      <input type="hidden" name="tempo_minutos" id="tempoInput" value="1">

      <div class="label">Ativo</div>
      <select name="ativo" class="select" id="ativoSelect">
        <?php foreach ($assets as $key => $asset): ?>
          <option value="<?= htmlspecialchars($key) ?>"><?= htmlspecialchars($asset['nome']) ?> (<?= htmlspecialchars($key) ?>)</option>
        <?php endforeach; ?>
      </select>

      <div class="chart">
        <svg id="tradeChart" viewBox="0 0 320 140" width="100%" height="100%" preserveAspectRatio="none">
          <defs>
            <linearGradient id="lineGold" x1="0" y1="0" x2="1" y2="0">
              <stop offset="0%" stop-color="#f6e6a9"/>
              <stop offset="100%" stop-color="#d4af37"/>
            </linearGradient>
          </defs>
          <path id="chartPath" d="" fill="none" stroke="url(#lineGold)" stroke-width="3" stroke-linecap="round"/>
        </svg>
      </div>

      <div class="label">Tempo</div>
      <div class="grid2">
        <button type="button" class="btn-time active" data-time="1">1 minuto</button>
        <button type="button" class="btn-time" data-time="5">5 minutos</button>
      </div>

      <div class="label">Valor da entrada</div>
      <input type="number" step="0.01" min="10" name="valor" class="input" placeholder="Digite o valor" required>

      <div class="label">Regras</div>
      <div class="grid3">
        <div class="trade-item" style="text-align:center">
          <div class="muted">Payout</div>
          <div><small class="badge">80%</small></div>
        </div>
        <div class="trade-item" style="text-align:center">
          <div class="muted">Mínimo</div>
          <div><small class="badge">R$ 10</small></div>
        </div>
        <div class="trade-item" style="text-align:center">
          <div class="muted">Máx.</div>
          <div><small class="badge">R$ 300</small></div>
        </div>
      </div>

      <div class="actions">
        <button type="button" class="btn-up" onclick="abrirTrade('up')">SUBIR</button>
        <button type="button" class="btn-down" onclick="abrirTrade('down')">DESCER</button>
      </div>
    </form>
  </div>

  <div class="card">
    <div class="title" style="font-size:16px;margin-bottom:12px;">Operações abertas</div>
    <?php if (!$openTrades): ?>
      <div class="muted">Nenhuma operação aberta.</div>
    <?php endif; ?>

    <?php foreach ($openTrades as $t): ?>
      <?php $rest = max(0, strtotime($t['expira_em']) - time()); ?>
      <div class="trade-item" data-rest="<?= (int)$rest ?>">
        <div class="row">
          <strong><?= htmlspecialchars($t['ativo']) ?></strong>
          <small class="badge"><?= $t['direcao'] === 'up' ? 'SUBIR' : 'DESCER' ?></small>
        </div>
        <div class="row">
          <span class="muted">Entrada</span>
          <span>R$ <?= number_format((float)$t['valor_entrada'], 2, ',', '.') ?></span>
        </div>
        <div class="row">
          <span class="muted">Expira</span>
          <span class="pending countdown">--:--</span>
        </div>
      </div>
    <?php endforeach; ?>
  </div>

  <div class="card" id="historico">
    <div class="title" style="font-size:16px;margin-bottom:12px;">Histórico</div>
    <?php if (!$history): ?>
      <div class="muted">Nenhuma operação fechada ainda.</div>
    <?php endif; ?>

    <?php foreach ($history as $t): ?>
      <div class="trade-item">
        <div class="row">
          <strong><?= htmlspecialchars($t['ativo']) ?></strong>
          <small class="badge"><?= $t['direcao'] === 'up' ? 'SUBIR' : 'DESCER' ?> • <?= (int)$t['tempo_minutos'] ?>m</small>
        </div>
        <div class="row">
          <span class="muted">Entrada</span>
          <span>R$ <?= number_format((float)$t['valor_entrada'], 2, ',', '.') ?></span>
        </div>
        <div class="row">
          <span class="muted">Resultado</span>
          <span class="<?= $t['resultado'] === 'ganhou' ? 'win' : 'loss' ?>">
            <?= $t['resultado'] === 'ganhou' ? 'GANHOU' : 'PERDEU' ?>
          </span>
        </div>
        <div class="row">
          <span class="muted">Retorno</span>
          <span><?= number_format((float)$t['retorno_total'], 2, ',', '.') ?></span>
        </div>
      </div>
    <?php endforeach; ?>
  </div>

</div>

<script>
const timeButtons = document.querySelectorAll('.btn-time');
const tempoInput = document.getElementById('tempoInput');
timeButtons.forEach(btn => {
  btn.addEventListener('click', () => {
    timeButtons.forEach(b => b.classList.remove('active'));
    btn.classList.add('active');
    tempoInput.value = btn.dataset.time;
  });
});

function abrirTrade(direcao){
  document.getElementById('direcaoInput').value = direcao;
  document.getElementById('tradeForm').submit();
}

// gráfico simulado
(function(){
  const path = document.getElementById('chartPath');
  if (!path) return;

  let points = [];
  let y = 78;

  for (let i = 0; i < 28; i++) {
    y += (Math.random() * 16 - 8);
    if (y < 20) y = 20;
    if (y > 120) y = 120;
    points.push({x: 5 + i * 11.5, y});
  }

  function draw(){
    let d = '';
    points.forEach((p, i) => {
      d += (i === 0 ? `M ${p.x} ${p.y}` : ` L ${p.x} ${p.y}`);
    });
    path.setAttribute('d', d);
  }

  function tick(){
    points.shift();
    let last = points[points.length - 1].y;
    let next = last + (Math.random() * 18 - 9);
    if (next < 20) next = 20;
    if (next > 120) next = 120;
    points.push({x: points[points.length - 1].x + 11.5, y: next});
    points = points.map((p, i) => ({x: 5 + i * 11.5, y: p.y}));
    draw();
  }

  draw();
  setInterval(tick, 900);
})();

// countdown
document.querySelectorAll('.trade-item[data-rest]').forEach(card => {
  let rest = parseInt(card.dataset.rest || '0', 10);
  const el = card.querySelector('.countdown');
  if (!el) return;

  function update(){
    if (rest <= 0) {
      el.textContent = 'Fechando...';
      return;
    }
    const m = Math.floor(rest / 60);
    const s = rest % 60;
    el.textContent = String(m).padStart(2, '0') + ':' + String(s).padStart(2, '0');
    rest--;
  }

  update();
  setInterval(update, 1000);
});
</script>
</body>
</html>