// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

use tauri_plugin_updater::UpdaterExt;

fn main() {
    #[allow(unused_mut)]
    let mut context = tauri::generate_context!();

    tauri::Builder::default()
        .plugin(tauri_plugin_updater::Builder::new().build())
        .setup(|app| {
            let handle = app.handle().clone();
            tauri::async_runtime::spawn(async move {
                let mut builder = handle.updater_builder();
                if std::env::var("TARGET").unwrap_or_default() == "nsis" {
                    // /D sets the default installation directory ($INSTDIR),
                    // overriding InstallDir and InstallDirRegKey.
                    // It must be the last parameter used in the command line and must not contain any quotes, even if the path contains spaces.
                    // Only absolute paths are supported.
                    // NOTE: we only need this because this is an integration test and we don't want to install the app in the programs folder
                    builder = builder.installer_args(vec![format!(
                        "/D={}",
                        tauri::utils::platform::current_exe()
                            .unwrap()
                            .parent()
                            .unwrap()
                            .display()
                    )]);
                }
                let updater = builder.build().unwrap();

                match updater.check().await {
                    Ok(Some(update)) => {
                        if let Err(e) = update.download_and_install(|_, _| {}, || {}).await {
                            println!("{e}");
                            std::process::exit(1);
                        }
                        std::process::exit(0);
                    }
                    Ok(None) => {
                        std::process::exit(2);
                    }
                    Err(e) => {
                        println!("{e}");
                        std::process::exit(1);
                    }
                }
            });
            Ok(())
        })
        .run(context)
        .expect("error while running tauri application");
}
