use crate::{graphics::*, ui::common::ControlCharAttributesState};

pub enum Themes {
    Default,
    DarkGray,
    Light,
}

#[derive(Default)]
pub struct DesktopTheme {
    pub character: Character,
}
#[derive(Default)]
pub struct TextTheme {
    pub normal: CharAttribute,
    pub hot_key: CharAttribute,
    pub inactive: CharAttribute,
    pub error: CharAttribute,
    pub warning: CharAttribute,
    pub hovered: CharAttribute,
    pub focused: CharAttribute,
    pub highlighted: CharAttribute,
    pub enphasized_1: CharAttribute,
    pub enphasized_2: CharAttribute,
    pub enphasized_3: CharAttribute,
}
#[derive(Default)]
pub struct ToolTipTheme {
    pub text: CharAttribute,
    pub arrow: CharAttribute,
}
#[derive(Default)]
pub struct SymbolTheme {
    pub inactive: CharAttribute,
    pub hovered: CharAttribute,
    pub pressed: CharAttribute,
    pub checked: CharAttribute,
    pub unchecked: CharAttribute,
    pub unknown: CharAttribute,
    pub arrows: CharAttribute,
    pub close: CharAttribute,
    pub maximized: CharAttribute,
    pub resize: CharAttribute,
}
#[derive(Default)]
pub struct MenuTheme {
    pub text: ControlCharAttributesState,
    pub hotkey: ControlCharAttributesState,
    pub shortcut: ControlCharAttributesState,
    pub symbol: ControlCharAttributesState,
}

#[derive(Default)]
pub struct WindowBar {
    pub focus: CharAttribute,
    pub normal: CharAttribute,
    pub resizing: CharAttribute, 
    pub close_button: CharAttribute,
    pub maximize_button: CharAttribute,
    pub tag: CharAttribute,
    pub hotkey: CharAttribute,  
}

#[derive(Default)]
pub struct WindowTheme {
    pub normal: CharAttribute,
    pub inactive: CharAttribute,
    pub error: CharAttribute,
    pub warning: CharAttribute,
    pub info: CharAttribute,
    pub bar: WindowBar,
}
#[derive(Default)]
pub struct RegularButtonTheme {
    pub text: ControlCharAttributesState,
    pub hotkey: ControlCharAttributesState,
    pub shadow: CharAttribute,
}
#[derive(Default)]
pub struct BevelButtonTheme {
    pub text: ControlCharAttributesState,
    pub hotkey: ControlCharAttributesState,
    pub dark_margin: CharAttribute,
    pub light_margin: CharAttribute,
}

#[derive(Default)]
pub struct ButtonTheme {
    pub regular: RegularButtonTheme,
    pub bevel: BevelButtonTheme,
}
#[derive(Default)]
pub struct TabTheme {
    pub text: ControlCharAttributesState,
    pub hotkey: ControlCharAttributesState,
}
#[derive(Default)]
pub struct AccordionTheme {
    pub text: ControlCharAttributesState,
    pub hotkey: ControlCharAttributesState,
}
#[derive(Default)]
pub struct ScrollBarTheme {
    pub arrow: ControlCharAttributesState,
    pub bar: ControlCharAttributesState,
    pub position: ControlCharAttributesState,
}

#[derive(Default)]
pub struct SearchBarTheme {
    pub normal: CharAttribute,
    pub focused: CharAttribute,
    pub count: CharAttribute,
}

#[derive(Default)]
pub struct ListCurentItemTheme {
    pub focus: CharAttribute,
    pub over_inactive: CharAttribute,
    pub over_selection: CharAttribute,
    pub normal: CharAttribute,
    pub selected: CharAttribute,
    pub icon: CharAttribute,
}

#[derive(Default)]
pub struct HeaderTheme {
    pub text: ControlCharAttributesState,
    pub hotkey: ControlCharAttributesState,
    pub symbol: ControlCharAttributesState,
}

#[derive(Default)]
pub struct ToggleButtonTheme {
    pub selected: ControlCharAttributesState,
    pub unselected: ControlCharAttributesState,
}


#[derive(Default)]
pub struct MarkdownTheme {
    pub text: CharAttribute,
    pub bold: CharAttribute,
    pub italic: CharAttribute,
    pub link: CharAttribute,
    pub code: CharAttribute,
    pub h1: CharAttribute,
    pub h2: CharAttribute,
    pub h3: CharAttribute,
    pub code_block: CharAttribute,
    pub ordered_list: CharAttribute,
    pub unordered_list: CharAttribute,
    pub table: CharAttribute,
    pub table_header: CharAttribute,
}

#[derive(Default)]
pub struct ProgressBarTheme {
    pub background: Color,
    pub progress: Color,
    pub text: Color,
}

#[derive(Default)]
pub struct Theme {
    pub accordion: AccordionTheme,
    pub desktop: DesktopTheme,
    pub text: TextTheme,
    pub symbol: SymbolTheme,
    pub tooltip: ToolTipTheme,
    pub menu: MenuTheme,
    pub parent_menu: MenuTheme,
    pub window: WindowTheme,
    pub border: ControlCharAttributesState,
    pub lines: ControlCharAttributesState,
    pub button: ButtonTheme,
    pub tab: TabTheme,
    pub scrollbar: ScrollBarTheme,
    pub searchbar: SearchBarTheme,
    pub editor: ControlCharAttributesState,
    pub list_current_item: ListCurentItemTheme,
    pub header: HeaderTheme,
    pub toggle_button: ToggleButtonTheme,
    pub markdown: MarkdownTheme,
    pub progressbar: ProgressBarTheme,
}
impl Theme {
    pub fn new(theme: Themes) -> Self {
        match theme {
            Themes::Default => super::default::new(),
            Themes::DarkGray => super::dark_gray::new(),
            Themes::Light => super::light::new(),
        }
    }
}
