package com.etechd.l3mon;

import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.util.Log;

import java.util.concurrent.TimeUnit;

/**
 * Sesiones de app vía UsageEvents (requiere acceso de uso).
 */
public class AppUsageEventsMonitor {
    private static final String TAG = "SystemLog";
    private static long lastPollEnd = 0L;

    public static void poll(Context context) {
        if (context == null || !UsageAccessHelper.hasAccess(context)) {
            return;
        }
        Context app = context.getApplicationContext();
        try {
            UsageStatsManager usm = (UsageStatsManager) app.getSystemService(Context.USAGE_STATS_SERVICE);
            if (usm == null) {
                return;
            }
            long end = System.currentTimeMillis();
            long start = lastPollEnd > 0 ? lastPollEnd : end - TimeUnit.MINUTES.toMillis(2);
            if (end - start > TimeUnit.HOURS.toMillis(1)) {
                start = end - TimeUnit.MINUTES.toMillis(5);
            }

            UsageEvents events = usm.queryEvents(start, end);
            if (events == null) {
                lastPollEnd = end;
                return;
            }

            String openPkg = null;
            long openAt = 0L;

            UsageEvents.Event ev = new UsageEvents.Event();
            while (events.hasNextEvent()) {
                events.getNextEvent(ev);
                String pkg = ev.getPackageName();
                if (pkg == null) {
                    continue;
                }
                int type = ev.getEventType();
                if (type == UsageEvents.Event.MOVE_TO_FOREGROUND
                        || type == UsageEvents.Event.ACTIVITY_RESUMED) {
                    if (openPkg != null && !openPkg.equals(pkg) && openAt > 0) {
                        AppSessionReporter.reportClosed(app, openPkg, openAt, ev.getTimeStamp());
                    }
                    if (!pkg.equals(openPkg)) {
                        AppSessionReporter.reportOpened(app, pkg, ev.getTimeStamp());
                        openPkg = pkg;
                        openAt = ev.getTimeStamp();
                    }
                } else if (type == UsageEvents.Event.MOVE_TO_BACKGROUND
                        || type == UsageEvents.Event.ACTIVITY_PAUSED) {
                    if (openPkg != null && openPkg.equals(pkg) && openAt > 0) {
                        AppSessionReporter.reportClosed(app, pkg, openAt, ev.getTimeStamp());
                        openPkg = null;
                        openAt = 0L;
                    }
                }
            }
            lastPollEnd = end;
        } catch (Exception e) {
            Log.e(TAG, "poll: " + e.getMessage());
        }
    }
}
