#pragma once
#include "device_preferences.h"

namespace wearable {
enum class App : uint8_t { Watch, Agent, Monitor, Help };
enum class Menu : uint8_t { Root, Agent, Device, Display, System, Edit };
enum class Field : uint8_t { Brightness, Vibration, HomeScreen, Text, Theme };
enum class UiEffect { None, CloseSettings, Apply, AgentSettings, SpeechSettings };
struct UiState {
    App app=App::Watch;
    size_t text_page=0;
    Menu menu=Menu::Root, editor_parent=Menu::Device;
    Field field=Field::Brightness;
    uint8_t index=0;
    bool settings_open=false;
    DevicePreferences preferences, draft;
    void boot(DevicePreferences p) { preferences=draft=p; app=App(uint8_t(p.home_screen)); }
    void navigate(bool a) {
        if(settings_open) return;
        text_page=0;
        // Four immediate pages; metric details have no physical entry point.
        app=App((uint8_t(app)+(a?1:3))%4);
    }
    void open_settings() { settings_open=true; menu=Menu::Root;index=0;draft=preferences; }
    void close_settings() { settings_open=false; draft=preferences; }
    UiEffect settings_back() {
        if(!settings_open) return UiEffect::None;
        draft=preferences;index=0;
        if(menu==Menu::Root) {close_settings();return UiEffect::CloseSettings;}
        menu=menu==Menu::Edit?editor_parent:Menu::Root;
        return UiEffect::None;
    }
    uint8_t items() const {
        switch(menu) {
        case Menu::Root:return 5;
        case Menu::Agent:return 3;
        case Menu::Device:return 3;
        case Menu::Display:return 5;
        case Menu::System:return 5;
        default:return 1;
        }
    }
    void edit_next() {
        switch(field) {
        case Field::Brightness:draft.brightness=draft.brightness>=100?10:(draft.brightness/10+1)*10;break;
        case Field::Vibration:draft.vibration_enabled=!draft.vibration_enabled;break;
        case Field::HomeScreen:draft.home_screen=Home((uint8_t(draft.home_screen)+1)%3);break;
        case Field::Text:draft.text_size=TextSize((uint8_t(draft.text_size)+1)%3);break;
        case Field::Theme:draft.theme=Theme((uint8_t(draft.theme)+1)%2);break;
        }
    }
    UiEffect settings_click(bool a) {
        if(!settings_open) return UiEffect::None;
        if(menu==Menu::Edit) {
            if(a) edit_next();
            else {preferences=draft;menu=editor_parent;index=0;return UiEffect::Apply;}
            return UiEffect::None;
        }
        if(a) {index=(index+1)%items();return UiEffect::None;}
        const auto selected=index;
        if(menu==Menu::Root) {
            if(selected==4) {close_settings();return UiEffect::CloseSettings;}
            menu=Menu(uint8_t(Menu::Agent)+selected);index=0;
        } else if(selected==items()-1) {menu=Menu::Root;index=0;}
        else if(menu==Menu::Agent) return selected==0?UiEffect::AgentSettings:UiEffect::SpeechSettings;
        else if(menu==Menu::Device || menu==Menu::Display) {
            if(menu==Menu::Display && selected==3) return UiEffect::None; // One watchface, read-only.
            editor_parent=menu; field=menu==Menu::Device?Field(selected):Field(uint8_t(Field::HomeScreen)+selected);
            draft=preferences;menu=Menu::Edit;index=0;
        }
        return UiEffect::None;
    }
};
inline const char* home_name(Home h) {return h==Home::Watch?"Watch":h==Home::Agent?"Agent":"Monitor";}
inline const char* text_name(TextSize t) {return t==TextSize::Compact?"Compact":t==TextSize::Normal?"Normal":"Large";}
inline const char* theme_name(Theme t) {return t==Theme::Dark?"Dark":"Dim";}
struct Palette {uint16_t primary,secondary,accent,done,failed,approval,selected;};
inline Palette palette(Theme t) {
    return t==Theme::Dark?Palette{0xf7be,0xa556,0x5edf,0x6ef2,0xfbae,0xfdcc,0x10c3}:
        Palette{0xce7a,0x94b3,0x8dd8,0x95d3,0xcc93,0xc550,0x1082};
}
} // namespace wearable
