"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
    return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (g && (g = 0, op[0] && (_ = 0)), _) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", { value: true });
require("dotenv/config");
var node_fs_1 = require("node:fs");
var yaml_1 = require("yaml");
var pino_1 = require("pino");
var shadowBook_1 = require("../../packages/utils/src/shadowBook");
var adapter_1 = require("../../packages/connectors/pacifica/src/adapter");
var orderRouter_1 = require("../../packages/execution/src/orderRouter");
var marketMaker_1 = require("../../packages/strategies/src/marketMaker");
var microScalper_1 = require("../../packages/strategies/src/microScalper");
var gridMaker_1 = require("../../packages/strategies/src/gridMaker");
var hedgeEngine_1 = require("../../packages/hedge/src/hedgeEngine");
var logger = (0, pino_1.default)({ level: process.env.LOG_LEVEL || "info" });
var cfg = (0, yaml_1.parse)((0, node_fs_1.readFileSync)("config/config.yaml", "utf8"));
var baseUrl = process.env.PACIFICA_API_BASE || cfg.api_base;
var adapter = new adapter_1.PacificaAdapter({
    baseUrl: baseUrl,
    apiKey: process.env.PACIFICA_API_KEY,
    secret: process.env.PACIFICA_API_SECRET,
    subaccount: process.env.PACIFICA_SUBACCOUNT || "main",
});
var shadow = new shadowBook_1.ShadowBook();
function refreshBook(symbol) {
    return __awaiter(this, void 0, void 0, function () {
        var _a, _b, e_1;
        return __generator(this, function (_c) {
            switch (_c.label) {
                case 0:
                    _c.trys.push([0, 2, , 3]);
                    _b = (_a = shadow).set;
                    return [4 /*yield*/, adapter.getBook(symbol)];
                case 1:
                    _b.apply(_a, [_c.sent()]);
                    return [3 /*break*/, 3];
                case 2:
                    e_1 = _c.sent();
                    logger.error({ err: e_1 }, "book refresh failed");
                    return [3 /*break*/, 3];
                case 3: return [2 /*return*/];
            }
        });
    });
}
var router = new orderRouter_1.OrderRouter(function (o) { return adapter.place(o); }, function () { return shadow.get(); }, { maxBps: 5 });
// Initialize HedgeEngine (需要对冲账户 adapter，这里暂用同一个 adapter)
var hedgeEngine = new hedgeEngine_1.HedgeEngine(cfg.hedge || { kp: 0.6, ki: 0.05, Qmax: 0.4, minIntervalMs: 200 }, function (o) { return adapter.place(o); }, function () { return shadow.mid(); });
function main() {
    return __awaiter(this, void 0, void 0, function () {
        var strategyMode, symbol, gridConfig, gridMaker_2, mm_1, scalp_1;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    strategyMode = cfg.strategy_mode || 'scalper';
                    symbol = cfg.symbols[0] || "BTC";
                    logger.info({ symbol: symbol, baseUrl: baseUrl, strategyMode: strategyMode }, "runner start");
                    // 行情刷新
                    setInterval(function () { return refreshBook(symbol); }, 250);
                    if (!(strategyMode === 'grid' || strategyMode === 'both')) return [3 /*break*/, 2];
                    logger.info({ gridConfig: cfg.grid }, 'Starting Grid strategy');
                    gridConfig = {
                        symbol: cfg.grid.symbol || symbol,
                        gridStepBps: cfg.grid.grid_step_bps,
                        gridRangeBps: cfg.grid.grid_range_bps,
                        baseClipUsd: cfg.grid.base_clip_usd,
                        maxLayers: cfg.grid.max_layers,
                        hedgeThresholdBase: cfg.grid.hedge_threshold_base
                    };
                    gridMaker_2 = new gridMaker_1.GridMaker(gridConfig, router, hedgeEngine, shadow);
                    // 初始化网格
                    return [4 /*yield*/, gridMaker_2.initialize()];
                case 1:
                    // 初始化网格
                    _a.sent();
                    // 模拟 Fill 事件监听（实际需要从 adapter 或 WebSocket 获取）
                    // adapter.onFill((fill: Fill) => gridMaker.onFill(fill));
                    // 定期输出状态
                    setInterval(function () {
                        var status = gridMaker_2.getStatus();
                        logger.info({ status: status }, 'Grid status');
                    }, 30000); // 每 30 秒
                    _a.label = 2;
                case 2:
                    if (strategyMode === 'scalper' || strategyMode === 'both') {
                        logger.info('Starting MarketMaker + Scalper strategies');
                        mm_1 = new marketMaker_1.MarketMaker({ symbol: symbol, tickSz: 0.5, clipSz: 0.001, spreadBps: cfg.mm.spread_bps }, router, function () { return shadow.get(); });
                        scalp_1 = new microScalper_1.MicroScalper({
                            symbol: symbol,
                            clipSz: 0.001,
                            triggerSpreadBps: cfg.scalper.trigger.spread_bps,
                            tpBps: cfg.scalper.tp_bps,
                            slBps: cfg.scalper.sl_bps,
                            cooldownMs: cfg.scalper.trigger.min_cooldown_ms
                        }, router, function () { return shadow.get(); });
                        setInterval(function () { return mm_1.onTick(); }, cfg.mm.reprice_ms);
                        setInterval(function () { return scalp_1.onBook(); }, 150);
                    }
                    return [2 /*return*/];
            }
        });
    });
}
main().catch(function (e) { logger.error(e); process.exit(1); });
