use std::{fs, thread};

use brk_core::{dot_brk_log_path, dot_brk_path};
use brk_query::Params as QueryArgs;
use clap::Parser;
use clap_derive::{Parser, Subcommand};
use query::query;
use run::{RunConfig, run};

mod query;
mod run;

#[derive(Parser)]
#[command(version, about)]
#[command(propagate_version = true)]
struct Cli {
    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand, Debug)]
enum Commands {
    /// Run the indexer, computer and server, use `run -h` for more information
    Run(RunConfig),
    /// Query generated datasets via the `run` command in a similar fashion as the server's API, use `query -h` for more information
    Query(QueryArgs),
}

pub fn main() -> color_eyre::Result<()> {
    color_eyre::install()?;

    fs::create_dir_all(dot_brk_path())?;

    brk_logger::init(Some(&dot_brk_log_path()));

    let cli = Cli::parse();

    thread::Builder::new()
        .stack_size(128 * 1024 * 1024)
        .spawn(|| match cli.command {
            Commands::Run(args) => run(args),
            Commands::Query(args) => query(args),
        })?
        .join()
        .unwrap()
}
