<?php
// =============================================================
// TRADERS — реестр трейдеров (бывшие «Кошельки»)
// =============================================================
// Компактная таблица со скорингом, спарклайнами и клиентскими
// фильтрами. Клик по строке открывает карточку trader.php?id=…
// Массовый импорт/изменения/теги — на bulk.php.

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

require_auth();

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

require_once __DIR__ . '/data.php';
require_once __DIR__ . '/lib/forms.php';
require_once __DIR__ . '/lib/render.php';
require_once __DIR__ . '/lib/wallets_handler.php';
require_once __DIR__ . '/lib/layout.php';

$message = '';
$messageType = '';

$config = load_wallets_config();

// POST (добавление трейдера с этой страницы): CSRF + общий handler
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    csrf_verify();
    $res = dashboard_handle_wallets_post($_POST, $config);
    $message     = $res['message'];
    $messageType = $res['messageType'];
    $config = load_wallets_config();
}

$wallets        = $config['wallets'];
$globalSettings = $config['global_settings'];
$availableTags  = $config['available_tags'] ?? [];

// Сводка + спарклайны по каждому трейдеру
$overview = build_wallets_overview($wallets, $globalSettings, null);
$rows = [];
foreach ($overview as $row) {
    $w = null;
    foreach ($wallets as $wc) {
        if ($wc['id'] === $row['wallet_id']) { $w = $wc; break; }
    }
    $row['status'] = $w['status'] ?? 'WATCH';
    $row['notes']  = $w['notes'] ?? '';
    $row['spark']  = daily_pnl_series(load_closed_trades($row['wallet_id']), 14)['usd'];
    $rows[] = $row;
}

// Фактические теги (настроенные + висящие на трейдерах)
$filterTags = $availableTags;
foreach ($rows as $row) {
    foreach ($row['tags'] as $t) {
        if (!in_array($t, $filterTags, true)) {
            $filterTags[] = $t;
        }
    }
}

layout_header(['title' => 'Трейдеры', 'page' => 'traders']);
layout_flash($message, $messageType);
?>

<div class="toolbar filters">
    <div class="search-box">
        <?= layout_icon('search') ?>
        <input type="text" id="f-q" placeholder="Поиск: имя, адрес, заметки…">
    </div>
    <select id="f-status">
        <option value="">Все статусы</option>
        <?php foreach (['WATCH', 'TEST', 'ACTIVE', 'ARCHIVE'] as $st): ?>
        <option><?= $st ?></option>
        <?php endforeach; ?>
    </select>
    <?php if (!empty($filterTags)): ?>
    <select id="f-tag">
        <option value="">Все теги</option>
        <?php foreach ($filterTags as $t): ?>
        <option value="<?= htmlspecialchars($t) ?>"><?= htmlspecialchars($t) ?></option>
        <?php endforeach; ?>
    </select>
    <?php endif; ?>
    <div class="check-group">
        <label class="check" title="Только трейдеры с проставленным рейтингом"><input type="checkbox" id="f-rated"> рейтинг</label>
        <label class="check" title="Только включённые трейдеры"><input type="checkbox" id="f-enabled" checked> включённые</label>
        <label class="check" title="Скрыть неактивных — без сделок за последние 14 дней"><input type="checkbox" id="f-active"> активные</label>
    </div>
    <span class="count" id="f-count"></span>
    <label class="mobile-sort">Сортировка
        <select id="m-sort">
            <option value="">по умолчанию</option>
            <option value="2:desc">Рейтинг ↓</option>
            <option value="4:desc">Net PnL ↓</option>
            <option value="4:asc">Net PnL ↑</option>
            <option value="3:desc">Баланс ↓</option>
            <option value="5:desc">ROI ↓</option>
            <option value="6:desc">Win rate ↓</option>
            <option value="8:desc">Сделки ↓</option>
            <option value="10:asc">Активность (свежие)</option>
        </select>
    </label>
</div>

