pub mod ast;
pub mod command;
pub mod constants;
pub mod errors;
pub mod executor;
pub mod lexer;
pub mod logger;
pub mod optimizer;
pub mod parser;
pub mod pgwire;
pub mod server;
pub mod utils;

use std::sync::Arc;

use command::{Command, SubCommand};
use errors::RRDBError;
use executor::{config::global::GlobalConfig, predule::Executor};
use server::predule::Server;

use clap::Parser;

#[tokio::main]
async fn main() -> Result<(), RRDBError> {
    let args = Command::parse();

    match args.action {
        SubCommand::Init(init) => {
            let config = GlobalConfig::load_from_path(None).unwrap_or_default();

            let _init_option = init.init;

            let executor = Executor::new(Arc::new(config));

            executor.init_config().await?;
            executor.init_database().await?;
        }
        SubCommand::Run(run) => {
            let config = GlobalConfig::load_from_path(run.value.config).expect("config load error");

            let server = Server::new(config);

            server.run().await?;
        }
        SubCommand::Client => {
            println!("Client");
            unimplemented!();
        }
    }

    Ok(())
}