// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.power.battery;

using zx;

/// The overall status of the battery, informing its general availability.
type BatteryStatus = strict enum {
    /// uninitialized battery status
    UNKNOWN = 0;
    /// battery present and available
    OK = 1;
    /// battery present, but not available (e.g. disabled)
    NOT_AVAILABLE = 2;
    /// battery not present (e.g. removed or no battery)
    NOT_PRESENT = 3;
};

/// The status of the battery with respect to charging.
type ChargeStatus = strict enum {
    UNKNOWN = 0;
    NOT_CHARGING = 1;
    CHARGING = 2;
    DISCHARGING = 3;
    FULL = 4;
};

/// The power source for an actively charging battery.
type ChargeSource = strict enum {
    UNKNOWN = 0;
    NONE = 1;
    AC_ADAPTER = 2;
    USB = 3;
    WIRELESS = 4;
};

/// The general status of the battery level.
type LevelStatus = strict enum {
    UNKNOWN = 0;
    OK = 1;
    WARNING = 2; // OEM defined signal for initial notification UI to charge
    LOW = 3; // OEM defined at around 5% of capacity (sufficient for S1-S4)
    CRITICAL = 4; // no longer capable of supplying power, emergency shutdown
};

/// The general status related to the overall health of the battery.
type HealthStatus = strict enum {
    UNKNOWN = 0;
    GOOD = 1;
    COLD = 2;
    HOT = 3;
    DEAD = 4;
    OVER_VOLTAGE = 5;
    UNSPECIFIED_FAILURE = 6;
};

/// The time remaining while actively charging or discharging.
type TimeRemaining = flexible union {
    /// Representation of indeterminate state with zero duration.
    1: indeterminate zx.Duration;

    /// Remaining battery life while discharging
    2: battery_life zx.Duration;

    /// Remaining time until full while charging
    3: full_charge zx.Duration;
};

/// Type of data that are determined by manufacturer
type BatterySpec = table {
    /// Represent the battery's charging current spec in micro amps
    1: max_charging_current_ua int32;

    /// Represent the battery's charging voltage spec in micro volt
    2: max_charnging_voltage_uv int32;

    /// Battery Full Charge Design Capacity in micro amp hour
    3: design_capacity_uah int32;
};

/// Current battery state information
type BatteryInfo = table {
    /// General battery status with respect to presence & availability
    1: status BatteryStatus;

    /// The current state of the battery with respect to charging
    2: charge_status ChargeStatus;

    /// The charge source while battery is actively charging.
    /// When not actively charging, this will reflect that the source is
    /// NONE (not charging) or UNKNOWN.
    3: charge_source ChargeSource;

    /// Battery level in percentage. Level percent is only available if
    /// level status is known.
    4: level_percent float32;

    /// Battery level as a general status, including low and critical
    5: level_status LevelStatus;

    /// Overall battery health
    6: health HealthStatus;

    /// Time remaining relative to the current charge status
    7: time_remaining TimeRemaining;

    /// Timestamp to distinguish between latest and stale status
    8: timestamp zx.Time;

    /// Forward the voltage level in mv
    9: present_voltage_mv uint32;

    /// Forward the battery capqacity in uAh
    10: remaining_capacity_uah uint32;

    /// Battery spec
    11: battery_spec BatterySpec;
};

/// Provider interface used to obtain battery status details
closed protocol BatteryInfoProvider {
    /// Gets battery info
    strict GetBatteryInfo() -> (struct {
        info BatteryInfo;
    });

    /// Registers a watcher for battery info changes
    strict Watch(resource struct {
        watcher client_end:BatteryInfoWatcher;
    });
};

/// Watcher on battery info
closed protocol BatteryInfoWatcher {
    /// Callback triggered when battery info changes
    strict OnChangeBatteryInfo(struct {
        info BatteryInfo;
    }) -> ();
};

/// General manager interface for battery management
@discoverable
closed protocol BatteryManager {
    // Provides battery status information
    compose BatteryInfoProvider;
};