<div class="card" id="add-card" style="display:<?= $messageType === 'error' && ($_POST['action'] ?? '') === 'add_wallet' ? '' : 'none' ?>; margin-bottom:16px">
    <div class="card-title">Добавить трейдера</div>
    <form method="POST">
        <?= csrf_field() ?>
        <input type="hidden" name="action" value="add_wallet">
        <div class="row2">
            <div class="field">
                <label>Адрес (0x…)</label>
                <input type="text" name="address" placeholder="0x1234…abcd" required pattern="0x[a-fA-F0-9]{40}" style="font-family:var(--mono)" value="<?= htmlspecialchars($_POST['address'] ?? '') ?>">
            </div>
            <div class="field">
                <label>Название</label>
                <input type="text" name="label" placeholder="Trader Alpha" value="<?= htmlspecialchars($_POST['label'] ?? '') ?>">
            </div>
        </div>
        <div class="field">
            <label>Заметки</label>
            <input type="text" name="notes" placeholder="Откуда взят, стиль торговли…">
        </div>
        <div class="hint" style="margin-bottom:12px">Трейдер добавится со статусом WATCH и глобальными настройками. Индивидуальные overrides — в карточке трейдера → Настройки. Массовый импорт — на странице <a href="bulk.php#import">Массовые операции</a>.</div>
        <button class="btn" type="submit">Добавить трейдера</button>
    </form>
</div>

<div class="alert info" style="display:flex; align-items:center">
    <span>Массовый импорт, изменение настроек и теги — на странице <a href="bulk.php"><b>Массовые операции</b></a>. Клик по строке открывает карточку трейдера.</span>
</div>

