use fission::op::Color;
use serde::{Deserialize, Serialize};

#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
pub enum UiThemeMode {
    Light,
    #[default]
    Dark,
}

impl UiThemeMode {
    pub fn toggle(self) -> Self {
        match self {
            Self::Light => Self::Dark,
            Self::Dark => Self::Light,
        }
    }

    pub fn label(self) -> &'static str {
        match self {
            Self::Light => "Light",
            Self::Dark => "Dark",
        }
    }
}

#[derive(Clone, Copy, Debug)]
pub struct UiPalette {
    pub background: Color,
    pub surface: Color,
    pub raised: Color,
    pub subtle: Color,
    pub border: Color,
    pub text: Color,
    pub muted: Color,
    pub accent: Color,
    pub accent_text: Color,
    pub success: Color,
    pub warning: Color,
    pub error: Color,
}

impl UiPalette {
    pub fn for_mode(mode: UiThemeMode) -> Self {
        match mode {
            UiThemeMode::Dark => Self {
                background: rgb(11, 18, 32),
                surface: rgb(17, 27, 46),
                raised: rgb(24, 37, 61),
                subtle: rgb(31, 45, 72),
                border: rgb(72, 91, 123),
                text: rgb(235, 241, 250),
                muted: rgb(166, 179, 199),
                accent: rgb(20, 126, 112),
                accent_text: rgb(244, 255, 253),
                success: rgb(40, 204, 137),
                warning: rgb(245, 159, 33),
                error: rgb(242, 91, 91),
            },
            UiThemeMode::Light => Self {
                background: rgb(244, 247, 251),
                surface: rgb(255, 255, 255),
                raised: rgb(235, 241, 248),
                subtle: rgb(224, 234, 244),
                border: rgb(174, 190, 211),
                text: rgb(21, 31, 47),
                muted: rgb(86, 101, 124),
                accent: rgb(16, 120, 106),
                accent_text: rgb(255, 255, 255),
                success: rgb(19, 139, 89),
                warning: rgb(180, 104, 13),
                error: rgb(197, 48, 48),
            },
        }
    }
}

pub const fn rgb(r: u8, g: u8, b: u8) -> Color {
    Color { r, g, b, a: 255 }
}
