#!/usr/bin/env python

import asyncio
import getopt
import os
import pprint
import sys
import traceback
import uuid
import toml
import pandas as pd
import importlib.util
from datetime import datetime, timedelta, date
from typing import List, Dict, Optional

import alpaca_trade_api as tradeapi
import pygit2
import pytz
from requests.exceptions import HTTPError

from liualgotrader.common import config, market_data, trading_data
from liualgotrader.common.database import create_db_connection
from liualgotrader.common.decorators import timeit
from liualgotrader.common.tlog import tlog
from liualgotrader.fincalcs.vwap import add_daily_vwap
from liualgotrader.models.algo_run import AlgoRun
from liualgotrader.models.new_trades import NewTrade
from liualgotrader.models.trending_tickers import TrendingTickers
from liualgotrader.strategies.base import Strategy, StrategyType
from liualgotrader.scanners.base import Scanner
from liualgotrader.scanners.momentum import Momentum
from liualgotrader import backtester

if __name__ == "__main__":
    try:
        config.build_label = pygit2.Repository("../").describe(
            describe_strategy=pygit2.GIT_DESCRIBE_TAGS
        )
    except pygit2.GitError:
        import liualgotrader

        config.build_label = liualgotrader.__version__ if hasattr(liualgotrader, "__version__") else ""  # type: ignore

    if len(sys.argv) == 1:
        backtester.show_usage()
        sys.exit(0)

    config.filename = os.path.basename(__file__)

    folder = (
        config.tradeplan_folder
        if config.tradeplan_folder[-1] == "/"
        else f"{config.tradeplan_folder}/"
    )
    fname = f"{folder}{config.configuration_filename}"
    try:
        conf_dict = toml.load(fname)
        tlog(f"loaded configuration file from {fname}")
    except FileNotFoundError:
        tlog(f"[ERROR] could not locate tradeplan file {fname}")
        sys.exit(0)
    conf_dict = toml.load(config.configuration_filename)
    config.portfolio_value = conf_dict.get("portfolio_value", None)
    if "risk" in conf_dict:
        config.risk = conf_dict["risk"]

    try:
        strict = False
        opts, args = getopt.getopt(
            sys.argv[1:], "vb:d:s", ["batch-list", "version", "debug-symbol=", "strict"]
        )
        debug_symbols = []
        for opt, arg in opts:
            if opt in ("-v", "--version"):
                backtester.show_version(config.filename, config.build_label)
                break
            elif opt in ("--batch-list", "-b"):
                backtester.get_batch_list()
                break
            elif opt in ("--debug-symbol", "-d"):
                debug_symbols.append(arg)
            elif opt in ("--strict", "-s"):
                strict = True

        for arg in args:
            backtester.backtest(arg, debug_symbols, conf_dict, strict)

    except getopt.GetoptError as e:
        print(f"Error parsing options:{e}\n")
        backtester.show_usage()
        sys.exit(0)

    sys.exit(0)
