package cc.winboll.studio.midiplayer;

/**
 * @Author ZhanGSKen<zhangsken@qq.com>
 * @Date 2025/06/29 10:56
 * @Describe 用于将assets/midi目录下的文件拷贝到内部存储
 */
import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class AssetMidiCopier {
	public static final String TAG = "AssetMidiCopier";

	private Context mContext;

	public AssetMidiCopier(Context context) {
		mContext = context;
	}

	/**
	 * 拷贝assets/midi目录下所有文件到内部存储的midi文件夹
	 * @return 拷贝是否成功
	 */
	public boolean copyMidiFiles() {
		AssetManager assetManager = mContext.getAssets();
		String[] midiFiles;

		try {
			// 获取assets/midi目录下的所有文件
			midiFiles = assetManager.list("midi");
			if (midiFiles == null || midiFiles.length == 0) {
				Log.d(TAG, "assets/midi目录下没有文件");
				return false;
			}

			// 获取内部存储的目标目录（/data/data/包名/files/midi）
			File targetDir = new File(mContext.getFilesDir(), "midi");
			if (!targetDir.exists()) {
				// 创建目录（包括父目录）
				if (!targetDir.mkdirs()) {
					Log.e(TAG, "创建目标目录失败: " + targetDir.getAbsolutePath());
					return false;
				}
			}

			// 逐个拷贝文件
			for (String fileName : midiFiles) {
				// 跳过目录，只处理文件
				if (fileName.contains("/")) {
					continue;
				}

				// 源文件路径（assets/midi/文件名）
				String sourcePath = "midi/" + fileName;
				// 目标文件路径
				File targetFile = new File(targetDir, fileName);

				// 如果文件已存在，跳过拷贝
				if (targetFile.exists()) {
					Log.d(TAG, "文件已存在，跳过: " + fileName);
					continue;
				}

				// 执行拷贝
				if (!copySingleFile(assetManager, sourcePath, targetFile)) {
					Log.e(TAG, "拷贝文件失败: " + fileName);
					return false;
				}
			}

			Log.d(TAG, "所有MIDI文件拷贝完成，共" + midiFiles.length + "个文件");
			return true;

		} catch (IOException e) {
			Log.e(TAG, "拷贝过程发生错误: " + e.getMessage());
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 拷贝单个assets文件到目标路径
	 */
	private boolean copySingleFile(AssetManager assetManager, String sourcePath, File targetFile) {
		InputStream in = null;
		FileOutputStream out = null;

		try {
			// 打开assets中的源文件
			in = assetManager.open(sourcePath);
			// 创建目标文件输出流
			out = new FileOutputStream(targetFile);

			// 缓冲区
			byte[] buffer = new byte[1024];
			int length;
			// 读写文件
			while ((length = in.read(buffer)) != -1) {
				out.write(buffer, 0, length);
			}

			// 刷新输出流，确保数据写入
			out.flush();
			return true;

		} catch (IOException e) {
			Log.e(TAG, "拷贝单个文件错误: " + e.getMessage());
			return false;

		} finally {
			// 关闭流
			try {
				if (in != null) {
					in.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 获取内部存储中MIDI文件的目录
	 */
	public File getMidiTargetDir() {
		return new File(mContext.getFilesDir(), "midi");
	}
}

