package com.tsgame.tsgame_niuniu.util;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 微信分享工具类 - 无需SDK，使用Intent实现
 */
public class WeChatIntentShareUtil {
    private static final String TAG = "WeChatShareUtil";

    // 微信包名
    private static final String WECHAT_PACKAGE_NAME = "com.tencent.mm";

    // 微信朋友圈分享界面Activity
    private static final String WECHAT_MOMENTS_ACTIVITY = "com.tencent.mm.ui.tools.ShareToTimeLineUI";

    // 微信好友分享界面Activity
    private static final String WECHAT_FRIENDS_ACTIVITY = "com.tencent.mm.ui.tools.ShareImgUI";

    // 分享场景
    public static final int SCENE_FRIENDS = 0;  // 分享给好友
    public static final int SCENE_MOMENTS = 1;  // 分享到朋友圈

    private static WeChatIntentShareUtil instance;
    private final Context mContext;
    private WeChatShareCallback mCallback;

    private WeChatIntentShareUtil(Context context) {
        this.mContext = context.getApplicationContext();
    }

    public static WeChatIntentShareUtil getInstance(Context context) {
        if (instance == null && context != null) {
            instance = new WeChatIntentShareUtil(context);
        }
        return instance;
    }

    /**
     * 设置分享回调
     * @param callback 回调接口
     */
    public void setShareCallback(WeChatShareCallback callback) {
        this.mCallback = callback;
    }

    /**
     * 检查微信是否已安装
     * @return 是否安装
     */
    public boolean isWeChatInstalled() {
        PackageManager pm = mContext.getPackageManager();
        try {
            pm.getPackageInfo(WECHAT_PACKAGE_NAME, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            return false;
        }
    }

    /**
     * 分享纯文本到微信
     * @param activity 活动
     * @param text 要分享的文本
     * @param scene 分享场景：0-好友，1-朋友圈
     */
    public void shareTextToWeChat(Activity activity, String text, int scene) {
        if (!isWeChatInstalled()) {
            handleNotInstalled(activity);
            return;
        }

        try {
            // 创建分享Intent
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_TEXT, text);

            // 指定微信包名
            intent.setPackage(WECHAT_PACKAGE_NAME);

            // 根据分享场景指定目标Activity
            if (scene == SCENE_MOMENTS) {
                // 微信朋友圈分享不支持纯文本分享，提示用户
                Toast.makeText(activity, "微信朋友圈不支持纯文本分享，请使用图文分享", Toast.LENGTH_SHORT).show();
                if (mCallback != null) {
                    mCallback.onError(-1, "微信朋友圈不支持纯文本分享");
                }
                return;
            }

            try {
                activity.startActivity(intent);
                handleShareSuccess();
            } catch (Exception e) {
                Log.e(TAG, "分享文本到微信失败: " + e.getMessage(), e);
                handleShareException(activity, e);
            }
        } catch (Exception e) {
            Log.e(TAG, "分享过程中出现异常: " + e.getMessage(), e);
            handleShareException(activity, e);
        }
    }

