package com.offline.music.player.ui.fragmnt.viewmodel;

import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;

import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.MutableLiveData;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.offline.music.player.javabean.A_data.AudioItem;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class A_VMImport extends AndroidViewModel {

    private static final String PREFS_NAME = "audio_files_prefs";
    private static final String AUDIO_FILES_KEY = "audio_files";

    private final MutableLiveData<List<AudioItem>> audioFilesLiveData = new MutableLiveData<>();
    private final SharedPreferences sharedPreferences;
    private final Gson gson;
    private final List<AudioItem> audioFiles;

    public A_VMImport(Application application) {
        super(application);
        sharedPreferences = application.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        gson = new Gson();
        audioFiles = loadAudioFiles(); // 加载已保存的音频文件列表
        audioFilesLiveData.setValue(new ArrayList<>(audioFiles)); // 设置 LiveData 的初始值
    }

    // 添加选中的音频文件
    public void addAudioFile(Uri audioUri) throws IOException {
        String fileName = null;
        long duration = 0;

        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setDataSource(getApplication(), audioUri);
            fileName = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
            String durationStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            if (durationStr != null) {
                duration = Long.parseLong(durationStr);
            }
        } catch (Exception e) {
            Log.e("ViewModel", "Failed to retrieve audio metadata", e);
        } finally {
            retriever.release(); // 释放资源
        }

        // 如果 fileName 为空，使用 URI 的最后一部分作为文件名
        if (fileName == null || fileName.isEmpty()) {
            fileName = audioUri.getLastPathSegment();
        }

        if (duration > 0) {
            AudioItem newItem = new AudioItem(fileName, audioUri.toString(), "");
            newItem.setDuration(formatDuration(duration)); // 格式化时长

            // 防止重复添加
            if (!audioFiles.contains(newItem)) {
                audioFiles.add(newItem);
                saveAudioFiles(); // 每次添加后保存到 SharedPreferences
                audioFilesLiveData.setValue(new ArrayList<>(audioFiles)); // 更新 LiveData
            } else {
                Toast.makeText(getApplication(), "Audio file already exists in the list.", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(getApplication(), "Failed to retrieve audio duration.", Toast.LENGTH_SHORT).show();
        }
    }
    // 保存音频文件列表到 SharedPreferences
    private void saveAudioFiles() {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        String json = gson.toJson(audioFiles);
        editor.putString(AUDIO_FILES_KEY, json);
        editor.apply();
    }

    // 从 SharedPreferences 加载音频文件列表
    private List<AudioItem> loadAudioFiles() {
        String json = sharedPreferences.getString(AUDIO_FILES_KEY, null);
        Type type = new TypeToken<List<AudioItem>>() {}.getType();
        List<AudioItem> loadedFiles = gson.fromJson(json, type);
        return loadedFiles != null ? loadedFiles : new ArrayList<>(); // 返回加载的文件列表或空列表
    }

    // 标记音频文件为已删除
    public void markAudioAsDeleted(String filePath) {
        // 从列表中移除该音频
        for (AudioItem item : new ArrayList<>(audioFiles)) {
            if (item.getFile().equals(filePath)) {
                audioFiles.remove(item);
                break;
            }
        }

        // 更新 LiveData
        audioFilesLiveData.setValue(new ArrayList<>(audioFiles)); // 更新 LiveData
        saveAudioFiles(); // 更新 SharedPreferences
    }

    // 更新音频文件名称并持久化保存
    public void updateAudioFileName(String oldFilePath, String newName) {
        for (AudioItem item : audioFiles) {
            if (item.getFile().equals(oldFilePath)) {
                item.setName(newName); // 更新音频名称
                break;
            }
        }

        // 更新音频文件列表并保存
        saveAudioFiles(); // 保存更新后的音频文件列表
        audioFilesLiveData.setValue(new ArrayList<>(audioFiles)); // 更新 LiveData
    }

    // 获取音频文件列表
    public MutableLiveData<List<AudioItem>> getAudioFiles() {
        return audioFilesLiveData;
    }

    // 格式化时长
    private String formatDuration(long duration) {
        long minutes = (duration / 1000) / 60;
        long seconds = (duration / 1000) % 60;
        return String.format(Locale.getDefault(), "%d:%02d", minutes, seconds);
    }
}
