#pragma once
#include <cstdint>
#include <cmath>

namespace wearable {
struct WallClock {
    uint64_t utc_base_ms=0, monotonic_base_ms=0;
    int16_t timezone_offset_minutes=0;
    bool sync(double epoch_ms,uint64_t now_ms,int offset_minutes=0) {
        // 2024..2100; accept only integer milliseconds from authenticated hello.
        if(!std::isfinite(epoch_ms) || epoch_ms<1704067200000.0 || epoch_ms>=4102444800000.0 ||
            std::floor(epoch_ms)!=epoch_ms || offset_minutes < -720 || offset_minutes > 840) return false;
        utc_base_ms=uint64_t(epoch_ms);monotonic_base_ms=now_ms;
        timezone_offset_minutes=offset_minutes;return true;
    }
    uint64_t utc_ms(uint64_t now_ms) const {
        return utc_base_ms && now_ms>=monotonic_base_ms?utc_base_ms+now_ms-monotonic_base_ms:0;
    }
    int64_t local_ms(uint64_t now_ms) const {
        const auto utc=utc_ms(now_ms);
        return utc?int64_t(utc)+int64_t(timezone_offset_minutes)*60000:0;
    }
};
struct BatteryStatus {bool valid=false;uint16_t millivolts=0;uint32_t failures=0;};
} // namespace wearable
