﻿using UnityEngine;

namespace JLGames.RocketDriver.Actions.Audio
{
    public interface IAudioManager
    {
        /// <summary>
        /// Current AudioManager instance name
        /// 当前AudioManager实例名
        /// </summary>
        string Named { get; set; }

        /// <summary>
        /// Set the loader adapter
        /// 设置加载适配器
        /// </summary>
        /// <param name="adapter"></param>
        void SetLoaderAdapter(IAudioLoaderAdapter adapter);

        /// <summary>
        /// Check cache existence
        /// 检查缓存存在性
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        bool CheckCache(string key);

        /// <summary>
        /// Whether the sound is allowed to pause
        /// 音效是否允许暂停
        /// </summary>
        bool SoundPausable { get; }

        /// <summary>
        /// User settings
        /// 用户设置
        /// </summary>
        AudioSettingsUser UserSettings { get; }

        /// <summary>
        /// Update user settings.
        /// 更新用户设置
        /// </summary>
        /// <param name="userSettings"></param>
        /// <param name="refresh"></param>
        void SetUserSettings(AudioSettingsUser userSettings, bool refresh = true);

        // Music related 音乐相关---------------------

        /// <summary>
        /// Music playing
        /// 音乐播放中
        /// </summary>
        bool IsMusicPlaying { get; }

        /// <summary>
        /// The name of the music playing
        /// 播放中的音乐名
        /// </summary>
        string PlayingMusicName { get; }

        /// <summary>
        /// Set music volume
        /// 设置音乐音量
        /// </summary>
        /// <param name="volume"></param>
        /// <param name="refresh"></param>
        void SetMusicVolume(float volume, bool refresh = true);

        /// <summary>
        /// Set music mute
        /// 设置音乐静音
        /// </summary>
        /// <param name="muted"></param>
        /// <param name="refresh"></param>
        void SetMusicMuted(bool muted, bool refresh = true);

        /// <summary>
        /// Register music info
        /// 注册音乐信息
        /// </summary>
        /// <param name="key"></param>
        /// <param name="bundleName"></param>
        /// <param name="path"></param>
        void RegisterMusic(string key, string bundleName, string path);

        /// <summary>
        /// Clear music register
        /// 清理音乐注册表
        /// </summary>
        void ClearMusicRegister();

        /// <summary>
        /// Switch music
        /// 切换音乐
        /// </summary>
        /// <param name="key"></param>
        /// <param name="fading"></param>
        void SwitchMusic(string key, bool fading = true);

        /// <summary>
        /// Switch music
        /// 切换音乐
        /// </summary>
        /// <param name="key"></param>
        /// <param name="music"></param>
        /// <param name="fading"></param>
        void SwitchMusic(string key, AudioClip music, bool fading = true);

        /// <summary>
        /// Switch music
        /// 切换音乐
        /// Loading with adapter.
        /// 使用Adapter加载
        /// </summary>
        /// <param name="key"></param>
        /// <param name="bundle"></param>
        /// <param name="path"></param>
        /// <param name="fading"></param>
        void SwitchMusicByPath(string key, string bundle, string path, bool fading = true);

        /// <summary>
        /// Stop playing music
        /// 停止音乐
        /// </summary>
        /// <param name="fading"></param>
        void StopMusic(bool fading = false);

        /// <summary>
        /// Pause playing music
        /// 暂停音乐
        /// </summary>
        void PauseMusic();

        /// <summary>
        /// Gose on playing music.
        /// 继续音乐
        /// </summary>
        void GoseOnMusic();

        /// <summary>
        /// Update volume to current music.
        /// 更新音量到当前音乐
        /// </summary>
        void ApplyMusicVolume();

        /// <summary>
        /// Update mute settings to current music
        /// 更新静音设置到当前音乐
        /// </summary>
        void ApplyMusicMuted();

        // Sound related音效相关---------------------

        /// <summary>
        /// Set sound volume
        /// 设置音效音量
        /// </summary>
        /// <param name="volume"></param>
        /// <param name="refresh"></param>
        void SetSoundVolume(float volume, bool refresh = true);

        /// <summary>
        /// Set sound mute
        /// 设置音效静音
        /// </summary>
        /// <param name="muted"></param>
        /// <param name="refresh"></param>
        void SetSoundMuted(bool muted, bool refresh = true);

