use std::{path::PathBuf, sync::Arc};

use harmony::{
    inventory::Inventory,
    maestro::Maestro,
    modules::{
        application::{
            ApplicationScore, RustWebFramework, RustWebapp,
            features::{ContinuousDelivery, Monitoring},
        },
        monitoring::alert_channel::{
            discord_alert_channel::DiscordWebhook, webhook_receiver::WebhookReceiver,
        },
    },
    topology::{K8sAnywhereTopology, Url},
};

#[tokio::main]
async fn main() {
    env_logger::init();

    let topology = K8sAnywhereTopology::from_env();
    let mut maestro = Maestro::initialize(Inventory::autoload(), topology)
        .await
        .unwrap();

    let application = Arc::new(RustWebapp {
        name: "harmony-example-rust-webapp".to_string(),
        domain: Url::Url(url::Url::parse("https://rustapp.harmony.example.com").unwrap()),
        project_root: PathBuf::from("./webapp"), // Relative from 'harmony-path' param
        framework: Some(RustWebFramework::Leptos),
    });

    let discord_receiver = DiscordWebhook {
        name: "test-discord".to_string(),
        url: Url::Url(url::Url::parse("https://discord.doesnt.exist.com").unwrap()),
    };

    let webhook_receiver = WebhookReceiver {
        name: "sample-webhook-receiver".to_string(),
        url: Url::Url(url::Url::parse("https://webhook-doesnt-exist.com").unwrap()),
    };

    let app = ApplicationScore {
        features: vec![
            Box::new(ContinuousDelivery {
                application: application.clone(),
            }),
            Box::new(Monitoring {
                application: application.clone(),
                alert_receiver: vec![Box::new(discord_receiver), Box::new(webhook_receiver)],
            }),
            // TODO add backups, multisite ha, etc
        ],
        application,
    };

    maestro.register_all(vec![Box::new(app)]);
    harmony_cli::init(maestro, None).await.unwrap();
}
