#include "ui_state.h"
#include "device_status.h"
#include <cassert>
#include <cstdio>
#include <limits>
using namespace wearable;

int main() {
    DevicePreferences defaults;
    UiState ui;
    ui.boot(defaults);
    assert(ui.app==App::Watch);

    // Single clicks are dispatched immediately around the flat product ring.
    ui.navigate(true); assert(ui.app==App::Agent);
    ui.navigate(true); assert(ui.app==App::Monitor && ui.monitor_page==0);
    for(int i=0;i<4;++i) ui.navigate(true);
    assert(ui.app==App::Monitor && ui.monitor_page==4);
    ui.navigate(true); assert(ui.app==App::Help);
    ui.navigate(true); assert(ui.app==App::Watch);
    ui.navigate(false); assert(ui.app==App::Help);
    ui.navigate(false); assert(ui.app==App::Monitor && ui.monitor_page==4);
    for(int i=0;i<4;++i) ui.navigate(false);
    assert(ui.app==App::Monitor && ui.monitor_page==0);
    ui.navigate(false); assert(ui.app==App::Agent);
    ui.navigate(false); assert(ui.app==App::Watch);

    // Home preference changes only the boot destination.
    defaults.home_screen=Home::Agent;ui.boot(defaults);assert(ui.app==App::Agent);
    defaults.home_screen=Home::Monitor;ui.boot(defaults);assert(ui.app==App::Monitor && ui.monitor_page==0);

    // Settings edits stay drafts until B applies them.
    ui.open_settings();ui.index=1;ui.settings_click(false);assert(ui.menu==Menu::Device);
    ui.settings_click(false);assert(ui.menu==Menu::Edit);
    for(int i=0;i<3;++i) assert(ui.settings_click(true)==UiEffect::None);
    assert(ui.preferences.brightness==80 && ui.draft.brightness==10);
    ui.close_settings();assert(ui.app==App::Monitor && ui.preferences.brightness==80);
    ui.open_settings();ui.index=1;ui.settings_click(false);ui.settings_click(false);
    ui.settings_click(true);assert(ui.settings_click(false)==UiEffect::Apply && ui.preferences.brightness==90);
    ui.index=1;ui.settings_click(false);ui.settings_click(true);assert(ui.settings_click(false)==UiEffect::Apply);
    assert(!ui.preferences.vibration_enabled);

    WallClock clock;assert(clock.utc_ms(0)==0);
    assert(!clock.sync(0,0) && !clock.sync(std::numeric_limits<double>::infinity(),0));
    assert(!clock.sync(1791072000000.5,0));assert(clock.sync(1791072000000,100));
    assert(clock.utc_ms(6100)==1791072006000); // Keeps advancing without network truth.
    assert(!clock.sync(1,8000) && clock.utc_ms(8100)==1791072008000);
    std::puts("Wearable shell immediate navigation/draft and UTC clock PASS");
}