        /// <summary>
        /// Register sound info.
        /// 注册音效信息
        /// </summary>
        /// <param name="key"></param>
        /// <param name="bundleName"></param>
        /// <param name="path"></param>
        void RegisterSound(string key, string bundleName, string path);

        /// <summary>
        /// Clear sound register
        /// 清理音效注册表
        /// </summary>
        void ClearSoundRegister();

        /// <summary>
        /// Play sound
        /// 播放音效
        /// </summary>
        /// <param name="key"></param>
        void PlaySound(string key);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// </summary>
        /// <param name="key"></param>
        /// <param name="sound"></param>
        void PlaySound(string key, AudioClip sound);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// </summary>
        /// <param name="key"></param>
        /// <param name="sound"></param>
        /// <param name="attachObject"></param>
        void PlaySound(string key, AudioClip sound, Transform attachObject);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// </summary>
        /// <param name="key"></param>
        /// <param name="sound"></param>
        /// <param name="volumeScale"></param>
        void PlaySound(string key, AudioClip sound, float volumeScale);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// </summary>
        /// <param name="key"></param>
        /// <param name="sound"></param>
        /// <param name="ignorePause"></param>
        void PlaySound(string key, AudioClip sound, bool ignorePause);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// </summary>
        /// <param name="key"></param>
        /// <param name="sound"></param>
        /// <param name="attachObject"></param>
        /// <param name="volumeScale"></param>
        /// <param name="ignorePause"></param>
        void PlaySound(string key, AudioClip sound, Transform attachObject, float volumeScale, bool ignorePause);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// Loading with adapter
        /// 使用Adapter加载
        /// </summary>
        /// <param name="key"></param>
        /// <param name="bundle"></param>
        /// <param name="path"></param>
        void PlaySoundByPath(string key, string bundle, string path);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// Loading with adapter
        /// 使用Adapter加载
        /// </summary>
        /// <param name="key"></param>
        /// <param name="bundle"></param>
        /// <param name="path"></param>
        /// <param name="attachObject"></param>
        void PlaySoundByPath(string key, string bundle, string path, Transform attachObject);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// Playing with adapter
        /// 使用Adapter加载
        /// </summary>
        /// <param name="key"></param>
        /// <param name="bundle"></param>
        /// <param name="path"></param>
        /// <param name="volumeScale"></param>
        void PlaySoundByPath(string key, string bundle, string path, float volumeScale);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// Playing with adapter
        /// 使用Adapter加载
        /// </summary>
        /// <param name="key"></param>
        /// <param name="bundle"></param>
        /// <param name="path"></param>
        /// <param name="ignorePause"></param>
        void PlaySoundByPath(string key, string bundle, string path, bool ignorePause);

        /// <summary>
        /// Play sound
        /// 播放音效
        /// Playing with adapter
        /// 使用Adapter加载
        /// </summary>
        /// <param name="key"></param>
        /// <param name="bundle"></param>
        /// <param name="path"></param>
        /// <param name="attachObject"></param>
        /// <param name="volumeScale"></param>
        /// <param name="ignorePause"></param>
        void PlaySoundByPath(string key, string bundle, string path, Transform attachObject, float volumeScale, bool ignorePause);

        /// <summary>
        /// Stop playing sound.
        /// 停止音效
        /// Stop playing all sounds when key is null or empty.
        /// key=null时，停止全部
        /// </summary>
        /// <param name="key"></param>
        void StopSounds(string key = null);

        /// <summary>
        /// Pause sound
        /// 暂停音效
        /// Pause playing all sounds when key is null or empty.
        /// key=null时，暂停全部
        /// </summary>
        /// <param name="key"></param>
        void PauseSounds(string key = null);

        /// <summary>
        /// Gose on playing sound
        /// 继续音效
        /// Gose on playing all sounds when key is null or empty.
        /// key=null时，继续全部
        /// </summary>
        /// <param name="key"></param>
        void GoseOnSounds(string key = null);

        /// <summary>
        /// Update volume to current sound effect
        /// 更新音量到当前音效
        /// </summary>
        void ApplySoundVolume();

        /// <summary>
        /// Update mute settings to current sound effects
        /// 更新静音设置到当前音效
        /// </summary>
        void ApplySoundMuted();
    }
}