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

use enumset::EnumSet;
use theseus::prelude::*;
use theseus::worlds::get_recent_worlds;

// A simple Rust implementation of the authentication run
// 1) call the authenticate_begin_flow() function to get the URL to open (like you would in the frontend)
// 2) open the URL in a browser
// 3) call the authenticate_await_complete_flow() function to get the credentials (like you would in the frontend)
pub async fn authenticate_run() -> theseus::Result<Credentials> {
    println!("A browser window will now open, follow the login flow there.");
    let login = minecraft_auth::begin_login().await?;

    println!("Open URL {} in a browser", login.redirect_uri.as_str());

    println!("Please enter URL code: ");
    let mut input = String::new();
    std::io::stdin()
        .read_line(&mut input)
        .expect("error: unable to read user input");

    println!("You entered: {}", input.trim());

    let credentials = minecraft_auth::finish_login(&input, login).await?;

    println!(
        "Logged in user {}.",
        credentials.maybe_online_profile().await.name
    );
    Ok(credentials)
}

#[tokio::main]
async fn main() -> theseus::Result<()> {
    println!("Starting.");

    let _log_guard = theseus::start_logger();

    // Initialize state
    State::init().await?;

    let worlds = get_recent_worlds(4, EnumSet::all()).await?;
    for world in worlds {
        println!(
            "World: {:?}/{:?} played at {:?}: {:#?}",
            world.profile,
            world.world.name,
            world.world.last_played,
            world.world.details
        );
    }

    Ok(())
}
