/*
    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 crate::{
    FlashM, Page,
    locale::{Language, tr, trs},
    scaffold::{FlashDisplay, SessionInfo},
};
use jellycommon::{
    routes::{u_account_login, u_account_settings},
    user::{PlayerKind, Theme},
};
use markup::RenderAttributeValue;

impl Page for SettingsPage<'_> {
    fn title(&self) -> String {
        "Settings".to_string()
    }
    fn to_render(&self) -> markup::DynRender<'_> {
        markup::new!(@self)
    }
}

markup::define! {
    SettingsPage<'a>(session: &'a SessionInfo, lang: &'a Language, flash: &'a FlashM) {
        h1 { "Settings" }
        @FlashDisplay {flash}
        h2 { @trs(lang, "account") }
        a.switch_account[href=u_account_login()] { "Switch Account" }
        form[method="POST", action=u_account_settings()] {
            label[for="username"] { @trs(lang, "account.username") }
            input[type="text", id="username", disabled, value=&session.user.name];
            input[type="submit", disabled, value=&*tr(**lang, "settings.immutable")];
        }
        form[method="POST", action=u_account_settings()] {
            label[for="display_name"] { @trs(lang, "account.display_name") }
            input[type="text", id="display_name", name="display_name", value=&session.user.display_name];
            input[type="submit", value=&*tr(**lang, "settings.update")];
        }
        form[method="POST", action=u_account_settings()] {
            label[for="password"] { @trs(lang, "account.password") }
            input[type="password", id="password", name="password"];
            input[type="submit", value=&*tr(**lang, "settings.update")];
        }
        h2 { @trs(lang, "settings.appearance") }
        form[method="POST", action=u_account_settings()] {
            fieldset {
                legend { @trs(lang, "settings.appearance.theme") }
                @for theme in Theme::ALL {
                    label { input[type="radio", name="theme", value=A(*theme), checked=session.user.theme==*theme]; @trs(lang, &format!("theme.{theme}")) } br;
                }
            }
            input[type="submit", value=&*tr(**lang, "settings.apply")];
        }
        form[method="POST", action=u_account_settings()] {
            fieldset {
                legend { @trs(lang, "settings.player_preference") }
                @for kind in PlayerKind::ALL {
                    label { input[type="radio", name="player_preference", value=A(*kind), checked=session.user.player_preference==*kind]; @trs(lang, &format!("player_kind.{kind}")) } br;
                }
            }
            input[type="submit", value=&*tr(**lang, "settings.apply")];
        }
        form[method="POST", action=u_account_settings()] {
            label[for="native_secret"] { "Native Secret" }
            input[type="password", id="native_secret", name="native_secret"];
            input[type="submit", value=&*tr(**lang, "settings.update")];
            p { "The secret can be found in " code{"$XDG_CONFIG_HOME/jellynative_secret"} " or by clicking " a.button[href="jellynative://show-secret-v1"] { "Show Secret" } "." }
        }
    }
}

struct A<T>(pub T);
impl markup::Render for A<Theme> {
    fn render(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result {
        writer.write_str(self.0.to_str())
    }
}
impl markup::Render for A<PlayerKind> {
    fn render(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result {
        writer.write_str(self.0.to_str())
    }
}
impl RenderAttributeValue for A<Theme> {}
impl RenderAttributeValue for A<PlayerKind> {}
