package com.android.internal.os;

import android.os.BatteryStats;
import android.util.Log;
import android.util.LongSparseArray;

public class MemoryPowerCalculator extends PowerCalculator {

    public static final String TAG = "MemoryPowerCalculator";
    private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
    private final double[] powerAverages;

    public MemoryPowerCalculator(PowerProfile profile) {
        int numBuckets = profile.getNumElements(PowerProfile.POWER_MEMORY);
        powerAverages = new double[numBuckets];
        for (int i = 0; i < numBuckets; i++) {
            powerAverages[i] = profile.getAveragePower(PowerProfile.POWER_MEMORY, i);
            if (powerAverages[i] == 0 && DEBUG) {
                Log.d(TAG, "Problem with PowerProfile. Received 0 value in MemoryPowerCalculator");
            }
        }
    }

    @Override
    public void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
            long rawUptimeUs, int statsType) {}

    @Override
    public void calculateRemaining(BatterySipper app, BatteryStats stats, long rawRealtimeUs,
            long rawUptimeUs, int statsType) {
        double totalMah = 0;
        long totalTimeMs = 0;
        LongSparseArray<? extends BatteryStats.Timer> timers = stats.getKernelMemoryStats();
        for (int i = 0; i < timers.size() && i < powerAverages.length; i++) {
            double mAatRail = powerAverages[(int) timers.keyAt(i)];
            long timeMs = timers.valueAt(i).getTotalTimeLocked(rawRealtimeUs, statsType);
            double mAm = (mAatRail * timeMs) / (1000*60);
            if(DEBUG) {
                Log.d(TAG, "Calculating mAh for bucket " + timers.keyAt(i) + " while unplugged");
                Log.d(TAG, "Converted power profile number from "
                        + powerAverages[(int) timers.keyAt(i)] + " into " + mAatRail);
                Log.d(TAG, "Calculated mAm " + mAm);
            }
            totalMah += mAm/60;
            totalTimeMs += timeMs;
        }
        app.usagePowerMah = totalMah;
        app.usageTimeMs = totalTimeMs;
        if (DEBUG) {
            Log.d(TAG, String.format("Calculated total mAh for memory %f while unplugged %d ",
                    totalMah, totalTimeMs));
        }
    }
}