use anyhow::{Ok, Result};
use clap::{Parser, Subcommand};
use std::path::PathBuf;
use amber_client::app_config::AppConfig;
use amber_client::{
get_prices, get_renewables, get_site_data, get_usage_by_date, get_user_site_id,
write_data_as_csv_to_file,
};
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[arg(short, long, value_name = "FILE")]
config_file: PathBuf,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand, Debug)]
enum Commands {
SiteDetails,
#[command(subcommand)]
Price(Window),
#[command(subcommand)]
Usage(Dates),
#[command(subcommand)]
Renewables(Window),
}
#[derive(Parser, Debug)]
enum Window {
Current,
Previous,
Next,
}
#[derive(Clone, Debug, Subcommand)]
enum Dates {
DateRange {
start_date: String,
end_date: String,
filename_to_export_to: Option<PathBuf>,
},
}
#[tokio::main]
async fn main() -> Result<()> {
let cli_args = Cli::parse();
let app_config_file = cli_args.config_file.display().to_string();
let config = AppConfig::get(app_config_file).await?;
let auth_token = config.apitoken.psk;
let base_url = config.amberconfig.base_url;
let users_state = config.userconfig.state;
let site_id = get_user_site_id(base_url.clone(), auth_token.clone()).await?;
match cli_args.command {
Commands::Price(Window::Current) => {
let _window = "current".to_string();
let current_price_data = get_prices(base_url, auth_token, site_id, _window).await?;
let current_price_data_json = serde_json::to_string(¤t_price_data)?;
println!("{}", current_price_data_json);
}
Commands::Price(Window::Previous) => {
let _window = "current?previous=1".to_string();
let current_price_data = get_prices(base_url, auth_token, site_id, _window).await?;
let current_price_data_json = serde_json::to_string(¤t_price_data)?;
println!("{}", current_price_data_json);
}
Commands::Price(Window::Next) => {
let _window = "current?next=1".to_string();
let current_price_data = get_prices(base_url, auth_token, site_id, _window).await?;
let current_price_data_json = serde_json::to_string(¤t_price_data)?;
println!("{}", current_price_data_json);
}
Commands::Renewables(Window::Current) => {
let _window = "current".to_string();
let renewables_percent_in_grid_data =
get_renewables(base_url, auth_token, users_state, _window).await?;
let renewables_percent_in_grid_json =
serde_json::to_string(&renewables_percent_in_grid_data)?;
println!("{}", renewables_percent_in_grid_json);
}
Commands::Renewables(Window::Previous) => {
let _window = "current?previous=1".to_string();
let renewables_percent_in_grid_data =
get_renewables(base_url, auth_token, users_state, _window).await?;
let renewables_percent_in_grid_json =
serde_json::to_string(&renewables_percent_in_grid_data)?;
println!("{}", renewables_percent_in_grid_json);
}
Commands::Renewables(Window::Next) => {
let _window = "current?next=1".to_string();
let renewables_percent_in_grid_data =
get_renewables(base_url, auth_token, users_state, _window).await?;
let renewables_percent_in_grid_json =
serde_json::to_string(&renewables_percent_in_grid_data)?;
println!("{}", renewables_percent_in_grid_json);
}
Commands::SiteDetails => {
let site_data = get_site_data(base_url, auth_token).await?;
let site_data_json = serde_json::to_string(&site_data)?;
println!("{}", site_data_json);
}
Commands::Usage(Dates::DateRange {
start_date,
end_date,
filename_to_export_to,
}) => {
let usage =
get_usage_by_date(base_url, auth_token, site_id, start_date, end_date).await?;
if let Some(path) = filename_to_export_to {
let new_path = path.display().to_string();
write_data_as_csv_to_file(new_path, usage).await?;
} else {
let usage_json = serde_json::to_string(&usage)?;
println!("{}", usage_json);
};
}
}
Ok(())
}