<?php
// =============================================================
// POSITIONS — открытые позиции + watching (вынесено с дашборда)
// =============================================================

require_once __DIR__ . '/../config.php';
require_once __DIR__ . '/auth.php';

require_auth();

if (isset($_GET['logout'])) {
    logout();
    header('Location: login.php');
    exit;
}

if (!function_exists('bot_log')) {
    function bot_log(string $message): void {}
}

require_once __DIR__ . '/../price_fetcher.php';
require_once __DIR__ . '/../balance_tracker.php';
require_once __DIR__ . '/data.php';
require_once __DIR__ . '/lib/render.php';
require_once __DIR__ . '/lib/layout.php';

$walletsConfig = load_wallets_config();
$wallets = $walletsConfig['wallets'];
$walletAddressById = array_column($wallets, 'address', 'id');

$selectedWalletId = $_GET['wallet'] ?? 'all';
if ($selectedWalletId !== 'all' && !isset($walletAddressById[$selectedWalletId])) {
    $selectedWalletId = 'all';
}
$filterWalletId = ($selectedWalletId === 'all') ? null : $selectedWalletId;

// Фильтр «Только ★»: показывать позиции только трейдеров с рейтингом.
// По умолчанию включён; hidden-поле starred=0 в форме позволяет явно снять.
$onlyStarred = ($_GET['starred'] ?? '1') === '1';

// Точечное снятие watching (PRG: F5 не повторяет POST)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'remove_watching') {
    csrf_verify();
    $wWalletId = $_POST['wallet_id'] ?? '';
    $wSymbol   = $_POST['symbol'] ?? '';
    if ($wWalletId !== '' && $wSymbol !== '') {
        storage_remove_watching('wallet', $wWalletId, $wSymbol);
    }
    $qsParams = [];
    if ($filterWalletId !== null) $qsParams['wallet'] = $filterWalletId;
    if (!$onlyStarred) $qsParams['starred'] = '0';
    $qs = $qsParams ? '?' . http_build_query($qsParams) : '';
    header('Location: positions.php' . $qs . '#watching');
    exit;
}

$openPositions = load_open_positions($wallets, $filterWalletId);
$unrealized    = calculate_unrealized_pnl($openPositions);
$watching      = load_watching_positions($wallets, $filterWalletId);

if ($onlyStarred) {
    $unrealized = array_values(array_filter($unrealized, fn($p) => (int) ($p['wallet_rating'] ?? 0) > 0));
}

// Дефолтный порядок: по uPnL % от самой убыточной к самой прибыльной,
// позиции без текущей цены (pnl_pct = null) — в конце списка.
usort($unrealized, function (array $a, array $b): int {
    if ($a['pnl_pct'] === null || $b['pnl_pct'] === null) {
        return ($a['pnl_pct'] === null ? 1 : 0) <=> ($b['pnl_pct'] === null ? 1 : 0);
    }
    return $a['pnl_pct'] <=> $b['pnl_pct'];
});

$unrealizedTotal = array_sum(array_map(fn($p) => (float) ($p['pnl_usd'] ?? 0), $unrealized));
$posSizeTotal    = array_sum(array_map(fn($p) => (float) ($p['size_usd'] ?? 0), $unrealized));
// Взвешенный итоговый uPnL % — доходность на весь задействованный капитал
$unrealizedTotalPct = $posSizeTotal > 0 ? $unrealizedTotal / $posSizeTotal * 100 : null;

// Единая модель отображения открытых позиций: тепловая таблица (десктоп)
// и карточки (мобайл) читают из одного массива, чтобы верстка не расходилась.
// barPct — длина полосы uPnL относительно максимального |PnL %| в наборе,
// поэтому прибыль/убыток видно сканированием, без чтения цифр.
$maxAbsPct = 0.0;
foreach ($unrealized as $p) {
    $maxAbsPct = max($maxAbsPct, abs((float) ($p['pnl_pct'] ?? 0)));
}
$maxAbsPct = $maxAbsPct > 0 ? $maxAbsPct : 1.0;

