use harmony::{
    data::Version,
    inventory::Inventory,
    maestro::Maestro,
    modules::lamp::{LAMPConfig, LAMPScore},
    topology::{K8sAnywhereTopology, Url},
};

#[tokio::main]
async fn main() {
    // This here is the whole configuration to
    // - setup a local K3D cluster
    // - Build a docker image with the PHP project builtin and production grade settings
    // - Deploy a mariadb database using a production grade helm chart
    // - Deploy the new container using a kubernetes deployment
    // - Configure networking between the PHP container and the database
    // - Provision a public route and an SSL certificate automatically on production environments
    //
    // Enjoy :)
    let lamp_stack = LAMPScore {
        name: "harmony-lamp-demo".to_string(),
        domain: Url::Url(url::Url::parse("https://lampdemo.harmony.nationtech.io").unwrap()),
        php_version: Version::from("8.4.4").unwrap(),
        // This config can be extended as needed for more complicated configurations
        config: LAMPConfig {
            project_root: "./php".into(),
            database_size: format!("4Gi").into(),
            ..Default::default()
        },
    };

    //let monitoring = MonitoringAlertingScore {
    //    alert_receivers: vec![Box::new(DiscordWebhook {
    //        url: Url::Url(url::Url::parse("https://discord.idonotexist.com").unwrap()),
    //        // TODO write url macro
    //        // url: url!("https://discord.idonotexist.com"),
    //    })],
    //    alert_rules: vec![],
    //    scrape_targets: vec![],
    //};

    // You can choose the type of Topology you want, we suggest starting with the
    // K8sAnywhereTopology as it is the most automatic one that enables you to easily deploy
    // locally, to development environment from a CI, to staging, and to production with settings
    // that automatically adapt to each environment grade.
    let mut maestro = Maestro::<K8sAnywhereTopology>::initialize(
        Inventory::autoload(),
        K8sAnywhereTopology::from_env(),
    )
    .await
    .unwrap();

    maestro.register_all(vec![Box::new(lamp_stack)]);
    // Here we bootstrap the CLI, this gives some nice features if you need them
    harmony_cli::init(maestro, None).await.unwrap();
}
// That's it, end of the infra as code.
