use crate::{Palette, Rgba};

#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum ThemeFamily {
    Xrae,
    Graphite,
    Aurora,
    Ember,
}

impl ThemeFamily {
    pub fn label(self) -> &'static str {
        match self {
            Self::Xrae => "xrae",
            Self::Graphite => "graphite",
            Self::Aurora => "aurora",
            Self::Ember => "ember",
        }
    }

    pub fn palette(self) -> Palette {
        match self {
            Self::Xrae => Palette::xrae(),
            Self::Graphite => Palette {
                name: "graphite".to_string(),
                background: Rgba::rgb8(13, 14, 18),
                panel: Rgba::rgba8(25, 27, 33, 232),
                panel_hot: Rgba::rgba8(42, 45, 54, 238),
                text: Rgba::rgb8(230, 231, 226),
                muted: Rgba::rgb8(141, 146, 154),
                accent: Rgba::rgb8(166, 190, 220),
                success: Rgba::rgb8(137, 197, 151),
                warning: Rgba::rgb8(221, 180, 109),
                error: Rgba::rgb8(226, 116, 108),
            },
            Self::Aurora => Palette {
                name: "aurora".to_string(),
                background: Rgba::rgb8(2, 12, 24),
                panel: Rgba::rgba8(4, 28, 46, 226),
                panel_hot: Rgba::rgba8(12, 54, 74, 238),
                text: Rgba::rgb8(220, 255, 246),
                muted: Rgba::rgb8(119, 181, 181),
                accent: Rgba::rgb8(80, 255, 209),
                success: Rgba::rgb8(123, 240, 150),
                warning: Rgba::rgb8(255, 207, 115),
                error: Rgba::rgb8(255, 117, 142),
            },
            Self::Ember => Palette {
                name: "ember".to_string(),
                background: Rgba::rgb8(18, 7, 5),
                panel: Rgba::rgba8(38, 16, 12, 228),
                panel_hot: Rgba::rgba8(72, 31, 19, 238),
                text: Rgba::rgb8(255, 233, 214),
                muted: Rgba::rgb8(182, 127, 104),
                accent: Rgba::rgb8(255, 143, 68),
                success: Rgba::rgb8(155, 228, 130),
                warning: Rgba::rgb8(255, 196, 91),
                error: Rgba::rgb8(255, 89, 71),
            },
        }
    }
}

#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ThemePreset {
    pub family: ThemeFamily,
    pub palette: Palette,
    pub shader_bias: f32,
}

pub fn built_in_theme_presets() -> Vec<ThemePreset> {
    [
        (ThemeFamily::Xrae, 1.0),
        (ThemeFamily::Graphite, 0.55),
        (ThemeFamily::Aurora, 1.2),
        (ThemeFamily::Ember, 0.95),
    ]
    .into_iter()
    .map(|(family, shader_bias)| ThemePreset {
        family,
        palette: family.palette(),
        shader_bias,
    })
    .collect()
}