$posViews = [];
foreach ($unrealized as $p) {
    $long   = ($p['side'] ?? '') === 'long';
    $pnlPct = $p['pnl_pct'];
    $posViews[] = [
        'raw'       => $p,
        'sideCls'   => $long ? 'long' : 'short',   // направление: цвет стрелки/бейджа
        'sideLabel' => $long ? 'LONG' : 'SHORT',
        'arrow'     => $long ? '▲' : '▼',
        'pnlCls'    => pnl_class($p['pnl_usd']),    // знак uPnL: цвет цифр/подсветки
        'barCls'    => ($p['pnl_usd'] ?? 0) >= 0 ? 'pos' : 'neg',
        'barPct'    => $pnlPct === null ? 0 : round(min(100, abs((float) $pnlPct) / $maxAbsPct * 100)),
        'openedAt'  => (int) ($p['opened_at'] ?? 0),
    ];
}

layout_header(['title' => 'Позиции', 'page' => 'positions']);
?>

<div class="kpi-grid">
    <div class="kpi"><div class="k-label">Открыто позиций</div><div class="k-value"><?= count($unrealized) ?></div></div>
    <div class="kpi"><div class="k-label">В позициях</div><div class="k-value"><?= number_format($posSizeTotal, 2) ?> $</div></div>
    <div class="kpi"><div class="k-label">Нереализованный PnL</div><div class="k-value <?= pnl_class($unrealizedTotal) ?>"><?= fmt_usd($unrealizedTotal) ?></div></div>
    <div class="kpi"><div class="k-label">Watching</div><div class="k-value"><?= count($watching) ?></div><div class="k-sub">ожидание просадки</div></div>
</div>

<div class="tabs">
    <button class="tab-btn active" data-tab="tp-open" data-hash="open">Открытые <span class="cnt"><?= count($unrealized) ?></span></button>
    <button class="tab-btn" data-tab="tp-watch" data-hash="watching">Watching <span class="cnt"><?= count($watching) ?></span></button>
</div>

