package cc.winboll.studio.powerbell.utils;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
import cc.winboll.studio.libappbase.LogUtils;

/**
 * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
 * @Date 2025/12/14 03:05
 * @Describe 权限申请工具类（Java7兼容版）
 * 适配 小米手机+API30，专注自启动权限、电池优化权限检查与申请
 */
public class PermissionUtils {
    // ====================== 常量定义（统一管理，首屏可见）======================
    public static final String TAG = "PermissionUtils";
    // 权限请求码（仅保留核心权限场景）
    public static final int REQUEST_IGNORE_BATTERY_OPTIMIZATION = 1000; // 电池优化权限
    public static final int REQUEST_AUTO_START = 1001;                   // 自启动权限（小米专属）
    // SDK版本常量（适配API30，替代系统枚举）
    private static final int SDK_VERSION_R = 30;                         // Android 11（API30）
    // 小米手机自启动权限页面包名/类名（小米专属跳转路径）
    private static final String XIAOMI_AUTO_START_PACKAGE = "com.miui.securitycenter";
    private static final String XIAOMI_AUTO_START_CLASS = "com.miui.permcenter.autostart.AutoStartManagementActivity";

    // ====================== 单例模式（Java7标准双重校验锁）======================
    private static volatile PermissionUtils sInstance;

    private PermissionUtils() {}

    public static PermissionUtils getInstance() {
        if (sInstance == null) {
            synchronized (PermissionUtils.class) {
                if (sInstance == null) {
                    sInstance = new PermissionUtils();
                    LogUtils.d(TAG, "【单例初始化】PermissionUtils 实例创建成功");
                }
            }
        }
        return sInstance;
    }

    // ====================== 自启动权限（拆分检查+请求，小米专属）======================
    /**
     * 检查是否拥有自启动权限（小米手机专属判断，API30适配）
     * 注：小米自启动无系统API直接校验，通过「是否为小米机型」+「功能场景间接判断」，此处返回机型适配状态
     * @param activity 上下文Activity（不可为null）
     * @return true：小米机型（需手动开启权限）；false：非小米机型（无需申请）
     */
    public boolean checkAutoStartPermission(Activity activity) {
        if (activity == null) {
            LogUtils.e(TAG, "【自启动权限-检查】失败：Activity为空");
            return false;
        }
        LogUtils.d(TAG, "【自启动权限-检查】开始，设备品牌：" + Build.BRAND + "，系统版本：" + Build.VERSION.SDK_INT);

        // 仅小米机型需要申请自启动权限，非小米直接返回false（无需处理）
        boolean isXiaomi = Build.BRAND.toLowerCase().contains("xiaomi");
        LogUtils.d(TAG, "【自启动权限-检查】结果：" + (isXiaomi ? "小米机型（需手动开启）" : "非小米机型（无需申请）"));
        return isXiaomi;
    }

    /**
     * 请求自启动权限（小米手机专属，API30适配，跳转系统页面引导开启）
     * @param activity 申请权限的Activity（不可为null）
     */
    public void requestAutoStartPermission(Activity activity) {
        if (activity == null) {
            LogUtils.e(TAG, "【自启动权限-请求】失败：Activity为空");
            return;
        }
        // 先检查机型，非小米不执行请求
        if (!checkAutoStartPermission(activity)) {
            LogUtils.d(TAG, "【自启动权限-请求】非小米机型，无需发起请求");
            return;
        }
        LogUtils.d(TAG, "【自启动权限-请求】开始处理，系统版本：" + Build.VERSION.SDK_INT);

        // API30+ 小米手机：优先精准跳转自启动管理页
        if (Build.VERSION.SDK_INT >= SDK_VERSION_R) {
            try {
                // 方案1：组件名精准跳转（成功率最高）
                Intent intent = new Intent();
                intent.setComponent(new ComponentName(XIAOMI_AUTO_START_PACKAGE, XIAOMI_AUTO_START_CLASS));
                activity.startActivityForResult(intent, REQUEST_AUTO_START);
                LogUtils.d(TAG, "【自启动权限-请求】跳转小米自启动管理页（组件名跳转）");
            } catch (Exception e1) {
                try {
                    // 方案2：Action备用跳转（兼容机型差异）
                    Intent intent = new Intent("miui.intent.action.OP_AUTO_START");
                    intent.setClassName(XIAOMI_AUTO_START_PACKAGE, XIAOMI_AUTO_START_CLASS);
                    activity.startActivityForResult(intent, REQUEST_AUTO_START);
                    LogUtils.d(TAG, "【自启动权限-请求】跳转小米自启动管理页（Action跳转）");
                } catch (Exception e2) {
                    // 方案3：终极备用（跳转系统设置，引导手动操作）
                    Intent intent = new Intent(Settings.ACTION_SETTINGS);
                    activity.startActivityForResult(intent, REQUEST_AUTO_START);
                    LogUtils.w(TAG, "【自启动权限-请求】跳转系统设置页（引导手动开启）");
                    showAutoStartTipsDialog(activity);
                }
            }
            return;
        }

        // API30以下小米手机：兼容低版本跳转逻辑
        LogUtils.d(TAG, "【自启动权限-请求】API30以下小米机型，执行低版本跳转");
        try {
            Intent intent = new Intent(XIAOMI_AUTO_START_CLASS);
            intent.setPackage(XIAOMI_AUTO_START_PACKAGE);
            activity.startActivityForResult(intent, REQUEST_AUTO_START);
        } catch (Exception e) {
            Intent intent = new Intent(Settings.ACTION_SETTINGS);
            activity.startActivityForResult(intent, REQUEST_AUTO_START);
            showAutoStartTipsDialog(activity);
        }
    }

