// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use std::path;

use clap::Parser;
use cmd_runner::{
    cargo_workspace::{CargoOptions, CargoWorkspaceSubcommand, FormatterOptions},
    license_checker::LicenseSubcommand,
};
use license::LICENSE_CHECKER;
use xshell::{cmd, Shell};

mod license;

#[derive(clap::Parser)]
struct Cli {
    #[clap(subcommand)]
    subcommand: Subcommand,
}

#[derive(clap::Subcommand, Debug, Clone)]
enum Subcommand {
    VerifyCi {
        #[command(flatten)]
        cargo_options: CargoOptions,
    },
    #[command(flatten)]
    CargoWorkspace(CargoWorkspaceSubcommand),
    #[command(flatten)]
    License(LicenseSubcommand),
}

#[rustfmt::skip]
fn main() -> anyhow::Result<()> {
    let args = Cli::parse();
    let root_dir = path::Path::new(
        &std::env::var_os("CARGO_MANIFEST_DIR")
            .expect("Must be run via Cargo to establish root directory"),
    )
    .parent()
    .expect("Workspace directory should exist")
    .to_path_buf();
    let sh = Shell::new()?;
    sh.change_dir(&root_dir);
    match args.subcommand {
        Subcommand::VerifyCi { cargo_options } => {
            cargo_options.check_workspace(&sh, "common", ["--features", "testing"])?;
            FormatterOptions { reformat: false }.check_format(&sh)?;
            LICENSE_CHECKER.check(&root_dir)?;
        }
        Subcommand::CargoWorkspace(workspace) => {
            workspace.run(&sh, "common", ["--features", "testing"])?
        }
        Subcommand::License(license) => license.run(&LICENSE_CHECKER, &root_dir)?,
    }
    Ok(())
}
