#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, VoiceSend };
enum class UiEffect { None, CloseSettings, Apply, AgentSettings, SpeechSettings, SessionPicker, EffortSettings, PermissionSettings, VoiceSendSettings };
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;
    std::array<UiEffect,7> agent_actions{UiEffect::AgentSettings,UiEffect::VoiceSendSettings,UiEffect::SpeechSettings,UiEffect::None};
    uint8_t agent_count=4;
    void agent_capabilities(bool catalog,bool effort,bool permissions) {
        agent_count=0;
        if(catalog)agent_actions[agent_count++]=UiEffect::SessionPicker;
        agent_actions[agent_count++]=UiEffect::AgentSettings;
        if(effort)agent_actions[agent_count++]=UiEffect::EffortSettings;
        if(permissions)agent_actions[agent_count++]=UiEffect::PermissionSettings;
        agent_actions[agent_count++]=UiEffect::VoiceSendSettings;
        agent_actions[agent_count++]=UiEffect::SpeechSettings;agent_actions[agent_count++]=UiEffect::None;
        if(menu==Menu::Agent && index>=agent_count)index=0;
    }
    static const char* agent_label(UiEffect effect) {
        switch(effect) {
        case UiEffect::SessionPicker:return "Session";
        case UiEffect::AgentSettings:return "Model";
        case UiEffect::EffortSettings:return "Effort";
        case UiEffect::PermissionSettings:return "Permissions";
        case UiEffect::VoiceSendSettings:return "Voice Send";
        case UiEffect::SpeechSettings:return "Speech FROZEN";
        default:return "Back";
        }
    }
    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 agent_count;
        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;
        case Field::VoiceSend:draft.voice_send_mode=VoiceSendMode((uint8_t(draft.voice_send_mode)+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) {
            if(agent_actions[selected]==UiEffect::VoiceSendSettings) {
                editor_parent=Menu::Agent;field=Field::VoiceSend;draft=preferences;menu=Menu::Edit;index=0;return UiEffect::None;
            }
            return agent_actions[selected];
        }
        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