<div class="table-wrap">
    <table class="sortable stack" id="traders-table">
        <thead>
            <tr>
                <th>Трейдер</th>
                <th>Статус</th>
                <th class="num" title="Автоскоринг по торговой истории (0–100)">Score</th>
                <th class="num" title="Виртуальный счёт, за всё время">Баланс</th>
                <th class="num">Net PnL</th>
                <th class="num" title="За всё время (состояние счёта)">ROI</th>
                <th class="num">WR</th>
                <th class="num" title="Максимальная просадка / mark-to-market с открытыми позициями">Max DD</th>
                <th class="num">Сделки</th>
                <th class="nosort">14 дней</th>
                <th class="num" title="Дней с последней закрытой сделки">Активность</th>
            </tr>
        </thead>
        <tbody>
            <?php if (empty($rows)): ?>
            <tr class="no-data"><td colspan="11"><div class="empty">Пока нет добавленных трейдеров</div></td></tr>
            <?php else: ?>
            <?php foreach ($rows as $r): ?>
            <tr class="row-link" data-href="trader.php?id=<?= urlencode($r['wallet_id']) ?>"
                data-enabled="<?= $r['enabled'] ? 1 : 0 ?>"
                data-active="<?= $r['active'] ? 1 : 0 ?>"
                data-rated="<?= ((int) ($r['rating'] ?? 0)) > 0 ? 1 : 0 ?>"
                data-status="<?= htmlspecialchars($r['status']) ?>"
                data-tags="<?= htmlspecialchars(implode(',', $r['tags'])) ?>"
                data-search="<?= htmlspecialchars(mb_strtolower($r['label'] . ' ' . $r['address'] . ' ' . $r['notes'])) ?>"
                data-balance="<?= $r['balance'] ?>"
                data-pnl="<?= $r['net_pnl'] ?>"
                data-ntrades="<?= $r['trades_count'] ?>">
                <td class="stack-main">
                    <div style="display:flex; align-items:center; gap:8px; flex-wrap:wrap">
                        <b><?= htmlspecialchars($r['label']) ?></b>
                        <?= rating_badge((int) ($r['rating'] ?? 0)) ?>
                        <?= hyperdash_link($r['address'] ?? '') ?>
                        <?php if (!$r['enabled']): ?><span class="badge off">ВЫКЛ</span><?php endif; ?>
                        <?php if (!empty($r['tags'])): ?>
                        <span style="display:inline-flex; gap:4px"><?php foreach ($r['tags'] as $tag) echo tag_pill($tag); ?></span>
                        <?php endif; ?>
                    </div>
                    <div class="addr"><?= htmlspecialchars(substr($r['address'], 0, 6)) ?>…<?= htmlspecialchars(substr($r['address'], -4)) ?></div>
                </td>
                <td data-label="Статус"><span class="badge st-<?= htmlspecialchars($r['status']) ?>"><?= htmlspecialchars($r['status']) ?></span></td>
                <td class="num" data-label="Score" data-sort="<?= $r['score'] ?? '' ?>">
                    <?php if ($r['score'] !== null): ?>
                        <span class="badge grade-<?= $r['grade'] ?>"><?= $r['grade'] ?> <?= $r['score'] ?></span>
                    <?php else: ?>
                        <span class="dim" title="Мало сделок (&lt; 5)">—</span>
                    <?php endif; ?>
                </td>
                <td class="num" data-label="Баланс" data-sort="<?= $r['balance'] ?>"><?= number_format($r['balance'], 2) ?> $</td>
                <td class="num <?= pnl_class($r['net_pnl']) ?>" data-label="Net PnL" data-sort="<?= $r['net_pnl'] ?>" style="font-weight:650"><?= fmt_usd($r['net_pnl']) ?></td>
                <td class="num <?= pnl_class($r['roi_pct']) ?>" data-label="ROI" data-sort="<?= $r['roi_pct'] ?>"><?= fmt_pct($r['roi_pct']) ?></td>
                <td class="num" data-label="WR" data-sort="<?= $r['winrate'] ?>"><?= number_format($r['winrate'], 1) ?>%</td>
                <td class="num neg" data-label="Max DD" data-sort="<?= $r['max_drawdown_pct'] ?>" title="MTM DD: <?= number_format($r['mtm_max_drawdown_pct'] ?? 0, 2) ?>%"><?= number_format($r['max_drawdown_pct'], 1) ?>%</td>
                <td class="num" data-label="Сделки" data-sort="<?= $r['trades_count'] ?>"><?= $r['trades_count'] ?></td>
                <td data-label="14 дней"><span data-spark='<?= htmlspecialchars(json_encode($r['spark']), ENT_QUOTES) ?>'></span></td>
                <td class="num" data-label="Активность" data-sort="<?= $r['last_trade_at'] === null ? '' : $r['days_silent'] ?>">
                    <?php if ($r['last_trade_at'] === null): ?>
                        <span class="dim">нет сделок</span>
                    <?php elseif (!$r['active']): ?>
                        <span class="neg" title="Последняя сделка: <?= htmlspecialchars($r['last_trade_at']) ?>">⚠ <?= $r['days_silent'] ?>д тишины</span>
                    <?php elseif ($r['days_silent'] === 0): ?>
                        <span class="pos">сегодня</span>
                    <?php else: ?>
                        <span class="dim" title="Последняя сделка: <?= htmlspecialchars($r['last_trade_at']) ?>"><?= $r['days_silent'] ?>д назад</span>
                    <?php endif; ?>
                </td>
            </tr>
            <?php endforeach; ?>
            <?php endif; ?>
        </tbody>
        <tfoot>
            <tr>
                <td id="tot-label">Итого</td>
                <td>—</td><td class="num">—</td>
                <td class="num" id="tot-balance"></td>
                <td class="num" id="tot-pnl"></td>
                <td class="num">—</td><td class="num">—</td><td class="num">—</td>
                <td class="num" id="tot-trades"></td>
                <td>—</td><td class="num">—</td>
            </tr>
        </tfoot>
    </table>
</div>

