// Copyright (C) 2023 The Android Open Source Project
//
// 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::PathBuf;

use anyhow::Result;
use clap::Parser;
use crate_health::{
    default_output_dir, default_repo_root, maybe_build_cargo_embargo, CrateCollection,
    NameAndVersionMap, ReportEngine,
};

/// Generate a health report for crates in external/rust/crates
#[derive(Parser, Debug)]
#[command(about, long_about = None)]
struct Args {
    /// Path to the AOSP repo. Defaults to current working directory.
    #[arg(long, default_value_os_t=default_repo_root().unwrap_or(PathBuf::from(".")))]
    repo_root: PathBuf,

    /// Path the health report will be written to.
    #[arg(long, default_value_os_t=default_output_dir("crate-health-report.html"))]
    output_path: PathBuf,
}

fn main() -> Result<()> {
    let args = Args::parse();

    maybe_build_cargo_embargo(&args.repo_root, false)?;

    let mut cc = CrateCollection::new(args.repo_root);
    cc.add_from(&"external/rust/crates")?;
    cc.map_field_mut().retain(|_nv, krate| krate.is_crates_io());

    cc.stage_crates()?;
    cc.generate_android_bps()?;
    cc.diff_android_bps()?;

    let re = ReportEngine::new()?;

    Ok(re.health_report(&cc, &args.output_path)?)
}