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

public class PlayerMovement : MonoBehaviour
{
    private Color[] colours = { Color.red, Color.yellow, Color.green, Color.cyan, Color.blue};

    public Vector3 Movimiento;
    public float speed = 3f;
    public float speedExtra = 1f;
    public int vidas = 3; // Número de vidas del jugador
    public float invulnerableTime = 1f; // Duración de la intangibilidad
    public float starEffectTime = 5f; // Duración del efecto estrella

    public int scoreCoin = 10;
    public int scoreStar = 50;
    public int damageMul = 1;

    public Score score;

    private VidasMan vidasManager;
    private bool isInvulnerable = false; // Estado de intangibilidad
    private SpriteRenderer spriteRenderer; // Para cambiar la visibilidad del jugador
    private Color originalColor; // Para guardar el color original del jugador


    public GameObject eventSystem;
    public GameObject GameOverPanel; // Reference to the pause menu panel
    public Button pauseButton;

    void Start()
    {
        score = FindObjectOfType<Score>();
        vidasManager = FindObjectOfType<VidasMan>();
        spriteRenderer = GetComponent<SpriteRenderer>();
        originalColor = spriteRenderer.color; // Guardar el color original del jugador
        UpdatePlayerAttributes(); // Configura el tamaño y la velocidad inicial
        spriteRenderer.enabled = true; // Asegurar visibilidad
        isInvulnerable = false; // Desactivar intangibilidad
        speed = 3f;
        speedExtra = 1f;
        // Reactivar colisiones con los pinchos
        Physics2D.IgnoreLayerCollision(gameObject.layer, LayerMask.NameToLayer("Pinchos"), false);
        pauseButton.gameObject.SetActive(true);
        Time.timeScale = 1f; // Stops the game time (pauses the game)
        GameOverPanel.SetActive(false); // Show the pause menu
        eventSystem.SetActive(true);
    }

    void Update()
    {
        // Leer la entrada del jugador (horizontal y vertical)
        Movimiento = new Vector3(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"), 0);
        Movimiento = Movimiento.normalized;

        // Movimiento del jugador dentro de los límites horizontales
        if (!(transform.position.x <= -3.6 || transform.position.x >= 3.5f) || Movimiento.x * transform.position.x <= 0)
        {
            transform.position += new Vector3(Movimiento.x, 0, 0) * speed * Time.deltaTime;
        }

        // Movimiento del jugador dentro de los límites verticales
        if (!(transform.position.y <= -4 || transform.position.y >= 0) || Movimiento.y * transform.position.y <= 0)
        {
            transform.position += new Vector3(0, Movimiento.y, 0) * speed * Time.deltaTime;
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Pincho" && !isInvulnerable) // Colisión con un pincho
        {
            if (damageMul == 1)
            {
                vidas--; // Reducir una vida
                vidasManager.PerderVida(); // Actualizar las imágenes de las vidas
                UpdatePlayerAttributes(); // Ajustar velocidad y tamaño

                if (vidas <= 0)
                {
                    PauseMenu controller = eventSystem.GetComponent<PauseMenu>();
                    controller.muerto();
                    Time.timeScale = 0f; // Stops the game time (pauses the game)
                    GameOverPanel.SetActive(true); // Show the pause menu
                    pauseButton.gameObject.SetActive(false);
                }
                Destroy(collision.gameObject); // Eliminar el pincho

                // Activar el estado de invulnerabilidad
                StartCoroutine(InvulnerableState());
            }
        }
        else if (collision.gameObject.tag == "Wand") // Colisión con un wand
        {
            vidas++; // Incrementar una vida
            vidasManager.AgregarVida(); // Actualizar las imágenes de las vidas
            UpdatePlayerAttributes(); // Ajustar velocidad y tamaño

            Destroy(collision.gameObject); // Eliminar el wand
        }
        else if (collision.gameObject.tag == "Coin") // Colisión con una moneda
        {
            score.sumar(scoreCoin);
            Destroy(collision.gameObject); // Eliminar la moneda
        }
        else if (collision.gameObject.tag == "Star") // Colisión con una estrella
        {
            score.sumar(scoreStar);
            Destroy(collision.gameObject); // Eliminar la estrella
            StartCoroutine(StarEffect());
        }
    }

    private IEnumerator InvulnerableState()
    {
        isInvulnerable = true; // Activar intangibilidad
       

        spriteRenderer.color = Color.magenta; 
        // Desactivar colisiones con los pinchos
        Physics2D.IgnoreLayerCollision(gameObject.layer, LayerMask.NameToLayer("Pinchos"), true);

        // Efecto visual de parpadeo
        float elapsedTime = 0f;
        while (elapsedTime < invulnerableTime)
        {
            spriteRenderer.enabled = !spriteRenderer.enabled; // Alternar visibilidad
            elapsedTime += 0.2f;
            yield return new WaitForSeconds(0.2f);
        }

        spriteRenderer.enabled = true; // Asegurar visibilidad
        spriteRenderer.color = originalColor; // Restaurar el color original
        isInvulnerable = false; // Desactivar intangibilidad

        // Reactivar colisiones con los pinchos
        Physics2D.IgnoreLayerCollision(gameObject.layer, LayerMask.NameToLayer("Pinchos"), false);
    }

    private IEnumerator StarEffect()
    {
        isInvulnerable = true; // Activar intangibilidad
        int index = 0;

        damageMul = 0;

        // Efecto visual de parpadeo durante el efecto estrella
        float elapsedTime = 0f;
        while (elapsedTime < starEffectTime)
        {
            spriteRenderer.color = colours[(index++) % colours.Length];
            elapsedTime += 0.2f;
            yield return new WaitForSeconds(0.2f);
        }

        // Restaurar el estado normal
        spriteRenderer.enabled = true;
        spriteRenderer.color = originalColor; // Restaurar el color original
        isInvulnerable = false;

        damageMul = 1;
    }

    private void UpdatePlayerAttributes()
    {
        // Calcular la velocidad proporcional a las vidas
        updateSpeedPlayer();

        // Calcular el tamaño proporcional a las vidas
        transform.localScale = new Vector3(6f - (3 - vidas), 6f - (3 - vidas), 1f);
    }

    public void UpdateSpeed(float inc)
    {
        speedExtra += inc;
        updateSpeedPlayer();
    }

    public void updateSpeedPlayer()
    {
        speed = ((4 - vidas) * 2f) + speedExtra;
    }
}
