package com.narutohuo.xindazhou.common.file

import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.provider.MediaStore
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.Fragment

/**
 * 文件选择器管理器
 * 
 * 统一封装文件选择功能，提供便捷的文件选择方式
 * 
 * 使用方式：
 * ```kotlin
 * // 在 Activity/Fragment 中注册
 * private val pickImageLauncher = FilePickerHelper.registerPickImage(this) { uri ->
 *     // 处理选中的图片
 * }
 * 
 * // 选择图片
 * pickImageLauncher.launch()
 * 
 * // 选择文件
 * private val pickFileLauncher = FilePickerHelper.registerPickFile(this, "image/png") { uri ->
 *     // 处理选中的文件
 * }
 * pickFileLauncher.launch()
 * ```
 */
object FilePickerHelper {
    
    /**
     * 注册图片选择器（Activity）
     * 
     * @param activity ComponentActivity 实例
     * @param onResult 选择结果回调
     * @return ActivityResultLauncher，调用 launch() 启动选择器
     */
    fun registerPickImage(
        activity: ComponentActivity,
        onResult: (Uri?) -> Unit
    ): ActivityResultLauncher<Intent> {
        return activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                val uri = result.data?.data
                onResult(uri)
            } else {
                onResult(null)
            }
        }
    }
    
    /**
     * 注册图片选择器（Fragment）
     * 
     * @param fragment Fragment 实例
     * @param onResult 选择结果回调
     * @return ActivityResultLauncher，调用 launch() 启动选择器
     */
    fun registerPickImage(
        fragment: Fragment,
        onResult: (Uri?) -> Unit
    ): ActivityResultLauncher<Intent> {
        return fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                val uri = result.data?.data
                onResult(uri)
            } else {
                onResult(null)
            }
        }
    }
    
    /**
     * 启动图片选择器（简化版，使用 Intent）
     * 
     * @param activity Activity 实例
     * @param onResult 选择结果回调
     */
    fun pickImage(activity: Activity, onResult: (Uri?) -> Unit) {
        val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        activity.startActivityForResult(intent, 1001)
        // 注意：这种方式需要重写 onActivityResult，建议使用 registerPickImage
    }
    
    /**
     * 注册文件选择器（Activity）
     * 
     * @param activity ComponentActivity 实例
     * @param mimeType MIME 类型（如 "image/png", "application/pdf"）
     * @param onResult 选择结果回调
     * @return ActivityResultLauncher
     */
    fun registerPickFile(
        activity: ComponentActivity,
        mimeType: String,
        onResult: (Uri?) -> Unit
    ): ActivityResultLauncher<Intent> {
        return activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                val uri = result.data?.data
                onResult(uri)
            } else {
                onResult(null)
            }
        }
    }
    
    /**
     * 注册文件选择器（Fragment）
     * 
     * @param fragment Fragment 实例
     * @param mimeType MIME 类型
     * @param onResult 选择结果回调
     * @return ActivityResultLauncher
     */
    fun registerPickFile(
        fragment: Fragment,
        mimeType: String,
        onResult: (Uri?) -> Unit
    ): ActivityResultLauncher<Intent> {
        return fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                val uri = result.data?.data
                onResult(uri)
            } else {
                onResult(null)
            }
        }
    }
    
    /**
     * 启动文件选择器（简化版）
     * 
     * @param activity Activity 实例
     * @param mimeType MIME 类型
     * @param onResult 选择结果回调
     */
    fun pickFile(activity: Activity, mimeType: String, onResult: (Uri?) -> Unit) {
        val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
            type = mimeType
            addCategory(Intent.CATEGORY_OPENABLE)
        }
        activity.startActivityForResult(Intent.createChooser(intent, "选择文件"), 1002)
        // 注意：这种方式需要重写 onActivityResult，建议使用 registerPickFile
    }
    
    /**
     * 注册多文件选择器（Fragment，Android 11+）
     * 
     * @param fragment Fragment 实例
     * @param mimeType MIME 类型
     * @param onResult 选择结果回调
     * @return ActivityResultLauncher
     */
    fun registerPickMultipleFiles(
        fragment: Fragment,
        mimeType: String,
        onResult: (List<Uri>) -> Unit
    ): ActivityResultLauncher<String> {
        return fragment.registerForActivityResult(ActivityResultContracts.GetMultipleContents()) { uris ->
            onResult(uris)
        }
    }
    
    /**
     * 启动多文件选择器（Fragment）
     * 
     * @param launcher ActivityResultLauncher（通过 registerPickMultipleFiles 获取）
     * @param mimeType MIME 类型
     */
    fun pickMultipleFiles(launcher: ActivityResultLauncher<String>, mimeType: String) {
        launcher.launch(mimeType)
    }
}