    /**
     * 分享图片到微信
     * @param activity 活动
     * @param localImagePath 本地图片路径
     * @param scene 分享场景：0-好友，1-朋友圈
     */
    public void shareImage(Activity activity, String localImagePath, int scene) {
        if (!isWeChatInstalled()) {
            handleNotInstalled(activity);
            return;
        }

        File imageFile = new File(localImagePath);
        if (!imageFile.exists()) {
            Toast.makeText(activity, "分享图片不存在", Toast.LENGTH_SHORT).show();
            if (mCallback != null) {
                mCallback.onError(-2, "图片文件不存在");
            }
            return;
        }

        try {
            // 创建分享Intent
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("image/*");

            // 根据Android版本使用不同的Uri方式
            Uri imageUri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                // Android 7.0及以上使用FileProvider
                imageUri = FileProviderUtil.getUriForFile(activity, imageFile);
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            } else {
                // Android 7.0以下直接使用文件Uri
                imageUri = Uri.fromFile(imageFile);
            }

            intent.putExtra(Intent.EXTRA_STREAM, imageUri);

            // 指定微信包名
            intent.setPackage(WECHAT_PACKAGE_NAME);

            // 根据分享场景指定目标Activity
            if (scene == SCENE_MOMENTS) {
                // 分享到朋友圈
                intent.setClassName(WECHAT_PACKAGE_NAME, WECHAT_MOMENTS_ACTIVITY);
            } else {
                // 分享给好友
                intent.setClassName(WECHAT_PACKAGE_NAME, WECHAT_FRIENDS_ACTIVITY);
            }

            try {
                activity.startActivity(intent);
                handleShareSuccess();
            } catch (Exception e) {
                Log.e(TAG, "分享图片到微信失败: " + e.getMessage(), e);

                // 如果指定Activity失败，尝试使用通用分享
                try {
                    Intent generalIntent = new Intent(Intent.ACTION_SEND);
                    generalIntent.setType("image/*");
                    generalIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
                    generalIntent.setPackage(WECHAT_PACKAGE_NAME);
                    activity.startActivity(generalIntent);
                    handleShareSuccess();
                } catch (Exception ex) {
                    handleShareException(activity, ex);
                }
            }
        } catch (Exception e) {
            Log.e(TAG, "分享过程中出现异常: " + e.getMessage(), e);
            handleShareException(activity, e);
        }
    }

    /**
     * 分享多张图片到微信
     * @param activity 活动
     * @param imagePaths 图片路径列表
     * @param scene 分享场景：0-好友，1-朋友圈
     */
    public void shareImages(Activity activity, ArrayList<String> imagePaths, int scene) {
        if (!isWeChatInstalled()) {
            handleNotInstalled(activity);
            return;
        }

        if (imagePaths == null || imagePaths.isEmpty()) {
            Toast.makeText(activity, "分享图片为空", Toast.LENGTH_SHORT).show();
            if (mCallback != null) {
                mCallback.onError(-1, "分享图片为空");
            }
            return;
        }

        try {
            ArrayList<Uri> imageUris = new ArrayList<>();
            for (String path : imagePaths) {
                File file = new File(path);
                if (file.exists()) {
                    // 根据Android版本使用不同的Uri方式
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        // Android 7.0及以上使用FileProvider
                        Uri fileUri = FileProviderUtil.getUriForFile(activity, file);
                        imageUris.add(fileUri);
                    } else {
                        // Android 7.0以下直接使用文件Uri
                        imageUris.add(Uri.fromFile(file));
                    }
                }
            }

            if (imageUris.isEmpty()) {
                Toast.makeText(activity, "没有有效图片可分享", Toast.LENGTH_SHORT).show();
                if (mCallback != null) {
                    mCallback.onError(-1, "没有有效图片可分享");
                }
                return;
            }

            Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
            intent.setType("image/*");
            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
            intent.setPackage(WECHAT_PACKAGE_NAME);

            // 根据分享场景指定不同的Activity
            if (scene == SCENE_MOMENTS) {
                // 分享到朋友圈
                intent.setClassName(WECHAT_PACKAGE_NAME, WECHAT_MOMENTS_ACTIVITY);
            } else {
                // 分享给好友
                intent.setClassName(WECHAT_PACKAGE_NAME, WECHAT_FRIENDS_ACTIVITY);
            }

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            }

            try {
                activity.startActivity(intent);
                handleShareSuccess();
            } catch (Exception e) {
                Log.e(TAG, "多图分享失败，尝试使用通用分享: " + e.getMessage());

                // 尝试使用通用分享
                try {
                    Intent generalIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
                    generalIntent.setType("image/*");
                    generalIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
                    generalIntent.setPackage(WECHAT_PACKAGE_NAME);
                    activity.startActivity(generalIntent);
                    handleShareSuccess();
                } catch (Exception ex) {
                    handleShareException(activity, ex);
                }
            }
        } catch (Exception e) {
            handleShareException(activity, e);
        }
    }

    /**
     * 分享Bitmap图片到微信
     * @param activity 活动
     * @param bitmap 位图
     * @param scene 分享场景：0-好友，1-朋友圈
     */
    public void shareBitmap(Activity activity, Bitmap bitmap, int scene) {
        if (bitmap == null) {
            Toast.makeText(activity, "分享图片为空", Toast.LENGTH_SHORT).show();
            if (mCallback != null) {
                mCallback.onError(-1, "分享图片为空");
            }
            return;
        }

        try {
            File cacheDir = activity.getExternalCacheDir();
            if (cacheDir == null) {
                cacheDir = activity.getCacheDir();
            }

            File imageFile = new File(cacheDir, "wechat_share_" + UUID.randomUUID().toString() + ".jpg");
            FileOutputStream fos = new FileOutputStream(imageFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
            fos.flush();
            fos.close();

            // 保存成功，分享图片
            shareImage(activity, imageFile.getAbsolutePath(), scene);
        } catch (Exception e) {
            Toast.makeText(activity, "保存图片失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
            if (mCallback != null) {
                mCallback.onError(-2, "保存图片失败: " + e.getMessage());
            }
        }
    }

    /**
     * 分享网页链接到微信
     * 注意：微信原生分享不支持直接分享链接，这里实际是分享文本
     * 真正的网页分享需要使用微信SDK和公众号
     * @param activity 活动
     * @param title 标题
     * @param description 描述
     * @param webUrl 网页链接
     * @param scene 分享场景：0-好友，1-朋友圈
     */
    public void shareWebPage(Activity activity, String webUrl, String title, String description, int scene) {
        if (!isWeChatInstalled()) {
            handleNotInstalled(activity);
            return;
        }

        try {
            // 微信不支持直接分享网页链接，只能作为文本分享
            StringBuilder sb = new StringBuilder();
            if (!TextUtils.isEmpty(title)) {
                sb.append(title).append("\n\n");
            }
            if (!TextUtils.isEmpty(description)) {
                sb.append(description).append("\n\n");
            }
            if (!TextUtils.isEmpty(webUrl)) {
                sb.append(webUrl);
            }

            // 朋友圈不支持纯文本分享，需要准备一个默认图片
            if (scene == SCENE_MOMENTS) {
                Toast.makeText(activity, "微信朋友圈不支持直接分享网页链接，将作为文本分享", Toast.LENGTH_SHORT).show();

                // 尝试使用WebView截图分享
                // 实际项目中可以实现WebView加载页面并截图分享的功能
                // 这里为简化处理，可以使用应用图标作为默认图片
                try {
                    // 调用系统分享
                    Intent intent = new Intent(Intent.ACTION_SEND);
                    intent.setType("text/plain");
                    intent.putExtra(Intent.EXTRA_TEXT, sb.toString());
                    intent.setPackage(WECHAT_PACKAGE_NAME);
                    activity.startActivity(intent);
                    handleShareSuccess();
                } catch (Exception e) {
                    Log.e(TAG, "分享文本到微信失败: " + e.getMessage(), e);
                    handleShareException(activity, e);
                }
            } else {
                // 分享给好友，可以直接分享文本
                shareTextToWeChat(activity, sb.toString(), scene);
            }
        } catch (Exception e) {
            Log.e(TAG, "分享过程中出现异常: " + e.getMessage(), e);
            handleShareException(activity, e);
        }
    }

    /**
     * 处理分享成功的情况
     */
    private void handleShareSuccess() {
        if (mCallback != null) {
            new Handler(Looper.getMainLooper()).postDelayed(() -> {
                mCallback.onSuccess();
            }, 1000);
        }
    }

    /**
     * 处理未安装微信的情况
     */
    private void handleNotInstalled(Activity activity) {
        Toast.makeText(activity, "请先安装微信客户端", Toast.LENGTH_SHORT).show();
        if (mCallback != null) {
            mCallback.onError(-1, "未安装微信客户端");
        }
    }

    /**
     * 处理分享异常
     */
    private void handleShareException(Activity activity, Exception e) {
        Toast.makeText(activity, "分享失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        if (mCallback != null) {
            mCallback.onError(-3, "分享失败: " + e.getMessage());
        }
    }

    /**
     * 微信分享回调接口
     */
    public interface WeChatShareCallback {
        void onSuccess();
        void onError(int code, String message);
        void onCancel();
    }
}
