Documentation
use clap::{Parser as clapParser, builder::Str};

use std::{
    cell::RefCell, fs::File, io::Read, rc::Rc, path::Path
};
 
use ::ospl::ospl::{
    interpreter::Context, parser::Parser, *
};

use ospm::packages;

#[derive(clapParser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
    //inster funny remark here
    #[arg(short='r', long, default_value="")]
    run: String,
    #[arg(short='i', long, default_value="")]
    install: String,
    #[arg(short='l', long)]
    local: bool,
    #[arg(short='d', long, default_value="")]
    remove: String,
    #[arg(short='q', long, default_value="")]
    query: String,
}

fn runfile(path: String, target: &str) {
    // set up
    let ctx: Rc<RefCell<Context>> = Rc::new(RefCell::new(Context::new(None)));
    let p = &mut Parser::new(&path);

    // load file data
    let mut file: File;
    if Path::new(&path).is_dir() {
        file = File::open(format!("{}/main.ospl", path)).expect("file not found!");
    } else {
        file = File::open(path).expect("file not found!");
    }
    let mut s = String::new();
    file.read_to_string(&mut s).expect("failed to read file!");

    // run!
    match target.as_ref() {
        "stmts" => parser::stmts(ctx.clone(), p, &s),
        "block" => parser::block(ctx.clone(), p, &s),
        "stmt" => parser::stmt(ctx.clone(), p, &s),
        "expr" => parser::expr(ctx.clone(), p, &s),
        _ => panic!("unknown target")
    }
}

fn main() {
    let args = Args::parse();
    if args.run != "" {
        //let p = parser::Parser::new();
        runfile(args.run, "stmts");
    } else if args.install != "" {
        println!("tring to install package '{}'... ", args.install);
        let package_name = packages::open_package(args.install, args.local).expect("error installing the package!");
        println!("done! package {} installed (version {})", package_name["package"]["name"], package_name["package"]["version"]);
    } else if args.remove != "" {
        packages::remove_package(args.remove);
    } else if args.query != "" {
        let query = packages::query_package(args.query);
        println!("{}", query)
    }
}