using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class NewMainMenu_Slots : MonoBehaviour
{
    [Serializable]
    public class SlotSymbol
    {
        public Sprite sprite;

        public float odds;

        public float triplepayout;

        public AudioClip selectsound;

        public AudioClip triplesound;
    }

    [Header("-= Slot Settings =-")]
    public RectTransform[] columns;

    public int visibleRows = 3;

    public float spinDuration = 2f;

    public float spinSpeed = 500f;

    public float alignLerpSpeed = 5f;

    [SerializeField]
    private TextMeshProUGUI TextMoney;

    [SerializeField]
    private TextMeshProUGUI ControlsText;

    [Header("-= Slot Sound =-")]
    [SerializeField]
    private AudioClip SFX_SlotClick;

    [SerializeField]
    private AudioClip SFX_SpendMoney;

    [SerializeField]
    private AudioClip Mus_Gambling;

    [SerializeField]
    private AudioClip mus_woody;

    [Header("-= Symbols =-")]
    public List<SlotSymbol> slotSymbols = new List<SlotSymbol>();

    public List<Image[]> columnImages = new List<Image[]>();

    private float slotHeight;

    private int symbolsPerColumn;

    private bool currentlySpinning;

    [SerializeField]
    private GameObject ConsoleMenu;

    public List<Image> WinnerColumns = new List<Image>();

    private bool AllTextShown;

    private bool wasEnabled;

    public List<TextMeshProUGUI> BackgroundTextLines = new List<TextMeshProUGUI>();

    [SerializeField]
    private List<int> BackgroundTextMaxCount = new List<int>();

    [Header("-= Woody =-")]
    [SerializeField]
    private bool WoodyActive;

    [SerializeField]
    private GameObject WoodyGiygas;

    [SerializeField]
    private Image WoodyFade;

    [SerializeField]
    private Material WoodyMaterial;

    private int spinCounter;

    private void Start()
    {
        symbolsPerColumn = visibleRows + 2;
        slotHeight = columns[0].rect.height / (float)visibleRows;
        slotSymbols[5].odds = PlayerPrefs.GetInt("Gambling_WoodyChance", 100);
        RectTransform[] array = columns;
        foreach (RectTransform rectTransform in array)
        {
            Image[] array2 = new Image[symbolsPerColumn];
            for (int j = 0; j < symbolsPerColumn; j++)
            {
                GameObject gameObject = new GameObject($"Slot_{j}", typeof(Image));
                gameObject.transform.SetParent(rectTransform, worldPositionStays: false);
                array2[j] = gameObject.GetComponent<Image>();
                array2[j].rectTransform.sizeDelta = new Vector2(rectTransform.rect.width - 20f, slotHeight);
                float num = slotHeight * (float)(symbolsPerColumn - visibleRows) / 2f;
                array2[j].rectTransform.anchoredPosition = new Vector2(0f, num - (float)j * slotHeight);
                if (j == 1)
                {
                    WinnerColumns.Add(array2[j]);
                }
            }
            columnImages.Add(array2);
        }
        foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines)
        {
            BackgroundTextMaxCount.Add(backgroundTextLine.text.Length);
            backgroundTextLine.maxVisibleCharacters = 0;
        }
        ResetColumns();
    }

    private void OnDisable()
    {
        wasEnabled = false;
        AllTextShown = false;
        foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines)
        {
            backgroundTextLine.maxVisibleCharacters = 0;
        }
        currentlySpinning = false;
        StopCoroutine("SpinRoutine");
    }

    private void Update()
    {
        if (Input.GetKeyDown(PlayerInput.Instance.Key_Confirm) && !currentlySpinning && !WoodyActive)
        {
            if (SecurePlayerPrefs.GetSecureInt("TotalCash") >= 10)
            {
                Spin();
                NewMainMenuManager.instance.MenuSource.PlayOneShot(SFX_SpendMoney);
                SecurePlayerPrefs.SetSecureInt("TotalCash", SecurePlayerPrefs.GetSecureInt("TotalCash") - 10);
                TextMoney.text = string.Format("{0}$", SecurePlayerPrefs.GetSecureInt("TotalCash"));
            }
            else
            {
                NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuDeny);
            }
        }
        if (Input.GetKeyDown(PlayerInput.Instance.Key_Cancel) && !currentlySpinning && !WoodyActive)
        {
            NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuDeny);
            ConsoleMenu.SetActive(value: true);
            base.gameObject.SetActive(value: false);
            MusicManager.StopSong(Fade: false, 0f);
            CameraManager.instance.ReverbFilter.reverbPreset = AudioReverbPreset.Generic;
        }
        if (!wasEnabled && base.gameObject.activeSelf)
        {
            wasEnabled = true;
            TextMoney.text = string.Format("{0}$", SecurePlayerPrefs.GetSecureInt("TotalCash"));
            StartCoroutine(ShowBackgroundText());
            CameraManager.instance.ReverbFilter.reverbPreset = AudioReverbPreset.Off;
            MusicManager.PlaySong(Mus_Gambling, FadePreviousSong: false, 0f);
            ControlsText.text = $"{PlayerInput.Instance.Key_Confirm} to Spin\n{PlayerInput.Instance.Key_Cancel} to Return";
        }
    }

    public void ResetColumns()
    {
        foreach (Image[] columnImage in columnImages)
        {
            for (int i = 0; i < columnImage.Length; i++)
            {
                columnImage[i].sprite = GetRandomSymbol(columnImage[i]);
                columnImage[i].rectTransform.anchoredPosition = new Vector2(0f, slotHeight * (float)(symbolsPerColumn - visibleRows) / 2f - (float)i * slotHeight);
            }
        }
    }

    public void Spin()
    {
        currentlySpinning = true;
        spinCounter++;
        if (spinCounter % 3 == 0)
        {
            ResetColumns();
        }
        StartCoroutine(SpinRoutine());
        DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.CheekyGrin);
    }

    private IEnumerator SpinRoutine()
    {
        float elapsedTime = 0f;
        while (elapsedTime < spinDuration)
        {
            float num = Mathf.Clamp01(elapsedTime / (spinDuration / 4f));
            foreach (Image[] columnImage in columnImages)
            {
                for (int i = 0; i < columnImage.Length; i++)
                {
                    RectTransform rectTransform = columnImage[i].rectTransform;
                    rectTransform.anchoredPosition += new Vector2(0f, (0f - spinSpeed) * num * Time.deltaTime);
                    if (rectTransform.anchoredPosition.y <= (0f - slotHeight) * (float)(symbolsPerColumn - 1))
                    {
                        rectTransform.anchoredPosition += new Vector2(0f, slotHeight * (float)symbolsPerColumn + slotHeight);
                        columnImage[i].sprite = GetRandomSymbol(columnImage[i], enableForgiveness: true);
                        CutsceneUtils.PlaySound(SFX_SlotClick, CutsceneUtils.DRH_MixerChannels.Effect, 0.5f, UnityEngine.Random.Range(0.9f, 1.1f));
                    }
                }
            }
            elapsedTime += Time.deltaTime;
            yield return null;
        }
        if (PlayerPrefs.GetInt("Gambling_WoodyChance", 100) > 0)
        {
            PlayerPrefs.SetInt("Gambling_WoodyChance", PlayerPrefs.GetInt("Gambling_WoodyChance", 100) + 25);
            slotSymbols[5].odds = PlayerPrefs.GetInt("Gambling_WoodyChance", 100);
        }
        AlignColumns();
    }

    private Sprite GetRandomSymbol(Image img, bool enableForgiveness = false)
    {
        float num = 0f;
        foreach (SlotSymbol slotSymbol in slotSymbols)
        {
            num += slotSymbol.odds;
        }
        float num2 = UnityEngine.Random.Range(0f, num);
        float num3 = 0f;
        if (enableForgiveness && (double)UnityEngine.Random.value < 0.3 && img == WinnerColumns[2] && WinnerColumns[0].sprite == WinnerColumns[1].sprite)
        {
            return WinnerColumns[0].sprite;
        }
        foreach (SlotSymbol slotSymbol2 in slotSymbols)
        {
            num3 += slotSymbol2.odds;
            if (num2 <= num3)
            {
                return slotSymbol2.sprite;
            }
        }
        return slotSymbols[0].sprite;
    }

    private void AlignColumns()
    {
        StartCoroutine(AlignRoutine());
    }

    private IEnumerator AlignRoutine()
    {
        bool aligning = true;
        while (aligning)
        {
            aligning = false;
            for (int columnIndex = 0; columnIndex < columnImages.Count; columnIndex++)
            {
                Image[] array = columnImages[columnIndex];
                for (int i = 0; i < array.Length; i++)
                {
                    RectTransform rectTransform = array[i].rectTransform;
                    float num = Mathf.Round(rectTransform.anchoredPosition.y / slotHeight) * slotHeight;
                    float y = Mathf.Lerp(rectTransform.anchoredPosition.y, num, Time.deltaTime * alignLerpSpeed);
                    rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x, y);
                    if (Mathf.Abs(rectTransform.anchoredPosition.y - num) > 0.1f)
                    {
                        aligning = true;
                    }
                }
                yield return null;
            }
        }
        bool playWinSound = false;
        AudioClip winSound = null;
        for (int columnIndex = 0; columnIndex < columnImages.Count; columnIndex++)
        {
            Image[] array2 = columnImages[columnIndex];
            int num2 = visibleRows / 2;
            Image image = array2[num2];
            SlotSymbol symbolFromImage = GetSymbolFromImage(image.sprite);
            if (symbolFromImage != null)
            {
                MonoBehaviour.print($"Column {columnIndex + 1}: {symbolFromImage.sprite.name}");
                CutsceneUtils.PlaySound(symbolFromImage.selectsound, CutsceneUtils.DRH_MixerChannels.Effect, 0.8f);
                if (columnImages[0][visibleRows / 2].sprite == columnImages[1][visibleRows / 2].sprite && columnImages[1][visibleRows / 2].sprite == columnImages[2][visibleRows / 2].sprite)
                {
                    Sprite sprite = columnImages[0][visibleRows / 2].sprite;
                    SlotSymbol symbolFromImage2 = GetSymbolFromImage(sprite);
                    if (symbolFromImage2 != null)
                    {
                        playWinSound = true;
                        winSound = symbolFromImage2.triplesound;
                        float triplepayout = symbolFromImage2.triplepayout;
                        SecurePlayerPrefs.SetSecureInt("TotalCash", SecurePlayerPrefs.GetSecureInt("TotalCash") + Mathf.RoundToInt(triplepayout), disableTotalCashDisplay: true);
                        TextMoney.text = string.Format("{0}$", SecurePlayerPrefs.GetSecureInt("TotalCash"));
                        DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.Shock_NoSound);
                        MonoBehaviour.print($"Payout awarded: {triplepayout}$");
                        if (symbolFromImage2 == slotSymbols[5])
                        {
                            StartCoroutine(WoodyScene());
                            PlayerPrefs.SetInt("Gambling_WoodyChance", 0);
                            slotSymbols[5].odds = 0f;
                            NewMainMenu_Trophys.instance.UpdateTrophys();
                            PlayerPrefs.SetInt("Trophy_Woody", 1);
                        }
                    }
                }
                else
                {
                    DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.Annoyed);
                }
            }
            yield return new WaitForSeconds(0.2f);
        }
        if (playWinSound && winSound != null)
        {
            MusicManager.PauseMusic();
            CutsceneUtils.PlaySound(winSound);
            yield return new WaitForSeconds(winSound.length);
            DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.Crying);
            MusicManager.ResumeMusic();
        }
        currentlySpinning = false;
    }

    private IEnumerator ShowBackgroundText()
    {
        if (!SettingsManager.Instance.GetBoolSettingValue("SimpleVFX"))
        {
            List<TextMeshProUGUI> finishedTexts = new List<TextMeshProUGUI>();
            while (!AllTextShown)
            {
                yield return null;
                foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines)
                {
                    if (!finishedTexts.Contains(backgroundTextLine) && backgroundTextLine.maxVisibleCharacters >= backgroundTextLine.text.Length)
                    {
                        finishedTexts.Add(backgroundTextLine);
                    }
                    else if (backgroundTextLine.maxVisibleCharacters < backgroundTextLine.text.Length)
                    {
                        float num = 100 + UnityEngine.Random.Range(-60, -10);
                        backgroundTextLine.maxVisibleCharacters += Mathf.CeilToInt(num * Time.deltaTime);
                        backgroundTextLine.maxVisibleCharacters = Mathf.Clamp(backgroundTextLine.maxVisibleCharacters, 0, backgroundTextLine.text.Length);
                        NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuClick);
                    }
                }
                if (CompareTextLists(finishedTexts, BackgroundTextLines))
                {
                    AllTextShown = true;
                    MonoBehaviour.print("all text shown");
                }
            }
            yield break;
        }
        foreach (TextMeshProUGUI backgroundTextLine2 in BackgroundTextLines)
        {
            backgroundTextLine2.maxVisibleCharacters = backgroundTextLine2.text.Length;
        }
    }

    private bool CompareTextLists(List<TextMeshProUGUI> list1, List<TextMeshProUGUI> list2)
    {
        if (list1.Count != list2.Count)
        {
            return false;
        }
        for (int i = 0; i < list1.Count; i++)
        {
            if (list1[i].text != list2[i].text)
            {
                return false;
            }
        }
        return true;
    }

    private SlotSymbol GetSymbolFromImage(Sprite sprite)
    {
        foreach (SlotSymbol slotSymbol in slotSymbols)
        {
            if (slotSymbol.sprite == sprite)
            {
                return slotSymbol;
            }
        }
        return null;
    }

    private IEnumerator WoodyScene()
    {
        WoodyActive = true;
        WoodyFade.enabled = true;
        WoodyGiygas.SetActive(value: true);
        MusicManager.PlaySong(mus_woody, FadePreviousSong: false, 0f);
        float duration = 90f;
        float elapsedTime = 0f;
        Color fadeColor = WoodyFade.color;
        while (elapsedTime < duration)
        {
            fadeColor.a = Mathf.Lerp(1f, 0f, elapsedTime / duration);
            WoodyFade.color = fadeColor;
            float num = ((!(elapsedTime <= 53f)) ? 8.5f : 1.25f);
            float num2 = Mathf.PerlinNoise(Time.time * 0.5f, 0f) * num;
            float num3 = Mathf.PerlinNoise(0f, Time.time * 0.5f) * num;
            WoodyMaterial.SetFloat("_TimeScalingX", 32f + elapsedTime * 2f + num2);
            WoodyMaterial.SetFloat("_TimeScalingY", 32f + elapsedTime * 2f + num3);
            elapsedTime += Time.deltaTime;
            yield return null;
        }
        ResetColumns();
        WoodyMaterial.SetFloat("_TimeScalingX", 32f);
        WoodyMaterial.SetFloat("_TimeScalingY", 32f);
        fadeColor.a = 0f;
        WoodyFade.color = fadeColor;
        yield return new WaitForSeconds(2f);
        WoodyGiygas.SetActive(value: false);
        WoodyFade.enabled = false;
        WoodyActive = false;
        MusicManager.PlaySong(Mus_Gambling, FadePreviousSong: false, 0f);
    }
}