use anyhow::Result;
use clap::arg_enum;
use std::{path::PathBuf, time::Duration};
use structopt::StructOpt;

use bazelci_agent::artifact::upload;

arg_enum! {
    #[allow(non_camel_case_types)]
    enum UploadMode {
        // Upload as Buildkite's artifacts
        buildkite,
    }
}

/// Upload/download artifacts from Bazel CI tasks
#[derive(StructOpt)]
enum ArtifactCommand {
    /// Upload artifacts (e.g. test logs for failed tests) from Bazel CI tasks
    #[structopt(rename_all = "snake")]
    Upload {
        /// Don't actually upload files for debug purpose
        #[structopt(long)]
        dry: bool,
        /// Upload various files for debug purpose
        #[structopt(long)]
        debug: bool,
        /// The file contains the JSON serialisation of the build event protocol.
        /// The agent "watches" this file until "last message" encountered
        #[structopt(long, parse(from_os_str))]
        build_event_json_file: Option<PathBuf>,
        /// The desitnation the artifacts should be uploaded to
        #[structopt(long, possible_values = &UploadMode::variants(), case_insensitive = true)]
        mode: Option<UploadMode>,
        /// The seconds to wait before watching the BEP file
        #[structopt(long)]
        delay: Option<u64>,
        /// BEP json file is uploaded if there are flaky tests
        #[structopt(long)]
        monitor_flaky_tests: bool,
    },
}

#[derive(StructOpt)]
#[structopt(rename_all = "snake")]
enum Command {
    Artifact(ArtifactCommand),
}

fn main() -> Result<()> {
    let cmd = Command::from_args();

    let subscriber = tracing_subscriber::FmtSubscriber::new();
    tracing::subscriber::set_global_default(subscriber).unwrap();

    match cmd {
        Command::Artifact(cmd) => match cmd {
            ArtifactCommand::Upload {
                dry,
                debug,
                build_event_json_file,
                mode,
                delay,
                monitor_flaky_tests,
            } => {
                let mode = match mode {
                    Some(UploadMode::buildkite) => upload::Mode::Buildkite,
                    None => upload::Mode::Buildkite,
                };
                upload::upload(
                    dry,
                    debug,
                    build_event_json_file.as_ref().map(|p| p.as_path()),
                    mode,
                    delay.map(|secs| Duration::from_secs(secs)),
                    monitor_flaky_tests,
                )?;
            }
        },
    }

    Ok(())
}
