package com.narutohuo.xindazhou.core.permission

import android.app.Activity
import android.content.Context
import androidx.fragment.app.FragmentActivity
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.XXPermissions

/**
 * 权限管理工具类
 * 
 * 基于 XXPermissions 封装，提供统一的权限请求接口
 * 
 * 特点：
 * - 无需注册 ActivityResultLauncher
 * - 自动处理 Android 各版本兼容性
 * - 自动处理权限被永久拒绝的情况
 * - 支持链式调用
 * 
 * 使用示例：
 * ```kotlin
 * // 1. 最简单的用法：请求单个权限
 * PermissionHelper.request(activity, Manifest.permission.CAMERA) {
 *     // 权限已授予，执行操作
 *     openCamera()
 * }
 * 
 * // 2. 请求多个权限
 * PermissionHelper.request(activity,
 *     Manifest.permission.CAMERA,
 *     Manifest.permission.RECORD_AUDIO,
 *     onGranted = {
 *         // 所有权限都已授予
 *         startVideoRecord()
 *     },
 *     onDenied = {
 *         // 有权限被拒绝
 *         showToast("需要相关权限才能使用此功能")
 *     }
 * )
 * 
 * // 3. 需要知道具体哪些权限被授予/拒绝
 * PermissionHelper.requestWithResult(activity,
 *     Manifest.permission.CAMERA,
 *     Manifest.permission.WRITE_EXTERNAL_STORAGE
 * ) { granted, denied ->
 *     if (granted.contains(Manifest.permission.CAMERA)) {
 *         // 相机权限已授予
 *     }
 *     if (denied.isNotEmpty()) {
 *         // 处理被拒绝的权限
 *     }
 * }
 * 
 * // 4. 检查权限
 * if (PermissionHelper.isGranted(context, Manifest.permission.CAMERA)) {
 *     openCamera()
 * }
 * 
 * // 5. 被永久拒绝时，引导用户去设置页
 * PermissionHelper.request(activity, 
 *     Manifest.permission.CAMERA,
 *     onGranted = { openCamera() },
 *     onDenied = {
 *         PermissionHelper.showPermissionSettingDialog(
 *             activity, 
 *             "相机权限已被拒绝，请前往设置页面手动授予"
 *         )
 *     }
 * )
 * ```
 */
object PermissionHelper {
    
    /**
     * 检查单个权限是否已授予
     * 
     * @param context 上下文
     * @param permission 权限名称
     * @return true 表示已授予，false 表示未授予
     */
    fun isGranted(context: Context, permission: String): Boolean {
        return XXPermissions.isGranted(context, permission)
    }
    
    /**
     * 检查多个权限是否都已授予
     * 
     * @param context 上下文
     * @param permissions 权限名称数组
     * @return true 表示所有权限都已授予，false 表示至少有一个未授予
     */
    fun isGranted(context: Context, vararg permissions: String): Boolean {
        return XXPermissions.isGranted(context, *permissions)
    }
    
    /**
     * 请求权限（简化版）
     * 
     * 适用于大多数场景，只关心是否全部授予
     * 
     * @param activity Activity 实例
     * @param permissions 要请求的权限列表
     * @param onGranted 所有权限都已授予时的回调
     * @param onDenied 有权限被拒绝时的回调（可选）
     */
    fun request(
        activity: FragmentActivity,
        vararg permissions: String,
        onGranted: () -> Unit,
        onDenied: (() -> Unit)? = null
    ) {
        // 先检查是否已授予
        if (XXPermissions.isGranted(activity, *permissions)) {
            onGranted()
            return
        }
        
        // 请求权限
        XXPermissions.with(activity)
            .permission(*permissions)
            .request(object : OnPermissionCallback {
                override fun onGranted(permissions: MutableList<String>, allGranted: Boolean) {
                    if (allGranted) {
                        onGranted()
                    } else {
                        onDenied?.invoke()
                    }
                }
                
                override fun onDenied(permissions: MutableList<String>, doNotAskAgain: Boolean) {
                    onDenied?.invoke()
                }
            })
    }
    
    /**
     * 请求权限（详细结果版）
     * 
     * 适用于需要知道具体哪些权限被授予、哪些被拒绝的场景
     * 
     * @param activity Activity 实例
     * @param permissions 要请求的权限列表
     * @param callback 权限请求结果回调（已授予列表，被拒绝列表，是否永久拒绝）
     */
    fun requestWithResult(
        activity: FragmentActivity,
        vararg permissions: String,
        callback: (granted: List<String>, denied: List<String>, doNotAskAgain: Boolean) -> Unit
    ) {
        XXPermissions.with(activity)
            .permission(*permissions)
            .request(object : OnPermissionCallback {
                override fun onGranted(permissions: MutableList<String>, allGranted: Boolean) {
                    if (allGranted) {
                        callback(permissions, emptyList(), false)
                    } else {
                        // 这个分支理论上不会执行，因为 allGranted=false 会走 onDenied
                        callback(permissions, emptyList(), false)
                    }
                }
                
                override fun onDenied(permissions: MutableList<String>, doNotAskAgain: Boolean) {
                    // 找出哪些被授予了，哪些被拒绝了
                    val grantedList = mutableListOf<String>()
                    val deniedList = mutableListOf<String>()
                    
                    for (permission in permissions) {
                        if (XXPermissions.isGranted(activity, permission)) {
                            grantedList.add(permission)
                        } else {
                            deniedList.add(permission)
                        }
                    }
                    
                    callback(grantedList, deniedList, doNotAskAgain)
                }
            })
    }
    
    /**
     * 显示权限设置对话框
     * 
     * 当用户永久拒绝权限时，引导用户前往设置页面手动授予
     * 
     * @param activity Activity 实例
     * @param message 提示消息
     * @param positiveText 确定按钮文本
     * @param negativeText 取消按钮文本
     * @param onConfirm 用户点击确定后的回调（默认跳转到设置页）
     */
    fun showPermissionSettingDialog(
        activity: Activity,
        message: String = "权限被拒绝，请前往设置页面手动授予",
        positiveText: String = "去设置",
        negativeText: String = "取消",
        onConfirm: (() -> Unit)? = null
    ) {
        XXPermissions.startPermissionActivity(activity, message)
        onConfirm?.invoke()
    }
    
    /**
     * 直接跳转到应用权限设置页面
     * 
     * @param activity Activity 实例
     */
    fun startPermissionActivity(activity: Activity) {
        XXPermissions.startPermissionActivity(activity)
    }
}