    // ====================== 电池优化权限（拆分检查+请求，通用所有机型）======================
    /**
     * 检查是否拥有「忽略电池优化」权限（API30适配，通用所有机型，精准返回权限状态）
     * @param activity 上下文Activity（不可为null）
     * @return true：已拥有（忽略优化）；false：未拥有（需申请）
     */
    public boolean checkIgnoreBatteryOptimizationPermission(Activity activity) {
        if (activity == null) {
            LogUtils.e(TAG, "【电池优化权限-检查】失败：Activity为空");
            return false;
        }
        LogUtils.d(TAG, "【电池优化权限-检查】开始，系统版本：" + Build.VERSION.SDK_INT);

        // API23以下无电池优化权限，直接视为已拥有
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            LogUtils.d(TAG, "【电池优化权限-检查】API23以下无此权限，视为已拥有");
            return true;
        }

        // API23+ 精准校验权限状态
        PowerManager powerManager = (PowerManager) activity.getSystemService(Activity.POWER_SERVICE);
        if (powerManager == null) {
            LogUtils.e(TAG, "【电池优化权限-检查】获取PowerManager失败，无法校验");
            return false;
        }
        boolean isIgnored = powerManager.isIgnoringBatteryOptimizations(activity.getPackageName());
        LogUtils.d(TAG, "【电池优化权限-检查】结果：" + (isIgnored ? "已拥有（忽略优化）" : "未拥有（需申请）"));
        return isIgnored;
    }

    /**
     * 请求「忽略电池优化」权限（API30适配，通用所有机型，自动判断是否需要申请）
     * @param activity 申请权限的Activity（不可为null）
     */
    public void requestIgnoreBatteryOptimizationPermission(Activity activity) {
        if (activity == null) {
            LogUtils.e(TAG, "【电池优化权限-请求】失败：Activity为空");
            return;
        }
        // 先检查权限，已拥有则直接返回
        if (checkIgnoreBatteryOptimizationPermission(activity)) {
            LogUtils.d(TAG, "【电池优化权限-请求】已拥有权限，无需发起申请");
            return;
        }
        LogUtils.w(TAG, "【电池优化权限-请求】未拥有权限，开始发起申请");

        try {
            // 方案1：直接跳转权限申请页（用户一键同意，优先使用）
            Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + activity.getPackageName()));
            activity.startActivityForResult(intent, REQUEST_IGNORE_BATTERY_OPTIMIZATION);
            LogUtils.d(TAG, "【电池优化权限-请求】跳转系统权限申请页");
        } catch (Exception e) {
            // 方案2：备用跳转（跳转优化管理列表，引导手动选择）
            Intent intent = new Intent(Settings.ACTION_BATTERY_SAVER_SETTINGS);
            activity.startActivityForResult(intent, REQUEST_IGNORE_BATTERY_OPTIMIZATION);
            LogUtils.w(TAG, "【电池优化权限-请求】跳转优化管理页（引导手动开启）");
            showBatteryOptTipsDialog(activity);
        }
    }

    // ====================== 辅助方法（提示弹窗+结果处理）======================
    /**
     * 显示自启动权限手动开启提示弹窗（小米机型跳转失败时使用）
     */
    private void showAutoStartTipsDialog(final Activity activity) {
        new AlertDialog.Builder(activity)
			.setTitle("权限申请提示")
			.setMessage("请手动开启自启动权限，否则应用后台功能可能异常：\n1. 进入安全中心 → 应用管理 → 自启动管理\n2. 找到本应用，开启「允许自启动」开关")
			.setPositiveButton("知道了", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					dialog.dismiss();
				}
			})
			.setCancelable(false)
			.show();
        LogUtils.d(TAG, "【自启动权限】显示手动开启提示弹窗");
    }

    /**
     * 显示电池优化权限手动开启提示弹窗（跳转失败时使用）
     */
    private void showBatteryOptTipsDialog(final Activity activity) {
        new AlertDialog.Builder(activity)
			.setTitle("权限申请提示")
			.setMessage("请手动忽略电池优化，否则应用后台运行可能被限制：\n1. 进入设置 → 电池 → 电池优化\n2. 找到本应用，选择「不优化」")
			.setPositiveButton("知道了", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					dialog.dismiss();
				}
			})
			.setCancelable(false)
			.show();
        LogUtils.d(TAG, "【电池优化权限】显示手动开启提示弹窗");
    }
}

