#pragma once

#include "power.h"

#include <stdint.h>
#include <gui/view_dispatcher.h>
#include <gui/gui.h>

#include <gui/modules/popup.h>
#include "views/power_off.h"
#include "applications/settings/power_settings_app/power_settings.h"
#include "views/power_unplug_usb.h"

#include <notification/notification_messages.h>

#define POWER_BATTERY_HEALTHY_LEVEL 70

typedef enum {
    PowerStateNotCharging,
    PowerStateCharging,
    PowerStateCharged,
} PowerState;

struct Power {
    ViewDispatcher* view_dispatcher;
    PowerOff* power_off;
    PowerUnplugUsb* power_unplug_usb;

    ViewPort* battery_view_port;
    Gui* gui;
    NotificationApp* notification;
    FuriPubSub* event_pubsub;
    FuriPubSub* input_events_pubsub;
    FuriPubSubSubscription* input_events_subscription;
    PowerEvent event;

    PowerState state;
    PowerInfo info;

    bool battery_low;
    bool show_low_bat_level_message;
    uint8_t displayBatteryPercentage;
    uint8_t battery_level;
    uint8_t power_off_timeout;

    uint32_t shutdown_idle_delay_ms;
    FuriTimer* auto_shutdown_timer;

    FuriMutex* api_mtx;
};

typedef enum {
    PowerViewOff,
    PowerViewUnplugUsb,
} PowerView;