<script>
(function () {
    // Спарклайны
    document.querySelectorAll('[data-spark]').forEach(el => {
        try { el.innerHTML = UI.sparkline(JSON.parse(el.dataset.spark), 64, 24); } catch (e) {}
    });

    // Клиентские фильтры (состояние в localStorage — как на старом дашборде)
    const table = document.getElementById('traders-table');
    const els = {
        q: document.getElementById('f-q'),
        status: document.getElementById('f-status'),
        tag: document.getElementById('f-tag'),
        enabled: document.getElementById('f-enabled'),
        active: document.getElementById('f-active'),
        rated: document.getElementById('f-rated'),
    };
    const STORE_KEY = 'tradersFilters';
    const total = table.tBodies[0].querySelectorAll('tr:not(.no-data)').length;

    function apply() {
        const q = (els.q.value || '').toLowerCase();
        let shown = 0, balance = 0, pnl = 0, trades = 0;
        for (const row of table.tBodies[0].rows) {
            if (row.classList.contains('no-data')) continue;
            let visible = true;
            if (els.enabled && els.enabled.checked && row.dataset.enabled !== '1') visible = false;
            if (els.active && els.active.checked && row.dataset.active !== '1') visible = false;
            if (els.rated && els.rated.checked && row.dataset.rated !== '1') visible = false;
            if (els.status && els.status.value && row.dataset.status !== els.status.value) visible = false;
            if (els.tag && els.tag.value && !row.dataset.tags.split(',').includes(els.tag.value)) visible = false;
            if (q && !row.dataset.search.includes(q)) visible = false;
            row.style.display = visible ? '' : 'none';
            if (visible) {
                shown++;
                balance += parseFloat(row.dataset.balance) || 0;
                pnl     += parseFloat(row.dataset.pnl) || 0;
                trades  += parseInt(row.dataset.ntrades, 10) || 0;
            }
        }
        document.getElementById('tot-label').textContent = 'Итого: ' + shown;
        document.getElementById('tot-balance').textContent = UI.usd(balance, false);
        const tp = document.getElementById('tot-pnl');
        tp.textContent = UI.usd(pnl);
        tp.className = 'num ' + UI.pnlClass(pnl);
        document.getElementById('tot-trades').textContent = trades;
        document.getElementById('f-count').textContent =
            shown < total ? 'показано ' + shown + ' из ' + total : total + ' трейдеров';

        try {
            localStorage.setItem(STORE_KEY, JSON.stringify({
                status: els.status ? els.status.value : '',
                tag: els.tag ? els.tag.value : '',
                enabled: els.enabled.checked,
                active: els.active.checked,
                rated: els.rated ? els.rated.checked : false,
            }));
        } catch (e) {}
    }

    try {
        const saved = JSON.parse(localStorage.getItem(STORE_KEY) || '{}');
        if (els.status && saved.status) els.status.value = saved.status;
        if (els.tag && saved.tag && [...els.tag.options].some(o => o.value === saved.tag)) els.tag.value = saved.tag;
        if (els.enabled && 'enabled' in saved) els.enabled.checked = !!saved.enabled;
        if (els.active) els.active.checked = !!saved.active;
        if (els.rated) els.rated.checked = !!saved.rated;
    } catch (e) {}

    Object.values(els).forEach(el => {
        if (!el) return;
        el.addEventListener(el.tagName === 'INPUT' && el.type === 'text' ? 'input' : 'change', apply);
    });
    apply();

    // Мобильная сортировка (заголовки таблицы скрыты на телефоне)
    UI.initMobileSortTable(document.getElementById('m-sort'), table);
})();
</script>

<!-- FAB: добавить трейдера -->
<button class="fab" type="button" aria-label="Добавить трейдера" title="Добавить трейдера"
    onclick="var c = document.getElementById('add-card'); c.style.display = c.style.display === 'none' ? '' : 'none'; if (c.style.display !== 'none') { c.scrollIntoView({behavior: 'smooth', block: 'center'}); var f = c.querySelector('input[name=address]'); if (f) f.focus(); }">
    <?= layout_icon('plus') ?>
</button>

<?php layout_footer(); ?>
