import { logInfo, logDebug, logWarn, logError, LogLevel, setLogLevel } from "./utils/logger";
import { loadCookiesFromFile } from "./utils/cookieManager";
import { TVClient, TVClientOptions } from "./tradingview/tvClient";
import yargs from "yargs";
import { hideBin } from "yargs/helpers";

// === CONFIG UTILISATEUR ===
const argv = yargs(hideBin(process.argv))
    .usage('Usage: $0 <symbol> [options]')
    .positional('symbol', {
        describe: 'Le symbole à scraper (ex: BINANCE:BTCUSDT)',
        type: 'string',
        demandOption: true
    })
    .option("timeframe", {
        alias: "t",
        type: "string",
        description: "Timeframe (ex: 1, 5, 15)",
        default: "1"
    })
    .help()
    .argv;

const SYMBOL = argv._[0];
const TIMEFRAME = argv.timeframe;

const MAX_DATE = "2050-01-01";
const MIN_DATE = "2000-01-01";

const COOKIE_FILE = "cookies.json";
const API_URL = "https://candles.macrofinder.flolep.fr/candles";
const BATCH_SIZE = 5000;

const MIN_DATE_MS = Date.parse(MIN_DATE);
const MAX_DATE_MS = Date.parse(MAX_DATE);

const PER_QUERY = 10_000;

// === LOGGING SYSTEM ===
const DEBUG_MODE = false;
(globalThis as any).TW_DEBUG = DEBUG_MODE;
setLogLevel(DEBUG_MODE ? LogLevel.DEBUG : LogLevel.INFO);

// === INIT COOKIES ===
logInfo("Initializing TradingView scraper");
logInfo(`Target symbol: ${SYMBOL}, Timeframe: ${TIMEFRAME}`);
logInfo(`Max date: ${MAX_DATE}, Min date: ${MIN_DATE}`);
logInfo(`Batch size: ${BATCH_SIZE}, Per query: ${PER_QUERY}`);
logInfo(`API URL: ${API_URL}`);

const cookies = loadCookiesFromFile(COOKIE_FILE);
const SESSIONID: string = cookies["sessionid"];
const SIGNATURE: string = cookies["sessionid_sign"];
if (!SESSIONID || !SIGNATURE) {
    const error = "SessionID or Signature not found in cookies file";
    logError(error);
    throw new Error(error);
}
logDebug("SessionID and Signature found in cookies");

// === CLIENT TV ===
const tvOptions: TVClientOptions = {
    sessionId: SESSIONID,
    signature: SIGNATURE,
    symbol: SYMBOL,
    timeframe: TIMEFRAME,
    apiUrl: API_URL,
    batchSize: BATCH_SIZE,
    minDateMs: MIN_DATE_MS,
    maxDateMs: MAX_DATE_MS,
    perQuery: PER_QUERY,
};

const tvClient = new TVClient(tvOptions);
tvClient.start();