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


public class GameManager : MonoBehaviour
{
    private int lives = 3;
    private int currentScore = 0;

    [SerializeField] private GameObject playerPrefab;

    [SerializeField] private Transform playerParentTransform;

    private PlayerController currentPlayer;

    [SerializeField] private float delayToSpawnPlayer = 1f;

    [SerializeField] private CameraController myCamera;

    [SerializeField] private TextMeshProUGUI scoreText;
    [SerializeField] private TextMeshProUGUI livesText;

    [SerializeField] private GameObject gameOverPanel;
    [SerializeField] private GameObject winnerPanel;
    [SerializeField] private GameObject readyPanel;

    private int enemiesThisLevel = 0;

    // Start is called before the first frame update
    void Start()
    {
        UpdateScore(0);
        UpdateLivesText();
        SpawnPlayer();
        readyPanel.SetActive(true);

        enemiesThisLevel = GetEnemyCount();


    }

    public void PlayerDefeated()
    {
        readyPanel.SetActive(false);

        if(lives > 1)
        {
            Debug.Log("Game Manager Recorded a Defeated Player.");
            lives--;

        Invoke("SpawnPlayer", currentPlayer.GetDestroyDelayTime() + delayToSpawnPlayer);
        
        }
        else
        {
            GameOver();
        }
        
    }

    private void SpawnPlayer()
    {
        readyPanel.SetActive(true);
        GameObject player =Instantiate(playerPrefab, new Vector3(0,0,0), Quaternion.identity, playerParentTransform);
        currentPlayer = player.GetComponent<PlayerController>();
        myCamera.SetPlayer(player);
        UpdateLivesText();

    }

    public void UpdateScore(int scoreToAdd)
    {
        currentScore += scoreToAdd;
        scoreText.text = "Score: " + currentScore.ToString("D4");
    }

    private void UpdateLivesText()
    {
        livesText.text = "Lives: " + lives.ToString("D2");
    }

    private void GameOver()
    {
        gameOverPanel.SetActive(true);
        StartCoroutine(Restart());
    }

    IEnumerator Restart()
    {
        yield return new WaitForSeconds(1f);
        SceneManager.LoadScene(0);
    }

    private int GetEnemyCount()
    {
        int count = GameObject.FindGameObjectsWithTag("Enemy").Length;
        return count;
    }

    public void EnemyIsDefeated()
    {
        enemiesThisLevel--;
        if(enemiesThisLevel <= 0)
        {
            winnerPanel.SetActive(true);
            StartCoroutine(Restart());
        }

    }

}