<div class="tab-panel active" id="tp-open">
    <div class="toolbar">
        <form method="GET" style="display:inline-flex; align-items:center; gap:12px; flex-wrap:wrap">
            <select name="wallet" onchange="this.form.submit()" style="flex:0 1 auto; min-width:0; max-width:170px">
                <option value="all">Все трейдеры</option>
                <?php foreach ($wallets as $w): ?>
                <option value="<?= htmlspecialchars($w['id']) ?>" <?= $selectedWalletId === $w['id'] ? 'selected' : '' ?>><?= htmlspecialchars($w['label'] ?? $w['id']) ?></option>
                <?php endforeach; ?>
            </select>
            <input type="hidden" name="starred" value="0">
            <label class="check" style="white-space:nowrap" title="Показывать позиции только трейдеров с рейтингом ★">
                <input type="checkbox" name="starred" value="1" <?= $onlyStarred ? 'checked' : '' ?> onchange="this.form.submit()">
                Только <span style="color:var(--brand)">★</span>
            </label>
            <?php if ($filterWalletId !== null): ?><?= hyperdash_link($walletAddressById[$filterWalletId] ?? '') ?><?php endif; ?>
        </form>
        <span class="count"><?= count($unrealized) ?> позиций</span>
    </div>
    <?php if (empty($posViews)): ?>
        <div class="table-wrap"><div class="empty">Нет открытых позиций</div></div>
    <?php else: ?>

    <!-- Десктоп: тепловая таблица (1B). Строка подкрашена по знаку uPnL,
         направление — стрелкой у тикера, в колонке uPnL — полоса величины движения. -->
    <div class="table-wrap pos-heat-wrap">
        <table class="pos-heat sortable">
            <thead>
                <tr>
                    <th class="c-sym">Символ</th>
                    <th class="c-tr">Трейдер</th>
                    <th class="num c-sz">Размер $</th>
                    <th class="num c-lev">Плечо</th>
                    <th class="num c-price nosort">Вход → тек.</th>
                    <th class="num c-open">Открыта</th>
                    <th class="c-upnl sort-asc">uPnL</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($posViews as $v): $p = $v['raw']; ?>
                <tr class="row-link tint-<?= $v['barCls'] ?>" data-href="trader.php?id=<?= urlencode($p['wallet_id']) ?>#positions">
                    <td class="c-sym" data-sort="<?= htmlspecialchars($p['symbol']) ?>">
                        <span class="sym"><span class="side-ico <?= $v['sideCls'] ?>"><?= $v['arrow'] ?></span><b><?= htmlspecialchars($p['symbol']) ?></b><?= tradingview_link($p['symbol']) ?></span>
                    </td>
                    <td class="c-tr"><span style="display:inline-flex; align-items:center; gap:6px"><?= htmlspecialchars($p['wallet_label']) ?> <?= rating_badge((int) ($p['wallet_rating'] ?? 0)) ?> <?= hyperdash_link($walletAddressById[$p['wallet_id']] ?? '') ?></span></td>
                    <td class="num c-sz mono" data-sort="<?= (float) ($p['size_usd'] ?? 0) ?>"><?= number_format((float) ($p['size_usd'] ?? 0), 2) ?></td>
                    <td class="num c-lev mono dim" data-sort="<?= (int) $p['leverage'] ?>">×<?= (int) $p['leverage'] ?></td>
                    <td class="num c-price mono"><span class="e-in"><?= number_format((float) $p['entry_price'], 4) ?></span> → <span class="e-cur"><?= $p['current_price'] !== null ? number_format($p['current_price'], 4) : '—' ?></span></td>
                    <td class="num c-open dim" data-sort="<?= $v['openedAt'] ?>"><span data-reltime="<?= $v['openedAt'] ?>"><?= $v['openedAt'] ? date('Y-m-d H:i', $v['openedAt']) : '—' ?></span></td>
                    <td class="c-upnl" data-sort="<?= $p['pnl_pct'] ?? '' ?>">
                        <div class="upnl-cell">
                            <div class="pnl-bar <?= $v['barCls'] ?>"><span style="width:<?= $v['barPct'] ?>%"></span></div>
                            <div class="nums">
                                <div class="u-pct mono <?= $v['pnlCls'] ?>"><?= fmt_pct($p['pnl_pct']) ?></div>
                                <div class="u-usd mono <?= $v['pnlCls'] ?>"><?= fmt_usd($p['pnl_usd']) ?></div>
                            </div>
                        </div>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="2">Итого · <?= count($posViews) ?> поз.</td>
                    <td class="num mono"><?= number_format($posSizeTotal, 2) ?></td>
                    <td colspan="3"></td>
                    <td class="c-upnl">
                        <div class="upnl-cell foot">
                            <div class="nums">
                                <div class="u-pct mono <?= pnl_class($unrealizedTotal) ?>"><?= fmt_pct($unrealizedTotalPct) ?></div>
                                <div class="u-usd mono <?= pnl_class($unrealizedTotal) ?>"><?= fmt_usd($unrealizedTotal) ?></div>
                            </div>
                        </div>
                    </td>
                </tr>
            </tfoot>
        </table>
    </div>

    <!-- Мобайл: карточки позиций (1C), в две колонки. Крупный тикер,
         направление и большой uPnL; служебные поля — мелкой сеткой снизу. -->
    <label class="mobile-sort" style="margin-bottom:12px">Сортировка
        <select id="m-sort-pos">
            <option value="">по умолчанию</option>
            <option value="upnl:desc">uPnL % ↓</option>
            <option value="upnl:asc">uPnL % ↑</option>
            <option value="size:desc">Размер ↓</option>
            <option value="opened:desc">Открыта (свежие)</option>
            <option value="opened:asc">Открыта (старые)</option>
            <option value="symbol:asc">Символ A–Z</option>
        </select>
    </label>
    <div class="pos-cards">
        <?php foreach ($posViews as $v): $p = $v['raw']; ?>
        <div class="pos-card row-link <?= $v['sideCls'] ?>" data-href="trader.php?id=<?= urlencode($p['wallet_id']) ?>#positions"
            data-upnl="<?= $p['pnl_pct'] ?? '' ?>" data-size="<?= (float) ($p['size_usd'] ?? 0) ?>"
            data-opened="<?= $v['openedAt'] ?>" data-symbol="<?= htmlspecialchars($p['symbol']) ?>">
            <div class="pc-head">
                <span class="pc-coin-wrap"><span class="side-ico <?= $v['sideCls'] ?>"><?= $v['arrow'] ?></span><span class="pc-coin mono"><?= htmlspecialchars($p['symbol']) ?></span><?= tradingview_link($p['symbol']) ?></span>
                <span class="pc-side <?= $v['sideCls'] ?>"><?= $v['sideLabel'] ?></span>
            </div>
            <div class="pc-pct mono <?= $v['pnlCls'] ?>"><?= fmt_pct($p['pnl_pct']) ?></div>
            <div class="pc-usd mono <?= $v['pnlCls'] ?>"><?= fmt_usd($p['pnl_usd']) ?></div>
            <div class="pnl-bar <?= $v['barCls'] ?>"><span style="width:<?= $v['barPct'] ?>%"></span></div>
            <div class="pc-meta">
                <div class="pc-row">
                    <span class="k">Трейдер</span>
                    <span class="v txt"><?= htmlspecialchars($p['wallet_label']) ?> <?= rating_badge((int) ($p['wallet_rating'] ?? 0)) ?> <?= hyperdash_link($walletAddressById[$p['wallet_id']] ?? '') ?></span>
                </div>
                <div class="pc-row">
                    <span class="k">Размер · плечо</span>
                    <span class="v"><?= number_format((float) ($p['size_usd'] ?? 0), 2) ?> · ×<?= (int) $p['leverage'] ?></span>
                </div>
                <div class="pc-row">
                    <span class="k">Вход → тек.</span>
                    <span class="v v-flow"><?= number_format((float) $p['entry_price'], 4) ?> → <?= $p['current_price'] !== null ? number_format($p['current_price'], 4) : '—' ?></span>
                </div>
            </div>
            <div class="pc-open">
                <span class="lbl">Открыта</span>
                <span class="v" data-reltime="<?= $v['openedAt'] ?>"><?= $v['openedAt'] ? date('Y-m-d H:i', $v['openedAt']) : '—' ?></span>
            </div>
        </div>
        <?php endforeach; ?>
    </div>

    <?php endif; ?>
