using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class SettingUIPopup : MonoBehaviour
{
    //오디오 설정
    [Header("Audio Settings")]
    public AudioMixer mixer; // 믹서는 한개만 쓴다
    public Slider masterSlider, bgmSlider, sfxSlider;
    public SwapButton masterMute, bgmMute, sfxMute;
    private float _defaultVolumeSlider = 0.2f;

    private void Start()
    {
        //오디오
        ResetMasterVolume();
        ResetBGMVolume();
        ResetSFXVolume();
    }

    #region 오디오
    private void ResetMasterVolume()
    {
        float masterSliderValue = _defaultVolumeSlider;
        if (PlayerPrefs.HasKey("volumeMaster"))
        {
            masterSliderValue = PlayerPrefs.GetFloat("volumeMaster");
        }
        masterSlider.value = masterSliderValue;
        mixer.SetFloat("volumeMaster", CalculateVolume(masterSliderValue));
    }

    private void ResetBGMVolume()
    {
        float bgmSliderValue = _defaultVolumeSlider;
        if (PlayerPrefs.HasKey("volumeBGM"))
        {
            bgmSliderValue = PlayerPrefs.GetFloat("volumeBGM");
        }
        bgmSlider.value = bgmSliderValue;
        mixer.SetFloat("volumeBGM", CalculateVolume(bgmSliderValue));
    }

    private void ResetSFXVolume()
    {
        float sfxSliderValue = _defaultVolumeSlider;
        if (PlayerPrefs.HasKey("volumeSFX"))
        {
            sfxSliderValue = PlayerPrefs.GetFloat("volumeSFX");
        }
        sfxSlider.value = sfxSliderValue;
        mixer.SetFloat("volumeSFX", CalculateVolume(sfxSliderValue));
    }

    float CalculateVolume(float _sliderValue)
    {
        var slider = Mathf.Clamp(_sliderValue, 0.0001f, 1f); // 아래에서 로그변환할때 0이 들어가면 안됨
        float dB = Mathf.Log10(slider) * 20f; //데시벨 변환식
        return Mathf.Clamp(dB, -80f, 0f); //-80dB에서 0dB까지 조절할수있게 _sliderValue 최대값이 1이므로 dB는 계산상 0보다 크게 나올수 없음 (0db이 기준)
    }

    public void SliderVolumeMaster(float value) // 마스터 볼륨 슬라이더에 연결할 메서드
    {
        if (value > 0)
            masterMute.TrueA_FalseB = true; //슬라이더를 움직였으니 뮤트가 풀리도록
        else if (value <= 0)
            masterMute.TrueA_FalseB = false; //0이면 음소거

        var volume = CalculateVolume(value); //볼륨 계산
        mixer.SetFloat("volumeMaster", volume); //볼륨 적용

        PlayerPrefs.SetFloat("volumeMaster", value);//슬라이더 값 저장
    }
    public void SliderVolumeBGM(float value) // BGM 볼륨 슬라이더에 연결할 메서드
    {
        if (value > 0)
            bgmMute.TrueA_FalseB = true; //슬라이더를 움직였으니 뮤트가 풀리도록
        else if (value <= 0)
            bgmMute.TrueA_FalseB = false; //0이면 음소거

        var volume = CalculateVolume(value); //볼륨 계산
        mixer.SetFloat("volumeBGM", volume);
        PlayerPrefs.SetFloat("volumeBGM", value);//슬라이더 값 저장
    }
    public void SliderVolumeSFX(float value) // SFX 볼륨 슬라이더에 연결할 메서드
    {
        if (value > 0)
            sfxMute.TrueA_FalseB = true; //슬라이더를 움직였으니 뮤트가 풀리도록
        else if (value <= 0)
            sfxMute.TrueA_FalseB = false; //0이면 음소거

        var volume = CalculateVolume(value); //볼륨 계산
        mixer.SetFloat("volumeSFX", volume);
        PlayerPrefs.SetFloat("volumeSFX", value);//슬라이더 값 저장
    }

    public void MuteMaster(bool isMute)
    {
        if (isMute)
        {
            mixer.SetFloat("volumeMaster", CalculateVolume(0));
            //masterSlider.value = 0;
            masterSlider.SetValueWithoutNotify(0);
        }
        else
        {
            ResetMasterVolume();
        }
    }
    public void MuteBGM(bool isMute)
    {
        if (isMute)
        {
            mixer.SetFloat("volumeBGM", CalculateVolume(0));
            //bgmSlider.value = 0;
            bgmSlider.SetValueWithoutNotify(0);
        }
        else
        {
            ResetBGMVolume();
        }
    }
    public void MuteSFX(bool isMute)
    {
        if (isMute)
        {
            mixer.SetFloat("volumeSFX", CalculateVolume(0));
            //sfxSlider.value = 0;
            sfxSlider.SetValueWithoutNotify(0);
        }
        else
        {
            ResetSFXVolume();
        }
    }
    #endregion
}
