// SPDX-License-Identifier: MIT
//
// Copyright IBM Corp. 2025

//! Main function for the PV Info Tool

use std::io::{self, Write};

use anyhow::Result;
use clap::Parser;

mod cli;
mod constants;
mod handlers;
mod io_utils;
mod pvinfo;
mod se_status;
mod strings;

use std::path::PathBuf;

use crate::cli::{CliOptions, Commands, OutputFormat};
use crate::constants::*;
use crate::handlers::handle_supported_flags;
use crate::io_utils::check_uv_exists;
use crate::pvinfo::PvInfo;
use crate::se_status::SeStatus;

fn main() -> Result<()> {
    // Parse CLI arguments and apply post-processing
    let mut cli = CliOptions::parse();
    cli.post_process();
    let base_dir = PathBuf::from(BASE_DIR);
    let query_dir = base_dir.join(QUERY_DIR);
    let mut stdout = io::stdout();
    if cli.version {
        utils::print_version!(2025);
        return Ok(());
    }
    if let Err(e) = check_uv_exists() {
        match cli.se_status {
            true => {
                writeln!(stdout, "{}", SeStatus::Unsecure)?;
                return Ok(());
            }
            false => return Err(e),
        }
    }
    match &cli.command {
        // Handle the supported-flags subcommand
        Some(Commands::SupportedFlags {
            secret,
            attestation,
            header,
        }) => {
            handle_supported_flags(&mut stdout, *secret, *attestation, *header, query_dir)?;
        }
        None => {
            let data = PvInfo::read(&cli, &base_dir, &query_dir);
            // Print output in the requested format
            match cli.format {
                OutputFormat::Human => data.write(&mut stdout)?,
                OutputFormat::Yaml => write!(stdout, "{}", serde_yaml::to_string(&data).unwrap())?,
            }
        }
    }

    Ok(())
}