</div>

<div class="tab-panel" id="tp-watch">
    <div class="alert info">Символы, по которым бот ждёт просадку UPNL трейдера до цели, прежде чем войти. «Снять» — убрать символ из наблюдения без сброса state.</div>
    <div class="table-wrap">
        <?php if (empty($watching)): ?>
            <div class="empty">Нет символов в ожидании</div>
        <?php else: ?>
        <table class="stack">
            <thead>
                <tr>
                    <th>Трейдер</th><th>Символ</th><th>Сторона</th>
                    <th class="num">Плечо</th><th class="num">Вход трейдера</th>
                    <th>С</th><th class="num">Возраст</th><th></th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($watching as $wp): ?>
                <tr>
                    <td class="stack-main"><span style="display:inline-flex; align-items:center; gap:6px"><?= htmlspecialchars($wp['wallet_label']) ?> <?= rating_badge((int) ($wp['wallet_rating'] ?? 0)) ?> <?= hyperdash_link($walletAddressById[$wp['wallet_id']] ?? '') ?></span></td>
                    <td data-label="Символ"><b><?= htmlspecialchars($wp['symbol']) ?></b> <?= tradingview_link($wp['symbol']) ?></td>
                    <td data-label="Сторона"><span class="badge <?= htmlspecialchars($wp['side']) ?>"><?= strtoupper(htmlspecialchars($wp['side'])) ?></span></td>
                    <td class="num" data-label="Плечо">×<?= (int) ($wp['leverage'] ?? 1) ?></td>
                    <td class="num" data-label="Вход трейдера"><?= number_format((float) ($wp['trader_entry_price'] ?? 0), 4) ?></td>
                    <td data-label="С" class="dim"><span data-reltime="<?= (int) ($wp['started_at'] ?? time()) ?>"><?= date('m-d H:i', (int) ($wp['started_at'] ?? time())) ?></span></td>
                    <td class="num" data-label="Возраст"><?= floor(($wp['age_seconds'] ?? 0) / 3600) ?>ч <?= floor((($wp['age_seconds'] ?? 0) % 3600) / 60) ?>м</td>
                    <td style="text-align:right">
                        <form method="POST" style="display:inline" onsubmit="return confirm('Снять <?= htmlspecialchars($wp['symbol']) ?> с наблюдения?')">
                            <?= csrf_field() ?>
                            <input type="hidden" name="action" value="remove_watching">
                            <input type="hidden" name="wallet_id" value="<?= htmlspecialchars($wp['wallet_id']) ?>">
                            <input type="hidden" name="symbol" value="<?= htmlspecialchars($wp['symbol']) ?>">
                            <button type="submit" class="btn danger small">Снять</button>
                        </form>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        <?php endif; ?>
    </div>
</div>

<script>
UI.initTabs();
// Мобильная сортировка карточек открытых позиций (на десктопе — заголовки тепловой таблицы)
UI.initMobileSort(
    document.getElementById('m-sort-pos'),
    () => Array.from(document.querySelectorAll('.pos-cards .pos-card')),
    function (card, key) {
        var raw = card.dataset[key];
        if (raw === undefined || raw === '') return '';
        var n = parseFloat(raw);
        return isNaN(n) ? raw : n;
    }
);
</script>

<?php layout_footer(); ?>
