mod application;
mod cli;
mod config;
mod core;
mod i18n;
mod ui;
mod window;

use clap::Parser;
use glib::ExitCode;
use gtk::prelude::*;

use application::DriftwoodApplication;
use config::{APP_ID, GSETTINGS_SCHEMA_DIR};

fn main() -> ExitCode {
    // Point GSettings at our compiled schema directory (dev builds).
    // SAFETY: Called before any threads are spawned, at program start.
    unsafe { std::env::set_var("GSETTINGS_SCHEMA_DIR", GSETTINGS_SCHEMA_DIR); }

    // Parse CLI arguments
    let parsed = cli::Cli::parse();

    // If a subcommand was given, run in CLI mode (no GUI)
    if let Some(command) = parsed.command {
        // Initialize GTK minimally for GSettings access
        gtk::init().expect("Failed to initialize GTK");
        return cli::run_command(command);
    }

    // Otherwise, launch the full GUI application
    gio::resources_register_include!("driftwood.gresource")
        .expect("Failed to register resources");

    let app = DriftwoodApplication::new(APP_ID, &gio::ApplicationFlags::empty());
    app.run()
}
