// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

extern crate dbus;
extern crate getopts;
extern crate protobuf;

pub mod backends;
pub mod frontends;
pub mod lsb_release;
pub mod proto;
pub mod unsafe_misc;

use std::collections::BTreeMap;
use std::env;
use std::error::Error;

use getopts::Options;

use backends::ChromeOS;
use frontends::{EnvMap, FRONTENDS};

fn make_options() -> Options {
    let mut opts = Options::new();
    opts.optflag("h", "help", "print this help menu");

    opts
}

fn print_usage(program_name: &str, opts: &Options) {
    eprintln!("Crostini client\n");
    let brief = format!("USAGE: {} [SUBCOMMAND|FRONTEND]", program_name);
    eprintln!("{}", opts.usage(&brief));

    eprint!("Alternatively, invoke a supported FRONTEND: ");
    let mut first = true;
    for frontend in FRONTENDS {
        if !first {
            eprint!(", ");
        }
        eprint!("{}", frontend.name());
        first = false;
    }
    eprintln!("\n-----");

    for frontend in FRONTENDS {
        frontend.print_usage(frontend.name());
        eprintln!("-----");
    }
}

fn main() -> Result<(), Box<dyn Error>> {
    let args_string: Vec<String> = env::args().collect();
    let args: Vec<&str> = args_string.iter().map(|s| s.as_str()).collect();
    let vars_string: BTreeMap<String, String> = env::vars().collect();
    let vars: EnvMap = vars_string
        .iter()
        .map(|(k, v)| (k.as_str(), v.as_str()))
        .collect();

    if args.is_empty() {
        print_usage("crostini_client", &make_options());
        return Ok(());
    }

    // Match the program name against frontend names.
    for frontend in FRONTENDS {
        if args[0].ends_with(frontend.name()) {
            return frontend.run(&mut ChromeOS::new()?, &args, &vars);
        }
    }

    if args.len() == 1 {
        print_usage(&args[0], &make_options());
        return Ok(());
    }

    // Next, match the subcommand against frontend names.
    for frontend in FRONTENDS {
        if args[1].ends_with(frontend.name()) {
            return frontend.run(&mut ChromeOS::new()?, &args[1..], &vars);
        }
    }

    eprintln!("unrecognized frontend name: `{}`", args[0]);
    std::process::exit(1);
}
