/*
    This file is part of jellything (https://codeberg.org/metamuffin/jellything)
    which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
    Copyright (C) 2026 metamuffin <metamuffin.org>
*/
use super::ui::error::MyResult;
use crate::helper::{accept::AcceptJson, language::AcceptLanguage, A};
use jellycommon::{user::CreateSessionParams, NodeID};
use jellylogic::{login::login_logic, node::get_nodes_modified_since, session::Session};
use jellyui::locale::get_translation_table;
use rocket::{get, post, response::Redirect, serde::json::Json, Either};
use serde_json::{json, Value};
use std::collections::HashMap;

#[get("/api")]
pub fn r_api_root() -> Redirect {
    Redirect::moved("https://jellything.metamuffin.org/book/api.html#jellything-http-api")
}

#[get("/version")]
pub fn r_version() -> &'static str {
    env!("CARGO_PKG_VERSION")
}

#[get("/translations")]
pub fn r_translations(
    lang: AcceptLanguage,
    aj: AcceptJson,
) -> Either<Json<&'static HashMap<&'static str, &'static str>>, String> {
    let AcceptLanguage(lang) = lang;
    let table = get_translation_table(&lang);
    if *aj {
        Either::Left(Json(table))
    } else {
        let mut s = String::new();
        for (k, v) in table {
            s += k;
            s += "=";
            s += v;
            s += "\n";
        }
        Either::Right(s)
    }
}

#[post("/api/create_session", data = "<data>")]
pub fn r_api_account_login(data: Json<CreateSessionParams>) -> MyResult<Value> {
    let token = login_logic(
        &data.username,
        &data.password,
        data.expire,
        data.drop_permissions.clone(),
    )?;
    Ok(json!(token))
}

#[get("/nodes_modified?<since>")]
pub fn r_nodes_modified_since(session: A<Session>, since: u64) -> MyResult<Json<Vec<NodeID>>> {
    let nodes = get_nodes_modified_since(&session.0, since)?;
    Ok(Json(nodes))
}
