use std::{borrow::Cow, process::Command};

fn main() {
	generate_cargo_keys();
}

/// Generate the cargo keys
pub fn generate_cargo_keys() {
	generate_cargo_key_git();
	generate_cargo_key_build_date();
}

pub fn generate_cargo_key_build_date() {
	let build_date = match Command::new("date").args(["-u", "+%FT%TZ"]).output() {
		Ok(o) if o.status.success() => {
			let sha = String::from_utf8_lossy(&o.stdout).trim().to_owned();
			Cow::from(sha)
		}
		Ok(o) => {
			let status = o.status;
			println!("cargo:warning=Failed fetching the date timestamp: {status}");
			Cow::from("unknown")
		}
		Err(err) => {
			println!("cargo:warning=Failed fetching the datge: {err}");
			Cow::from("unknown")
		}
	};

	println!("cargo:rustc-env=PRDOC_CLI_BUILD_DATE={build_date}");
}

pub fn generate_cargo_key_git() {
	let commit = if let Ok(hash) = std::env::var("PRDOC_CLI_GIT_COMMIT_HASH") {
		Cow::from(hash.trim().to_owned())
	} else {
		match Command::new("git").args(["rev-parse", "--short=11", "HEAD"]).output() {
			Ok(o) if o.status.success() => {
				let tmsp = String::from_utf8_lossy(&o.stdout).trim().to_owned();
				Cow::from(tmsp)
			}
			Ok(o) => {
				let status = o.status;
				println!("cargo:warning=Git command failed with status: {status}");
				Cow::from("unknown")
			}
			Err(err) => {
				println!("cargo:warning=Failed to execute git command: {err}");
				Cow::from("unknown")
			}
		}
	};

	println!("cargo:rustc-env=PRDOC_CLI_GIT_COMMIT_HASH={commit}");
}