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

public class GameManager : MonoBehaviour
{
    public static GameManager instance;
    public Text scoreText;
    public Text coinScoreText;
    public Text highScoreText;
    public float worldScrollingSpeed = 0.2f;
    public bool inGame;
    public GameObject resetButton;
    public Immortality immortality;
    public Magnet magnet;

    private float score;
    private int coins;
    private int highScoreValue;


    void Start()
    {
        if (instance == null) { instance = this; }

        InitializeGame();
    }

    void InitializeGame()
    {
        inGame = true;
        immortality.isActive = false;
        magnet.isActive = false;

        if (PlayerPrefs.HasKey("Coins"))
        {
            coins = PlayerPrefs.GetInt("Coins");
        }
        else
        {
            coins = 0;
            PlayerPrefs.SetInt("Coins", 0);
        }

        if (PlayerPrefs.HasKey("HighScoreValue"))
        {
            highScoreValue = PlayerPrefs.GetInt("HighScoreValue");
        }
        else
        {
            highScoreValue = 0;
            PlayerPrefs.SetInt("HighScoreValue", 0);
        }

        UpdateOnScreenScore();
    }

    public void GameOver()
    {
        inGame = false;
        resetButton.SetActive(true);

        if ((int)score > highScoreValue)
        {
            highScoreValue = (int)score;
            PlayerPrefs.SetInt("HighScoreValue", highScoreValue);
            UpdateOnScreenScore();
        }
    }

    void FixedUpdate()
    {
        if (!GameManager.instance.inGame) return;

        score += worldScrollingSpeed;
        UpdateOnScreenScore();
    }
    void UpdateOnScreenScore()
    {
        scoreText.text = score.ToString("0");
        coinScoreText.text = coins.ToString();
        highScoreText.text =  $"BEST: {highScoreValue}";
    }

    public void RestartGame()
    {
        SceneManager.LoadScene(0);
    }

    public void CoinCollected(int value = 1)
    {
        coins += value;
        PlayerPrefs.SetInt("Coins", coins);
        UpdateOnScreenScore();
    }

    public void ImmortalityCollected()
    {
        if (immortality.isActive)
        {
            CancelInvoke("CancelImmortality");
            CancelImmortality();
        }
        immortality.isActive = true;
        worldScrollingSpeed += immortality.GetSpeedBoost();
        Invoke("CancelImmortality", immortality.GetDuration());
    }

    private void CancelImmortality()
    {
        worldScrollingSpeed -= immortality.GetSpeedBoost();
        immortality.isActive = false;
    }

    public void MagnetCollected()
    {
        if (magnet.isActive)
            CancelInvoke("CancelMagnet");
        magnet.isActive = true;
        Invoke("CancelMagnet", magnet.GetDuration());
    }
    private void CancelMagnet()
    {
        magnet.isActive = false;
    }
}