// Archipelago Bitcoin Node OS - Native Backend
// Pure Archipelago implementation, no StartOS dependencies

use anyhow::Result;
use std::net::SocketAddr;
use tracing::info;

mod api;
mod auth;
mod backup;
mod config;
mod electrs_status;
mod container;
mod port_allocator;
mod data_model;
mod identity;
mod node_message;
mod nostr_discovery;
mod peers;
mod server;
mod session;
mod state;
mod totp;

use auth::AuthManager;
use config::Config;
use server::Server;

/// Default dev password when auto-creating a user (matches mock-backend).
const DEV_DEFAULT_PASSWORD: &str = "password123";

#[tokio::main]
async fn main() -> Result<()> {
    // Initialize tracing
    tracing_subscriber::fmt()
        .with_env_filter(
            tracing_subscriber::EnvFilter::try_from_default_env()
                .unwrap_or_else(|_| "archipelago=debug,info".into()),
        )
        .init();

    info!("🚀 Starting Archipelago Bitcoin Node OS");

    // Load configuration
    let config = Config::load().await?;
    info!("📁 Data directory: {}", config.data_dir.display());

    // In dev mode, ensure a default user exists so login works without manual setup
    if config.dev_mode {
        let auth = AuthManager::new(config.data_dir.clone());
        if !auth.is_setup().await? {
            auth.setup_user(DEV_DEFAULT_PASSWORD).await?;
            info!("👤 Created default dev user (password: {})", DEV_DEFAULT_PASSWORD);
        }
    }

    // Create server
    let server = Server::new(config.clone()).await?;

    // Start server
    let addr: SocketAddr = format!("{}:{}", config.bind_host, config.bind_port)
        .parse()
        .expect("Invalid bind address");

    info!("🌐 Server listening on http://{}", addr);
    info!("📡 RPC API: http://{}/rpc/v1", addr);
    info!("🔌 WebSocket: ws://{}/ws", addr);

    server.serve(addr).await?;

    Ok(())
}
