// ==== Экраны: Пулы · Массовые операции · Настройки · Логин ===
(function (UI) {
    'use strict';
    const M = UI.M, esc = UI.esc, usd = UI.usd, pct = UI.pct;

    // ------------------------------------------------ Пулы
    UI.route('pools', () => {
        const body = M.pools.map(p => `
            <a class="card" href="#/pool/${p.id}" style="display:block;text-decoration:none;color:inherit">
                <div style="display:flex;align-items:center;gap:9px;margin-bottom:9px">
                    <div style="font-family:var(--font-ui);font-weight:800;font-size:17px;flex:1">${esc(p.label)}</div>
                    <span class="badge ${p.enabled ? 'b-active' : 'b-off'}">${p.enabled ? 'работает' : 'пауза'}</span>
                </div>
                <div class="kpi-grid" style="grid-template-columns:repeat(3,1fr)">
                    <div><div class="k-label" style="font-size:10px;color:var(--mut);text-transform:uppercase;letter-spacing:.08em">Баланс</div>
                        <div class="mono" style="font-weight:600">${usd(p.balance)}</div></div>
                    <div><div class="k-label" style="font-size:10px;color:var(--mut);text-transform:uppercase;letter-spacing:.08em">ROI</div>
                        <div class="mono ${UI.pnlCls(p.roi)}" style="font-weight:600">${pct(p.roi)}</div></div>
                    <div><div class="k-label" style="font-size:10px;color:var(--mut);text-transform:uppercase;letter-spacing:.08em">Просадка</div>
                        <div class="mono down-t" style="font-weight:600">${pct(p.maxDd)}</div></div>
                </div>
                <div class="chip-row" style="margin-top:12px;padding-bottom:0">
                    <span class="chip" style="cursor:default">${p.traders.length} трейдеров</span>
                    <span class="chip" style="cursor:default">${p.tradesCount} сделок</span>
                    <span class="chip" style="cursor:default">×${p.leverage}</span>
                    <span class="chip info" style="cursor:default">${p.executionMode}</span>
                    <span class="chip" style="cursor:default">${p.marginMode}</span>
                </div>
            </a>`).join('') + `
            <div class="hint" style="text-align:center;margin-top:6px">Пул — общий виртуальный баланс с распределением между трейдерами по аллокациям</div>`;
        return UI.shell({
            title: 'Пулы', body,
            fab: `<button class="fab" onclick="poolAddSheet()" aria-label="Создать пул">${UI.ICONS.plus}</button>`,
        });
    });
    window.poolAddSheet = () => UI.openSheet('Новый пул', `
        <div class="field"><label>Название пула</label><input type="text" placeholder="Например, Скальперы"></div>
        <div class="field-grid">
            <div class="field"><label>Стартовый баланс, USDC</label><input type="number" value="1000"></div>
            <div class="field"><label>Плечо</label><input type="number" value="3"></div>
        </div>
        <button class="btn btn-primary btn-block" onclick="UI.stub();UI.closeSheet()">Создать</button>`);

    // ------------------------------------------------ Карточка пула
    window.poolTraderSheet = (pid, tid) => {
        const p = M.pools.find(x => x.id === pid); const t = p.traders.find(x => x.id === tid);
        UI.openSheet('Настройки трейдера в пуле', `
            <div class="mono small muted" style="margin-bottom:12px">${esc(t.label)} · ${UI.shortAddr(t.address)}</div>
            <div class="field-grid">
                <div class="field"><label>Аллокация, %</label><input type="number" value="${t.alloc}"></div>
                <div class="field"><label>Плечо трейдера</label><input type="number" value="${t.leverage ?? ''}" placeholder="пул: ×${p.leverage}"></div>
                <div class="field"><label>Режим размера</label><select>
                    <option ${t.sizingMode === 'percent_balance' ? 'selected' : ''}>percent_balance</option>
                    <option ${t.sizingMode === 'fixed' ? 'selected' : ''}>fixed</option></select></div>
                <div class="field"><label>${t.sizingMode === 'fixed' ? 'Фикс. сумма, $' : '% от доли'}</label>
                    <input type="number" value="${t.sizingMode === 'fixed' ? (t.sizingFixed ?? '') : (t.sizingPercent ?? '')}"></div>
                <div class="field"><label>Cooldown, сек</label><input type="number" value="${t.cooldown}"></div>
            </div>
            <div class="switch-row"><div class="sw-label">Копирование включено</div>
                <label class="switch"><input type="checkbox" ${t.enabled ? 'checked' : ''}><span class="tr"></span></label></div>
            <div class="switch-row"><div><div class="sw-label">Отложенный вход по просадке</div>
                ${t.drawdownEntry ? `<div class="sw-sub">порог ${t.drawdownPct}%</div>` : ''}</div>
                <label class="switch"><input type="checkbox" ${t.drawdownEntry ? 'checked' : ''}><span class="tr"></span></label></div>
            <div class="btn-row" style="margin-top:12px">
                <button class="btn btn-primary" onclick="UI.stub();UI.closeSheet()">Сохранить</button>
                <button class="btn btn-danger" onclick="UI.stub();UI.closeSheet()">Убрать из пула</button>
            </div>`);
    };
    window.poolAddTraderSheet = pid => UI.openSheet('Добавить трейдера в пул', `
        <div class="field"><label>Название</label><input type="text" placeholder="Имя трейдера"></div>
        <div class="field"><label>Адрес (0x…)</label><input type="text" placeholder="0x0000…0000"></div>
        <div class="field-grid">
            <div class="field"><label>Аллокация, %</label><input type="number" value="20"></div>
            <div class="field"><label>Плечо трейдера</label><input type="number" placeholder="как у пула"></div>
        </div>
        <button class="btn btn-primary btn-block" onclick="UI.stub();UI.closeSheet()">Добавить</button>`);

    UI.route('pool', id => {
        const p = M.pools.find(x => x.id === id);
        if (!p) return UI.shell({ title: 'Пул не найден', back: '#/pools', body: '<div class="empty">Нет такого пула</div>' });
        const allocSum = p.traders.reduce((s, t) => s + t.alloc, 0);

        const tradersPane = `
            <div class="kpi-grid" style="margin-bottom:12px">
                <div class="kpi"><div class="k-label">Баланс пула</div><div class="k-value">${usd(p.balance)}</div><div class="k-sub">старт ${usd(p.virtualBalance)}</div></div>
                <div class="kpi"><div class="k-label">ROI</div><div class="k-value ${UI.pnlCls(p.roi)}">${pct(p.roi)}</div><div class="k-sub">${p.tradesCount} сделок</div></div>
            </div>
            <div class="hint" style="margin-bottom:11px">Распределено аллокаций: <b class="mono">${allocSum}%</b> из 100%</div>
            ${UI.isDesktop() ? `<section class="card table-card"><table class="dtable"><thead><tr>
                <th>Трейдер</th><th>Адрес</th><th class="num">Аллокация</th><th>Sizing</th>
                <th class="num">Плечо</th><th class="num">Cooldown</th><th>DD-вход</th><th>Копирование</th></tr></thead><tbody>
                ${p.traders.map(t => `<tr onclick="poolTraderSheet('${p.id}','${t.id}')" style="cursor:pointer">
                    <td><span class="cell-main">${esc(t.label)}</span></td>
                    <td><span class="addr">${UI.shortAddr(t.address)}</span> ${UI.hdLink(t.address)}</td>
                    <td class="num"><b>${t.alloc}%</b></td>
                    <td class="mono small">${t.sizingMode === 'fixed' ? 'fixed $' + t.sizingFixed : t.sizingPercent + '% от доли'}</td>
                    <td class="num">${t.leverage ? '×' + t.leverage : '<span class="muted">пула</span>'}</td>
                    <td class="num">${t.cooldown}с</td>
                    <td>${t.drawdownEntry ? '<span class="badge b-watch">' + t.drawdownPct + '%</span>' : '<span class="muted small">—</span>'}</td>
                    <td>${t.enabled ? '<span class="badge b-active">вкл</span>' : '<span class="badge b-off">off</span>'}</td></tr>`).join('')}
            </tbody></table></section>` : ''}
            ${UI.isDesktop() ? '' : p.traders.map(t => `<div class="row-card" onclick="poolTraderSheet('${p.id}','${t.id}')">
                <div class="rc-main">
                    <div class="rc-title">${esc(t.label)} ${t.enabled ? '' : '<span class="badge b-off">off</span>'}
                        ${t.drawdownEntry ? '<span class="badge b-watch">DD-вход ' + t.drawdownPct + '%</span>' : ''}</div>
                    <div class="rc-sub"><span class="addr">${UI.shortAddr(t.address)}</span> ${UI.hdLink(t.address)}</div>
                    <div class="rc-sub mono">${t.sizingMode === 'fixed' ? 'fixed $' + t.sizingFixed : t.sizingPercent + '% от доли'} · cd ${t.cooldown}с · ${t.leverage ? '×' + t.leverage : 'плечо пула'}</div>
                </div>
                <div class="rc-right"><div class="rc-num">${t.alloc}%</div><div class="rc-num-sub">аллокация</div></div>
            </div>`).join('')}
            <button class="btn btn-block" onclick="poolAddTraderSheet('${p.id}')" style="margin-top:4px">${UI.ICONS.plus} Добавить трейдера</button>`;

        const configPane = `
            <section class="card">
                <div class="switch-row"><div><div class="sw-label">Пул включён</div>
                    <div class="sw-sub">Бот обрабатывает трейдеров пула</div></div>
                    <label class="switch"><input type="checkbox" ${p.enabled ? 'checked' : ''} onchange="UI.stub();this.checked=!this.checked"><span class="tr"></span></label></div>
            </section>
            <section class="card"><h2 class="card-title">Параметры</h2>
                <div class="field"><label>Название пула</label><input type="text" value="${esc(p.label)}"></div>
                <div class="field-grid">
                    <div class="field"><label>Стартовый баланс, USDC</label><input type="number" value="${p.virtualBalance}"></div>
                    <div class="field"><label>Плечо</label><input type="number" value="${p.leverage}"></div>
                    <div class="field"><label>Комиссия за сторону, %</label><input type="number" step="0.005" value="${p.feePct}"></div>
                    <div class="field"><label>Частичное закрытие</label><select>
                        <option ${p.partialClose === 'off' ? 'selected' : ''}>off</option>
                        <option ${p.partialClose === 'on' ? 'selected' : ''}>on</option></select></div>
                    <div class="field"><label>Исполнение</label><select>
                        <option ${p.executionMode === 'webhook' ? 'selected' : ''}>webhook</option>
                        <option ${p.executionMode === 'direct' ? 'selected' : ''}>direct</option></select></div>
                    <div class="field"><label>Режим маржи</label><select>
                        <option ${p.marginMode === 'cross' ? 'selected' : ''}>cross</option>
                        <option ${p.marginMode === 'isolated' ? 'selected' : ''}>isolated</option></select></div>
                </div>
                <div class="field"><label>Субаккаунт (hl_subaccount)</label><input type="text" value="${esc(p.subaccount)}" placeholder="0x…"></div>
                <button class="btn btn-primary btn-block" onclick="UI.stub()">Сохранить настройки пула</button>
            </section>`;

        const webhooksPane = `
            <div class="hint" style="margin-bottom:11px">До трёх сервисов на пул. При execution_mode = direct вебхуки не используются.</div>
            ${p.webhooks.map((w, i) => `<section class="card">
                <h2 class="card-title">Сервис #${i + 1} <span class="spacer"></span>
                    <label class="switch"><input type="checkbox" ${w.enabled ? 'checked' : ''}><span class="tr"></span></label></h2>
                <div class="field"><label>Сервис</label><select onchange="UI.toast('Поля сервиса появятся после сохранения')">
                    <option value="" ${!w.service ? 'selected' : ''}>— не выбран —</option>
                    <option ${w.service === 'katoshi' ? 'selected' : ''}>katoshi</option>
                    <option ${w.service === 'telegram' ? 'selected' : ''}>telegram</option></select></div>
                ${w.service === 'katoshi' ? `<div class="field-grid">
                    <div class="field"><label>API key</label><input type="text" value="${esc(w.apiKey)}"></div>
                    <div class="field"><label>Bot ID</label><input type="number" value="${w.botId}"></div></div>` : ''}
                ${w.service === 'telegram' ? `<div class="field"><label>Chat ID</label><input type="text" value="${esc(w.chatId)}"></div>` : ''}
            </section>`).join('')}
            <button class="btn btn-primary btn-block" onclick="UI.stub()">Сохранить вебхуки</button>`;

        const dangerPane = `
            <section class="card danger-card"><h2 class="card-title">Опасная зона</h2>
                <div class="btn-row">
                    <button class="btn btn-danger" onclick="UI.stub()">Сбросить state</button>
                    <button class="btn btn-danger" onclick="UI.stub()">Удалить пул</button>
                </div>
                <div class="hint" style="margin-top:10px">Сброс закрывает виртуальные позиции пула и обнуляет статистику. Удаление пула необратимо; трейдеры вне пула не пострадают.</div>
            </section>`;

        const body = `
            <div style="display:flex;gap:8px;align-items:center;margin-bottom:4px">
                <span class="badge ${p.enabled ? 'b-active' : 'b-off'}">${p.enabled ? 'работает' : 'пауза'}</span>
                <span class="chip info" style="cursor:default">${p.executionMode}</span>
                <span class="chip" style="cursor:default">${p.marginMode}</span>
            </div>
            <div class="tabs">
                <button data-tab="tr" class="on">Трейдеры (${p.traders.length})</button>
                <button data-tab="cfg">Настройки</button>
                <button data-tab="wh">Вебхуки</button>
                <button data-tab="dz">Опасная зона</button>
            </div>
            <div class="tab-pane on" data-pane="tr">${tradersPane}</div>
            <div class="tab-pane" data-pane="cfg">${configPane}</div>
            <div class="tab-pane" data-pane="wh">${webhooksPane}</div>
            <div class="tab-pane" data-pane="dz">${dangerPane}</div>`;
        return UI.shell({ title: p.label, back: '#/pools', body });
    });

    // ------------------------------------------------ Массовые операции
    let bulkSel = new Set(), bulkQ = '';
    window.bulkToggle = id => { bulkSel.has(id) ? bulkSel.delete(id) : bulkSel.add(id); bulkRefresh(); };
    window.bulkAll = on => { bulkSel = on ? new Set(bulkList().map(t => t.id)) : new Set(); UI.render(); };
    window.bulkQSet = v => { bulkQ = v; UI.$('#bulk-list').innerHTML = bulkListHtml(); bulkRefresh(); };
    function bulkList() {
        return M.traders.filter(t => !bulkQ || (t.label + t.address).toLowerCase().includes(bulkQ.toLowerCase()));
    }
    function bulkRefresh() {
        const c = UI.$('#bulk-count'); if (c) c.textContent = bulkSel.size;
        UI.$$('#bulk-list [data-id]').forEach(r => {
            const on = bulkSel.has(r.dataset.id);
            if (r.tagName === 'TR') r.style.background = on ? 'var(--brand-soft)' : '';
            else r.style.borderColor = on ? 'rgba(245,185,66,.5)' : '';
            const cb = r.querySelector('input[type=checkbox]'); if (cb) cb.checked = on;
        });
    }
    function bulkListHtml() {
        if (UI.isDesktop()) {
            return `<section class="card table-card"><table class="dtable"><thead><tr>
                <th style="width:36px"></th><th>Трейдер</th><th>Статус</th><th>Адрес</th>
                <th class="num">Net PnL</th><th class="num">Сделки</th></tr></thead><tbody>
                ${bulkList().slice(0, 60).map(t => `<tr data-id="${t.id}" style="${bulkSel.has(t.id) ? 'background:var(--brand-soft)' : ''}">
                    <td><input type="checkbox" ${bulkSel.has(t.id) ? 'checked' : ''} onchange="bulkToggle('${t.id}')" style="width:18px;height:18px;accent-color:var(--brand)"></td>
                    <td><span class="cell-main">${esc(t.label)}</span></td>
                    <td>${UI.statusBadge(t.status)}</td>
                    <td><span class="addr">${UI.shortAddr(t.address)}</span></td>
                    <td class="num ${UI.pnlCls(t.netPnl)}">${usd(t.netPnl, true)}</td>
                    <td class="num">${t.trades}</td></tr>`).join('')}
            </tbody></table></section>`;
        }
        return bulkList().slice(0, 40).map(t => `
            <label class="row-card" data-id="${t.id}" style="cursor:pointer;${bulkSel.has(t.id) ? 'border-color:rgba(245,185,66,.5)' : ''}">
                <input type="checkbox" ${bulkSel.has(t.id) ? 'checked' : ''} onchange="bulkToggle('${t.id}')" style="width:19px;height:19px;accent-color:var(--brand)">
                <div class="rc-main">
                    <div class="rc-title" style="font-size:14px">${esc(t.label)}</div>
                    <div class="rc-sub">${UI.statusBadge(t.status)} <span class="addr">${UI.shortAddr(t.address)}</span></div>
                </div>
                <div class="rc-right"><div class="rc-num ${UI.pnlCls(t.netPnl)}" style="font-size:13px">${usd(t.netPnl, true)}</div></div>
            </label>`).join('');
    }
    window.bulkEditSheet = () => UI.openSheet(`Изменить настройки — выбрано ${bulkSel.size}`, `
        <div class="hint" style="margin-bottom:12px">Применяются только отмеченные поля.</div>
        <div style="display:flex;gap:8px;margin-bottom:12px">
            <button class="btn btn-sm" onclick="UI.$$('.sheet .check input').forEach(c=>c.checked=true)">Отметить все поля</button>
            <button class="btn btn-sm btn-ghost" onclick="UI.$$('.sheet .check input').forEach(c=>c.checked=false)">Снять все</button>
        </div>
        ${[['Статус', '<select><option>WATCH</option><option>TEST</option><option>ACTIVE</option><option>ARCHIVE</option></select>'],
           ['scale_factor', '<input type="number" step="0.01" placeholder="0.1">'],
           ['cooldown, сек', '<input type="number" placeholder="30">'],
           ['default_leverage', '<input type="number" placeholder="3">'],
           ['Уведомления в Telegram', '<select><option>вкл</option><option>выкл</option></select>'],
        ].map(([l, inp]) => `<div class="field" style="display:grid;grid-template-columns:24px 1fr;gap:10px;align-items:start">
            <label class="check" style="padding-top:9px"><input type="checkbox"></label>
            <div><label>${l}</label>${inp}</div></div>`).join('')}
        <button class="btn btn-primary btn-block" onclick="UI.stub();UI.closeSheet()">Применить к выбранным</button>`);

    UI.route('bulk', () => {
        const opsPane = `
            <div class="search-bar">${UI.ICONS.search}<input type="text" placeholder="Фильтр по имени или адресу…" value="${esc(bulkQ)}" oninput="bulkQSet(this.value)"></div>
            <div style="display:flex;align-items:center;gap:10px;margin-bottom:10px">
                <label class="check"><input type="checkbox" onchange="bulkAll(this.checked)"> выбрать всех</label>
                <span class="spacer" style="flex:1"></span>
                <span class="chip on" style="cursor:default">выбрано: <b id="bulk-count">${bulkSel.size}</b></span>
            </div>
            <div class="btn-row" style="margin-bottom:12px">
                <button class="btn btn-sm" onclick="UI.stub()">▶ Включить</button>
                <button class="btn btn-sm" onclick="UI.stub()">⏸ Приостановить</button>
                <button class="btn btn-sm" onclick="bulkEditSheet()">✎ Изменить настройки</button>
                <button class="btn btn-sm btn-danger" onclick="UI.stub()">Сбросить</button>
                <button class="btn btn-sm btn-danger" onclick="UI.stub()">Удалить</button>
            </div>
            <div id="bulk-list">${bulkListHtml()}</div>
            <div class="hint" style="text-align:center">Показаны первые ${UI.isDesktop() ? 60 : 40} из ${bulkList().length}</div>`;

        const importPane = `
            <section class="card"><h2 class="card-title">Массовый импорт</h2>
                <div class="field"><label>Адреса — по одному на строку</label>
                    <textarea class="mono" style="min-height:130px" placeholder="0xaaaa…\n0xbbbb…\n0xcccc…"></textarea></div>
                <div class="field-grid">
                    <div class="field"><label>Стартовый статус</label><select><option>WATCH</option><option>TEST</option><option>ACTIVE</option></select></div>
                    <div class="field"><label>Теги для всех</label><input type="text" placeholder="scalper, low-risk"></div>
                </div>
                <label class="check"><input type="checkbox"> сразу включить копирование</label>
                <button class="btn btn-primary btn-block" style="margin-top:12px" onclick="UI.stub()">Импортировать</button>
            </section>`;

        const xlsxPane = `
            <section class="card"><h2 class="card-title">Экспорт XLSX</h2>
                <p class="small muted" style="margin-top:0">Полный реестр трейдеров с настройками и статистикой — для правки в Excel и обратного импорта.</p>
                <button class="btn btn-block" onclick="UI.stub()">${UI.ICONS.download} Скачать trader-настройки.xlsx</button>
            </section>
            <section class="card"><h2 class="card-title">Импорт XLSX</h2>
                <div class="field"><label>Файл .xlsx</label><input type="text" placeholder="Нажмите, чтобы выбрать файл" onclick="UI.stub()" readonly></div>
                <label class="check"><input type="checkbox"> создавать новых трейдеров из строк с неизвестным адресом</label>
                <button class="btn btn-primary btn-block" style="margin-top:12px" onclick="UI.stub()">Импортировать настройки</button>
            </section>`;

        const tagsPane = `
            <section class="card"><h2 class="card-title">Текущие теги</h2>
                <div class="chip-row" style="flex-wrap:wrap">${M.availableTags.map(t =>
                    `<span class="chip">${esc(t)} <span onclick="UI.stub()" style="opacity:.6;margin-left:2px">×</span></span>`).join('')}</div>
                <div style="display:flex;gap:9px;margin-top:11px">
                    <input type="text" placeholder="новый тег">
                    <button class="btn" onclick="UI.stub()">${UI.ICONS.plus} Добавить</button>
                </div>
            </section>
            <section class="card"><h2 class="card-title">Теги у выбранных трейдеров</h2>
                <div class="hint" style="margin:-4px 0 12px">Выбор — на вкладке «Операции» (выбрано: ${bulkSel.size})</div>
                <div class="field"><label>Операция с тегами</label><select><option>добавить</option><option>убрать</option><option>заменить</option></select></div>
                <div class="field"><label>Теги</label>
                    <div class="chip-row" style="flex-wrap:wrap">${M.availableTags.map(t =>
                        `<span class="chip" onclick="this.classList.toggle('on')">${esc(t)}</span>`).join('')}</div></div>
                <button class="btn btn-primary btn-block" onclick="UI.stub()">Применить к выбранным</button>
            </section>`;

        const body = `
            <div class="tabs">
                <button data-tab="ops" class="on">Операции</button>
                <button data-tab="imp">Импорт</button>
                <button data-tab="xlsx">XLSX</button>
                <button data-tab="tags">Теги</button>
            </div>
            <div class="tab-pane on" data-pane="ops">${opsPane}</div>
            <div class="tab-pane" data-pane="imp">${importPane}</div>
            <div class="tab-pane" data-pane="xlsx">${xlsxPane}</div>
            <div class="tab-pane" data-pane="tags">${tagsPane}</div>`;
        return UI.shell({ title: 'Массовые операции', body });
    });

    // ------------------------------------------------ Настройки
    UI.route('settings', () => {
        const s = M.settings, sys = M.system;
        const save = `<button class="btn btn-primary btn-block" onclick="UI.stub()">Сохранить</button>`;

        const trading = `
            <section class="card"><h2 class="card-title">Фильтрация</h2>
                <div class="field"><label>Разрешённые символы (allowed_symbols)</label>
                    <input type="text" value="${esc(s.allowed_symbols)}">
                    <div class="hint">Пусто — копируются все инструменты трейдера</div></div>
            </section>
            <section class="card"><h2 class="card-title">Risk scaling</h2>
                <div class="field-grid">
                    <div class="field"><label>Scale factor</label><input type="number" step="0.01" value="${s.scale_factor}"></div>
                    <div class="field"><label>Cooldown, сек</label><input type="number" value="${s.cooldown_seconds}"></div>
                </div>
                <div class="field"><label>Частота опроса кошельков, мин (poll_interval_minutes)</label>
                    <input type="number" value="${s.poll_interval_minutes}"></div>
            </section>
            <section class="card"><h2 class="card-title">Кредитное плечо</h2>
                <div class="field"><label>Плечо по умолчанию (default_leverage)</label><input type="number" value="${s.default_leverage}"></div>
                <div class="field"><label>Переопределение по символам (symbol_leverage)</label>
                    <input type="text" value="${esc(s.symbol_leverage)}">
                    <div class="hint">Формат: BTC=5, ETH=2</div></div>
            </section>${save}`;

        const sim = `
            <section class="card"><h2 class="card-title">Симулятор копитрейдинга</h2>
                <div class="field-grid">
                    <div class="field"><label>Виртуальный баланс, USDC</label><input type="number" value="${s.virtual_balance}"></div>
                    <div class="field"><label>Режим размера (sizing_mode)</label><select>
                        <option ${s.sizing_mode === 'percent_balance' ? 'selected' : ''}>percent_balance</option>
                        <option ${s.sizing_mode === 'fixed' ? 'selected' : ''}>fixed</option></select></div>
                    <div class="field"><label>Фикс. сумма на сделку, $</label><input type="number" value="${s.sizing_fixed_usd}"></div>
                    <div class="field"><label>% от баланса</label><input type="number" value="${s.sizing_percent}"></div>
                    <div class="field"><label>Мин. объём моего ордера, $</label><input type="number" value="${s.position_min_usd}"></div>
                    <div class="field"><label>Макс. объём моего ордера, $ (0 = без лимита)</label><input type="number" value="${s.position_max_usd}"></div>
                    <div class="field"><label>Комиссия за сторону, %</label><input type="number" step="0.005" value="${s.fee_pct_per_side}"></div>
                    <div class="field"><label>Слиппедж за сторону, %</label><input type="number" step="0.005" value="${s.slippage_pct_per_side}"></div>
                </div>
                <div class="field"><label>Funding в час, %</label><input type="number" step="0.0001" value="${s.funding_rate_hourly_pct}"></div>
            </section>
            <section class="card"><h2 class="card-title">Частичное закрытие и отложенный вход</h2>
                <div class="field"><label>Частичное закрытие (partial_close_mode)</label><select>
                    <option ${s.partial_close_mode === 'off' ? 'selected' : ''}>off</option>
                    <option ${s.partial_close_mode === 'on' ? 'selected' : ''}>on</option></select></div>
                <div class="switch-row"><div><div class="sw-label">Отложенный вход по просадке</div>
                    <div class="sw-sub">copy_after_drawdown_enabled</div></div>
                    <label class="switch"><input type="checkbox" ${s.copy_after_drawdown_enabled ? 'checked' : ''}><span class="tr"></span></label></div>
                <div class="field"><label>Порог просадки, %</label><input type="number" step="0.5" value="${s.copy_after_drawdown_pct}"></div>
            </section>${save}`;

        const exec = `
            <section class="card"><h2 class="card-title">Исполнение</h2>
                <div class="field"><label>Режим (executor_mode)</label><select>
                    <option ${s.executor_mode === 'mock' ? 'selected' : ''}>mock</option>
                    <option ${s.executor_mode === 'live' ? 'selected' : ''}>live</option></select>
                    <div class="hint">mock — симуляция; live — реальные ордера через executor</div></div>
                <div class="field"><label>Executor URL</label><input type="text" value="${esc(s.executor_url)}" placeholder="http://127.0.0.1:9000"></div>
            </section>${save}`;

        const notify = `
            <section class="card"><h2 class="card-title">Telegram</h2>
                <div class="field"><label>Bot token</label><input type="password" value="${esc(s.telegram_bot_token)}"></div>
                <div class="field"><label>Chat ID</label><input type="text" value="${esc(s.telegram_chat_id)}"></div>
                <div class="switch-row"><div class="sw-label">Слать уведомления по умолчанию</div>
                    <label class="switch"><input type="checkbox" ${s.telegram_notify ? 'checked' : ''}><span class="tr"></span></label></div>
            </section>${save}`;

        const tags = `
            <section class="card"><h2 class="card-title">Управление тегами</h2>
                <div class="field"><label>Доступные теги — по одному на строку или через запятую</label>
                    <textarea class="mono">${M.availableTags.join('\n')}</textarea></div>
                <button class="btn btn-primary btn-block" onclick="UI.stub()">Сохранить теги</button>
            </section>`;

        const system = `
            <section class="card"><h2 class="card-title">Статус бота</h2>
                <div class="stat-pairs" style="grid-template-columns:1fr">
                    <div class="sp"><span class="muted">Cron</span><b class="${sys.cronOk ? 'up-t' : 'down-t'}"><span class="pulse"></span> ${sys.cronOk ? 'OK' : 'ПРОБЛЕМА'} · тик ${sys.cronLastTickSec}с назад</b></div>
                    <div class="sp"><span class="muted">Последний запуск</span><b class="mono">${sys.lastRun}</b></div>
                    <div class="sp"><span class="muted">Сигналов сегодня</span><b class="mono">${sys.signalsToday}</b></div>
                </div>
            </section>
            <section class="card"><h2 class="card-title">Хранение сигналов</h2>
                <div class="field"><label>Срок хранения сигналов, дней (signals_retention_days)</label>
                    <input type="number" value="${s.signals_retention_days}"></div>
                <button class="btn btn-primary btn-block" onclick="UI.stub()">Сохранить срок хранения</button>
            </section>
            <section class="card danger-card"><h2 class="card-title">Сброс state всех трейдеров</h2>
                <label class="check"><input type="checkbox"> очистить bot.log</label>
                <label class="check"><input type="checkbox"> удалить сделки и сигналы из БД (необратимо)</label>
                <button class="btn btn-danger btn-block" style="margin-top:12px" onclick="UI.stub()">Сбросить state всех трейдеров</button>
            </section>`;

        const body = `
            <div class="tabs">
                <button data-tab="tr" class="on">Торговля</button>
                <button data-tab="sim">Симулятор</button>
                <button data-tab="ex">Исполнение</button>
                <button data-tab="nt">Уведомления</button>
                <button data-tab="tg">Теги</button>
                <button data-tab="sys">Система</button>
            </div>
            <div class="tab-pane on" data-pane="tr">${trading}</div>
            <div class="tab-pane" data-pane="sim">${sim}</div>
            <div class="tab-pane" data-pane="ex">${exec}</div>
            <div class="tab-pane" data-pane="nt">${notify}</div>
            <div class="tab-pane" data-pane="tg">${tags}</div>
            <div class="tab-pane" data-pane="sys">${system}</div>`;
        return UI.shell({ title: 'Настройки', body });
    });

    // ------------------------------------------------ Логин
    UI.route('login', () => `
        <div class="login-wrap">
            <div class="login-card">
                <div class="login-logo">H</div>
                <h1 class="login-title">Hyper Analytics</h1>
                <p class="muted" style="margin:0 0 22px">Терминал копитрейдинга</p>
                <div class="field" style="text-align:left"><label>Пароль</label>
                    <input type="password" placeholder="••••••••" onkeydown="if(event.key==='Enter')location.hash='#/'"></div>
                <button class="btn btn-primary btn-block" onclick="location.hash='#/'">Войти</button>
                <div class="hint" style="margin-top:14px">Демо-режим: любой пароль подойдёт</div>
            </div>
        </div>`);
})(window.UI);
