package cc.winboll.studio.powerbell.utils;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import androidx.core.content.FileProvider;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.powerbell.models.BackgroundBean;
import com.yalantis.ucrop.UCrop;
import com.yalantis.ucrop.UCropActivity;
import java.io.File;
import cc.winboll.studio.powerbell.R;

/**
 * 图片裁剪工具类（集成uCrop，脱离系统依赖）
 */
public class ImageCropUtils {
    public static final String TAG = "ImageCropUtils";
    // FileProvider 授权（与项目一致）
    private static final String FILE_PROVIDER_SUFFIX = ".fileprovider";

    /**
     * 启动uCrop裁剪（核心方法，替代系统裁剪）
     * @param activity 上下文
     * @param inputFile 输入图片文件
     * @param outputFile 输出图片文件
     * @param isFreeCrop 是否自由裁剪（true=自由，false=固定比例）
     * @param requestCode 裁剪请求码
     */
    public static void startImageCrop(Activity activity,
                                      File inputFile,
                                      File outputFile,
									  int aspectX,
                                      int aspectY,
                                      boolean isFreeCrop,
                                      int requestCode) {
        // 校验输入参数
        if (activity == null || activity.isFinishing()) {
            LogUtils.e(TAG, "【裁剪异常】上下文Activity无效");
            return;
        }
        if (inputFile == null || !inputFile.exists() || inputFile.length() <= 100) {
            LogUtils.e(TAG, "【裁剪异常】输入文件无效");
            showToast(activity, "无有效图片可裁剪");
            return;
        }
        if (outputFile == null) {
            LogUtils.e(TAG, "【裁剪异常】输出文件路径为空");
            showToast(activity, "裁剪输出路径无效");
            return;
        }

        // 生成输入/输出Uri（适配FileProvider）
        Uri inputUri = getFileProviderUri(activity, inputFile);
        Uri outputUri = Uri.fromFile(outputFile); // uCrop 支持直接用文件Uri（兼容低版本）

        // 配置uCrop参数
        UCrop uCrop = UCrop.of(inputUri, outputUri);
        UCrop.Options options = new UCrop.Options();

        // 裁剪模式配置（自由裁剪/固定比例）
        if (isFreeCrop) {
            // 自由裁剪：无固定比例，可随意调整
            uCrop.withAspectRatio(0, 0);
            options.setFreeStyleCropEnabled(true); // 开启自由裁剪
        } else {
            // 固定比例（默认1:1，可根据需求修改）
            uCrop.withAspectRatio(aspectX, aspectY);
            options.setFreeStyleCropEnabled(false);
        }

        // 裁剪配置（优化体验）
        options.setCompressionFormat(android.graphics.Bitmap.CompressFormat.JPEG); // 输出格式
        options.setCompressionQuality(100); // 图片质量
        options.setHideBottomControls(true); // 隐藏底部控制栏（简化界面）
        options.setToolbarTitle("图片裁剪"); // 工具栏标题
        options.setToolbarColor(activity.getResources().getColor(R.color.colorPrimary)); // 工具栏颜色（适配项目主题）
        options.setStatusBarColor(activity.getResources().getColor(R.color.colorPrimaryDark)); // 状态栏颜色

        // 应用配置并启动裁剪
        uCrop.withOptions(options);
        // 启动uCrop裁剪Activity（替代系统裁剪）
        uCrop.start(activity, requestCode);

        LogUtils.d(TAG, "【uCrop启动】成功，输入Uri：" + inputUri + "，输出Uri：" + outputUri + "，请求码：" + requestCode);
    }

    /**
     * 重载方法：适配BackgroundBean
     */
    public static void startImageCrop(Activity activity,
                                      BackgroundBean cropBean,
									  int aspectX,
                                      int aspectY,
                                      boolean isFreeCrop,
                                      int requestCode) {
        File inputFile = new File(cropBean.getBackgroundFilePath());
        File outputFile = new File(cropBean.getBackgroundScaledCompressFilePath());
        startImageCrop(activity, inputFile, outputFile, aspectX, aspectY, isFreeCrop, requestCode);
    }

    /**
     * 生成FileProvider Uri
     */
    private static Uri getFileProviderUri(Activity activity, File file) {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                String authority = activity.getPackageName() + FILE_PROVIDER_SUFFIX;
                Uri uri = FileProvider.getUriForFile(activity, authority, file);
                LogUtils.d(TAG, "【Uri生成】FileProvider Uri：" + uri);
                return uri;
            } else {
                Uri uri = Uri.fromFile(file);
                LogUtils.d(TAG, "【Uri生成】普通Uri：" + uri);
                return uri;
            }
        } catch (Exception e) {
            LogUtils.e(TAG, "【Uri生成】失败：" + e.getMessage());
            return null;
        }
    }

    /**
     * 处理uCrop裁剪回调（在Activity的onActivityResult中调用）
     * @param requestCode 请求码
     * @param resultCode 结果码
     * @param data 回调数据
     * @return 裁剪成功返回输出文件路径，失败返回null
     */
    public static String handleCropResult(int requestCode, int resultCode, Intent data, int cropRequestCode) {
        // 校验是否是uCrop的回调
        if (requestCode == cropRequestCode) {
            if (resultCode == Activity.RESULT_OK && data != null) {
                // 裁剪成功，获取输出Uri
                Uri outputUri = UCrop.getOutput(data);
                if (outputUri != null) {
                    String outputPath = outputUri.getPath();
                    LogUtils.d(TAG, "【uCrop回调】裁剪成功，输出路径：" + outputPath);
                    return outputPath;
                }
            } else if (resultCode == UCrop.RESULT_ERROR) {
                // 裁剪失败，获取异常信息
                Throwable error = UCrop.getError(data);
                LogUtils.e(TAG, "【uCrop回调】裁剪失败：" + (error != null ? error.getMessage() : "未知错误"));
            } else {
                LogUtils.d(TAG, "【uCrop回调】裁剪被取消");
            }
        }
        return null;
    }

    /**
     * 显示Toast
     */
    private static void showToast(Activity activity, String msg) {
        if (activity != null && !activity.isFinishing()) {
            android.widget.Toast.makeText(activity, msg, android.widget.Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 暴露getFileProviderUri方法（供外部调用）
     */
    public static Uri getFileProviderUriPublic(Activity activity, File file) {
        return getFileProviderUri(activity, file);
    }
}

