package cc.winboll.studio.powerbell.views;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.powerbell.R;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
 * @Date 2025/11/19 18:01
 * @Describe 背景图片视图控件（加载外置存储 Background/current.jpg）
 */
public class BackgroundView extends RelativeLayout {
    
    public static final String TAG = "BackgroundView";
    
    Context mContext;
    View mMianView;
    
    // 外置存储背景图片路径：/storage/emulated/0/Android/data/应用包名/files/Background/current.jpg
    private static String BACKGROUND_IMAGE_FOLDER = "Background";
    private static String BACKGROUND_IMAGE_FILENAME = "current.data";
	private static String backgroundSourceFilePath;
    
    public BackgroundView(Context context) {
        super(context);
        this.mContext = context;
        initView();
    }

    public BackgroundView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        initView();
    }

    public BackgroundView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        initView();
    }

    public BackgroundView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        this.mContext = context;
        initView();
    }

    void initView() {
        // 1. 初始化外置存储背景图片路径（应用私有外置存储，无需动态权限）
        initBackgroundImagePath();
        
        // 2. 加载并设置背景图片
        loadAndSetBackground();
    }

    /**
     * 初始化外置存储背景图片路径
     * 路径：/storage/emulated/0/Android/data/应用包名/files/Background/current.jpg
     */
    private void initBackgroundImagePath() {
        // 获取应用私有外置存储的 files 目录（API 19+ 无需权限）
        File externalFilesDir = mContext.getExternalFilesDir(null);
        if (externalFilesDir == null) {
            LogUtils.e(TAG, "外置存储不可用，无法初始化背景图片路径");
            return;
        }
        
        // 拼接 Background 目录和 current.jpg 文件路径
        File backgroundDir = new File(externalFilesDir, "Background");
		if(!backgroundDir.exists()){
			backgroundDir.mkdirs();
		}
        //BACKGROUND_IMAGE_PATH = new File(backgroundDir, "current.jpg").getAbsolutePath();
        //BACKGROUND_IMAGE_PATH = new File(backgroundDir, "current.data").getAbsolutePath();
		backgroundSourceFilePath = new File(backgroundDir, BACKGROUND_IMAGE_FILENAME).getAbsolutePath();
        //LogUtils.d(TAG, "背景图片路径：" + BACKGROUND_IMAGE_PATH);
    }
	
	/**
	 * 拷贝图片文件到背景资源目录
	 * @param srcBackgroundPath 源文件路径（待拷贝的图片路径）
	 */
	public void saveToBackgroundSources(String srcBackgroundPath) {
		// 1. 初始化目标路径（确保路径有效）
		initBackgroundImagePath();
		if (backgroundSourceFilePath == null) {
			LogUtils.e(TAG, "目标路径初始化失败，无法保存背景图片");
			return;
		}

		// 2. 校验源文件
		File srcFile = new File(srcBackgroundPath);
		if (!srcFile.exists() || !srcFile.isFile()) {
			LogUtils.e(TAG, String.format("源文件不存在或不是文件：%s", srcBackgroundPath));
			return;
		}

		// 3. 创建目标目录（若不存在）
		File destFile = new File(backgroundSourceFilePath);
		File destDir = destFile.getParentFile();
		if (destDir != null && !destDir.exists()) {
			boolean isDirCreated = destDir.mkdirs();
			if (!isDirCreated) {
				LogUtils.e(TAG, "目标目录创建失败：" + destDir.getAbsolutePath());
				return;
			}
		}

		// 4. 文件流拷贝（Java 7 原生实现，兼容低版本）
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(srcFile);
			fos = new FileOutputStream(destFile); // 覆盖已有文件（如需询问用户可在此处添加逻辑）

			// 缓冲区拷贝（提升效率，避免频繁 IO 操作）
			byte[] buffer = new byte[4096];
			int len;
			while ((len = fis.read(buffer)) != -1) {
				fos.write(buffer, 0, len);
			}
			fos.flush(); // 强制刷新缓冲区，确保数据完整写入

			LogUtils.d(TAG, String.format("文件拷贝成功：%s -> %s", srcBackgroundPath, backgroundSourceFilePath));

		} catch (Exception e) {
			// 捕获所有异常，避免崩溃
			LogUtils.e(TAG, String.format("文件拷贝失败：%s", e.getMessage()), e);
			// 拷贝失败时删除目标文件（避免生成损坏文件）
			if (destFile.exists()) {
				destFile.delete();
				LogUtils.d(TAG, "已删除损坏的目标文件");
			}
		} finally {
			// 5. 关闭流（Java 7 手动关闭，避免资源泄漏）
			if (fis != null) {
				try {
					fis.close();
				} catch (Exception e) {
					LogUtils.e(TAG, "输入流关闭失败：" + e.getMessage());
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (Exception e) {
					LogUtils.e(TAG, "输出流关闭失败：" + e.getMessage());
				}
			}
		}
	}

    /**
     * 加载外置存储的 current.jpg 并设置为控件背景
     * 支持：文件压缩、版本兼容、异常兜底
     */
    private void loadAndSetBackground() {
        // 校验路径是否有效
        if (backgroundSourceFilePath == null) {
            setDefaultBackground();
            return;
        }

        File backgroundFile = new File(backgroundSourceFilePath);
        // 校验文件是否存在
        if (!backgroundFile.exists() || !backgroundFile.isFile()) {
            LogUtils.e(TAG, "背景图片不存在：" + backgroundSourceFilePath);
            setDefaultBackground();
            return;
        }

        // 3. 压缩加载 Bitmap（避免 OOM）
        Bitmap bitmap = decodeBitmapWithCompress(backgroundFile, 1080, 1920); // 最大宽高限制
        if (bitmap == null) {
            LogUtils.e(TAG, "图片加载失败，无法解析为 Bitmap");
            setDefaultBackground();
            return;
        }

        // 4. 设置为控件背景（兼容 Android 低版本）
        Drawable backgroundDrawable = new BitmapDrawable(mContext.getResources(), bitmap);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            this.setBackground(backgroundDrawable);
        } else {
            this.setBackgroundDrawable(backgroundDrawable);
        }
        LogUtils.d(TAG, "背景图片加载成功");
    }

    /**
     * 带压缩的 Bitmap 解码（避免大图导致 OOM）
     * @param file 图片文件
     * @param maxWidth 最大宽度限制
     * @param maxHeight 最大高度限制
     * @return 压缩后的 Bitmap（null 表示失败）
     */
    private Bitmap decodeBitmapWithCompress(File file, int maxWidth, int maxHeight) {
        try {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true; // 先获取图片尺寸，不加载到内存
            BitmapFactory.decodeFile(file.getAbsolutePath(), options);

            // 计算缩放比例
            int scaleX = options.outWidth / maxWidth;
            int scaleY = options.outHeight / maxHeight;
            int inSampleSize = Math.max(scaleX, scaleY);
            if (inSampleSize <= 0) {
                inSampleSize = 1; // 最小缩放比例为 1
            }

            // 正式加载图片并压缩
            options.inJustDecodeBounds = false;
            options.inSampleSize = inSampleSize;
            options.inPreferredConfig = Bitmap.Config.RGB_565; // 降低像素格式，减少内存占用
            return BitmapFactory.decodeFile(file.getAbsolutePath(), options);
        } catch (Exception e) {
            LogUtils.e(TAG, "图片压缩加载失败：" + e.getMessage());
            return null;
        }
    }

    /**
     * 设置默认背景（图片加载失败时兜底）
     */
    private void setDefaultBackground() {
        // 可替换为项目自定义的默认背景图
        this.setBackgroundResource(R.drawable.default_background);
        LogUtils.d(TAG, "已设置默认背景");
    }
}
