/* Copyright (C) 2015 The Android Open Source Project
 **
 ** This software is licensed under the terms of the GNU General Public
 ** License version 2, as published by the Free Software Foundation, and
 ** may be copied, distributed, and modified under those terms.
 **
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
 */

#include "android-qemu1-glue/qemu-control-impl.h"

#include "android/emulation/control/battery_agent.h"
#include "hw/power_supply.h"
#include "hw/android/goldfish/device.h"

static void battery_setIsBatteryPresent(bool isPresent) {
    goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_PRESENT, isPresent);
}

static bool battery_present() {
    return (bool)goldfish_battery_read_prop(POWER_SUPPLY_PROP_PRESENT);
}

static void battery_setIsCharging(bool isCharging) {
    goldfish_battery_set_prop(1, POWER_SUPPLY_PROP_ONLINE, isCharging);
}

static bool battery_charging() {
    return (bool)goldfish_battery_read_prop(POWER_SUPPLY_PROP_ONLINE);
}

static void battery_setCharger(enum BatteryCharger charger) {
    battery_setIsCharging( charger != BATTERY_CHARGER_NONE );

    // TODO: Need to save the full enum and convey it to the AVD
}

static enum BatteryCharger battery_charger() {
    return ( battery_charging() ? BATTERY_CHARGER_AC : BATTERY_CHARGER_NONE );
    // TODO: Need to get the full enum from the AVD
}

static void battery_setChargeLevel(int percentFull) {
    goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_CAPACITY, percentFull);
}

static int battery_chargeLevel() {
    return goldfish_battery_read_prop(POWER_SUPPLY_PROP_CAPACITY);
}

static void battery_setHealth(enum BatteryHealth health) {
    int value;

    switch (health) {
        case BATTERY_HEALTH_GOOD:          value = POWER_SUPPLY_HEALTH_GOOD;            break;
        case BATTERY_HEALTH_FAILED:        value = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;  break;
        case BATTERY_HEALTH_DEAD:          value = POWER_SUPPLY_HEALTH_DEAD;            break;
        case BATTERY_HEALTH_OVERVOLTAGE:   value = POWER_SUPPLY_HEALTH_OVERVOLTAGE;     break;
        case BATTERY_HEALTH_OVERHEATED:    value = POWER_SUPPLY_HEALTH_OVERHEAT;        break;
        case BATTERY_HEALTH_UNKNOWN:       value = POWER_SUPPLY_HEALTH_UNKNOWN;         break;

        default:                           value = POWER_SUPPLY_HEALTH_UNKNOWN;         break;
    }

    goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_HEALTH, value);
}

static enum BatteryHealth battery_health() {
    switch ( goldfish_battery_read_prop(POWER_SUPPLY_PROP_HEALTH) ) {
        case POWER_SUPPLY_HEALTH_GOOD:           return BATTERY_HEALTH_GOOD;
        case POWER_SUPPLY_HEALTH_UNSPEC_FAILURE: return BATTERY_HEALTH_FAILED;
        case POWER_SUPPLY_HEALTH_DEAD:           return BATTERY_HEALTH_DEAD;
        case POWER_SUPPLY_HEALTH_OVERVOLTAGE:    return BATTERY_HEALTH_OVERVOLTAGE;
        case POWER_SUPPLY_HEALTH_OVERHEAT:       return BATTERY_HEALTH_OVERHEATED;
        case POWER_SUPPLY_HEALTH_UNKNOWN:        return BATTERY_HEALTH_UNKNOWN;

        default:                                 return BATTERY_HEALTH_UNKNOWN;
    }
}

static void battery_setStatus(enum BatteryStatus status) {
    int value;

    switch (status) {
        case BATTERY_STATUS_UNKNOWN:       value = POWER_SUPPLY_STATUS_UNKNOWN;       break;
        case BATTERY_STATUS_CHARGING:      value = POWER_SUPPLY_STATUS_CHARGING;      break;
        case BATTERY_STATUS_DISCHARGING:   value = POWER_SUPPLY_STATUS_DISCHARGING;   break;
        case BATTERY_STATUS_NOT_CHARGING:  value = POWER_SUPPLY_STATUS_NOT_CHARGING;  break;
        case BATTERY_STATUS_FULL:          value = POWER_SUPPLY_STATUS_FULL;          break;

        default:                           value = POWER_SUPPLY_STATUS_UNKNOWN;       break;
    }

    goldfish_battery_set_prop(0, POWER_SUPPLY_PROP_STATUS, value);
}

static enum BatteryStatus battery_status() {
    switch ( goldfish_battery_read_prop(POWER_SUPPLY_PROP_STATUS) ) {
        case POWER_SUPPLY_STATUS_UNKNOWN:       return BATTERY_STATUS_UNKNOWN;
        case POWER_SUPPLY_STATUS_CHARGING:      return BATTERY_STATUS_CHARGING;
        case POWER_SUPPLY_STATUS_DISCHARGING:   return BATTERY_STATUS_DISCHARGING;
        case POWER_SUPPLY_STATUS_NOT_CHARGING:  return BATTERY_STATUS_NOT_CHARGING;
        case POWER_SUPPLY_STATUS_FULL:          return BATTERY_STATUS_FULL;

        default:                                return BATTERY_STATUS_UNKNOWN;
    }
}

static const QAndroidBatteryAgent sQAndroidBatteryAgent = {
        .setIsBatteryPresent = battery_setIsBatteryPresent,
        .present = battery_present,
        .setIsCharging = battery_setIsCharging,
        .charging = battery_charging,
        .setCharger = battery_setCharger,
        .charger = battery_charger,
        .setChargeLevel = battery_setChargeLevel,
        .chargeLevel = battery_chargeLevel,
        .setHealth = battery_setHealth,
        .health = battery_health,
        .setStatus = battery_setStatus,
        .status = battery_status,
        .batteryDisplay = goldfish_battery_display};

const QAndroidBatteryAgent* const gQAndroidBatteryAgent =
        &sQAndroidBatteryAgent;
