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

public class MainMenuManager : MonoBehaviour
{
    [SerializeField] private TMP_Text title;

    [SerializeField] private List<TMP_Text> textList = new();

    [SerializeField] private float dilateSpeed = 0.1f;

    [SerializeField] private Animator cover;

    private readonly string component = "_FaceDilate";
    private float dilate = -1;
    private readonly List<float> dilates = new();
    private float initDilate;
    private readonly List<float> initDilates = new();
    private bool transitioning;

    [SerializeField] private Animator cameraAnimator;
    [SerializeField] private MainMenuSettingsManager settingsManager;
    [SerializeField] private Canvas creditsCanvas;
     
    private bool isAnimating = false;
    private bool isDown = false;

    private static MainMenuManager instance;
    public static MainMenuManager Instance { get { return instance; } }

    private void Awake()
    {
        instance = this;
    }

    // Start is called before the first frame update
    private void Start()
    {
        
        //initDilate = title.fontSharedMaterials[0].GetFloat(component);
        initDilate = title.fontMaterials[0].GetFloat(component);


        foreach (var text in textList)
        {
            initDilates.Add(text.fontMaterials[0].GetFloat(component));
            dilates.Add(-1f);
        }

        textList[0].GetComponent<Button>().onClick.AddListener(LoadFirstLevel);
        textList[1].GetComponent<Button>().onClick.AddListener(LoadSettings);
        textList[2].GetComponent<Button>().onClick.AddListener(ExitApp);
        textList[3].GetComponent<Button>().onClick.AddListener(LoadCredits);
        

        Cursor.visible = true;
        Cursor.lockState = CursorLockMode.Confined;

        this.creditsCanvas.gameObject.SetActive(false);
        this.settingsManager.gameObject.SetActive(false);
    }


    // Update is called once per frame
    private void Update()
    {
        //dilate = Mathf.Min(initDilate, dilate += Time.deltaTime);
        dilate = Mathf.Lerp(dilate, initDilate, Time.deltaTime * dilateSpeed);
        title.fontMaterials[0].SetFloat(component, dilate);
        for (var i = 0; i < textList.Count; i++)
        {
            dilates[i] = Mathf.Lerp(dilates[i], initDilates[i], Time.deltaTime * dilateSpeed);
            textList[i].fontMaterials[0].SetFloat(component, dilates[i]);
        }
    }

    private void LoadFirstLevel()
    {
        if (SteamManager.Initialized)
        {
            Steamworks.SteamUserStats.GetAchievement("ENTER_THE_STATION", out bool achievementCompleted);
            if (!achievementCompleted)
            {
                SteamUserStats.SetAchievement("ENTER_THE_STATION");
                SteamUserStats.StoreStats();
                SteamAPI.RunCallbacks();
            }
        }


        if (!transitioning)
        {
            cover.Play("Cover_load_out");
            transitioning = true;
            StartCoroutine(_LoadFirstLevel());
        }
    }

    private IEnumerator _LoadFirstLevel()
    {
        yield return new WaitForSeconds(4);
        SceneManager.LoadScene(1);
    }

    private void ExitApp()
    {
        Application.Quit();
    }
    private void LoadSettings()
    {
        ToggleCamera();
        this.creditsCanvas.gameObject.SetActive(false);
        this.settingsManager.gameObject.SetActive(true);
    }
    private void LoadCredits()
    {
        ToggleCamera();
        this.creditsCanvas.gameObject.SetActive(true);
        this.settingsManager.gameObject.SetActive(false);
    }

    public void ToggleCamera()
    {
        
        if(!isAnimating)
            StartCoroutine(_ToggleCamera());
    }
    private IEnumerator _ToggleCamera()
    {
        cameraAnimator.Play(isDown?"CameraUp":"CameraDown");
        isAnimating = true;
        yield return new WaitForSeconds(1.5f);
        isAnimating = false;
        isDown = !isDown;
    }
}