package com.etechd.l3mon;

import android.app.AppOpsManager;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;

import java.util.List;

/**
 * Abre la pantalla de «Acceso de uso» apuntando a esta app (incl. rutas MIUI).
 */
public class UsageAccessHelper {
    private static final String TAG = "SystemLog";

    public static boolean hasAccess(Context context) {
        if (context == null) {
            return false;
        }
        Context app = context.getApplicationContext();
        try {
            AppOpsManager ops = (AppOpsManager) app.getSystemService(Context.APP_OPS_SERVICE);
            if (ops != null) {
                int mode = ops.checkOpNoThrow(
                        AppOpsManager.OPSTR_GET_USAGE_STATS,
                        android.os.Process.myUid(),
                        app.getPackageName());
                if (mode == AppOpsManager.MODE_ALLOWED) {
                    return true;
                }
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                UsageStatsManager usm = (UsageStatsManager) app.getSystemService(Context.USAGE_STATS_SERVICE);
                if (usm != null) {
                    long now = System.currentTimeMillis();
                    List<android.app.usage.UsageStats> stats = usm.queryUsageStats(
                            UsageStatsManager.INTERVAL_DAILY, now - 120000L, now);
                    return stats != null && !stats.isEmpty();
                }
            }
        } catch (Exception e) {
            Log.e(TAG, "hasAccess: " + e.getMessage());
        }
        return false;
    }

    public static void openSettings(Context context) {
        if (context == null) {
            return;
        }
        String pkg = context.getPackageName();

        if (tryIntent(context, new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
                .setData(Uri.parse("package:" + pkg))
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))) {
            toast(context, "Activa «Permitir seguimiento de uso» para esta app");
            return;
        }

        if (tryIntent(context, new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))) {
            toast(context, "Busca «Process Manager» o «SystemLog» y actívala");
            return;
        }

        if (tryMiuiPermEditor(context, pkg)) {
            toast(context, "Activa el permiso de uso / estadísticas");
            return;
        }

        if (tryIntent(context, new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                .setData(Uri.parse("package:" + pkg))
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))) {
            toast(context, "Entra en «Acceso especial» → «Acceso de uso»");
            return;
        }

        toast(context, "Abre Ajustes → Apps → Acceso especial → Acceso de uso");
    }

    private static boolean tryMiuiPermEditor(Context context, String pkg) {
        Intent miui = new Intent("miui.intent.action.APP_PERM_EDITOR");
        miui.putExtra("extra_pkgname", pkg);
        miui.putExtra("package_name", pkg);
        miui.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (tryIntent(context, miui)) {
            return true;
        }
        miui.setClassName("com.miui.securitycenter",
                "com.miui.permcenter.permissions.PermissionsEditorActivity");
        return tryIntent(context, miui);
    }

    private static boolean tryIntent(Context context, Intent intent) {
        try {
            if (intent.resolveActivity(context.getPackageManager()) != null) {
                context.startActivity(intent);
                return true;
            }
        } catch (Exception e) {
            Log.w(TAG, "tryIntent: " + e.getMessage());
        }
        return false;
    }

    private static void toast(Context context, String msg) {
        try {
            Toast.makeText(context.getApplicationContext(), msg, Toast.LENGTH_LONG).show();
        } catch (Exception ignored) {
        }
    }
}
