use crate::presenter;

use super::{UJMTError, read};

use clap::{Arg, Command, ArgMatches, ArgAction};

pub fn init() -> Command {
    Command::new("generate_json")
        .about("Generate a JSON file from a Drawio XML file")
        .arg(
            Arg::new("file")
                .help("Drawio XML file")
                .action(ArgAction::Set)
        )
        .arg(
            Arg::new("out_dir")
                .short('o')
                .default_value(".")
                .help("output directory")
                .action(ArgAction::Set),
        )
}

pub fn exec(args: &ArgMatches) -> Result<(), UJMTError> {

    info!("Execute Generate");

    let file = args.get_one::<String>("file").unwrap();
    let result = read(file).map_err(|error| UJMTError::FileInputError(error))?;

    let out_dir = args.get_one::<String>("out_dir").unwrap();

    debug!("Use File: \"{}\"", file);
    debug!("Use Output Directory: \"{}\"", out_dir);

    if file.ends_with(".drawio") || file.ends_with(".xml")
    {
        generate_from_xml(result, file, out_dir)
                .map_err(|error| UJMTError::GenerationFailed(error))?;
    }
    Ok(())
}

fn generate_from_xml(text: String, out_dir: &str, out_file: &str) -> Result<(), presenter::PresenterError> { 
    presenter::to_json_from_xml(text, out_dir, out_file)
}