using System.Collections;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.SceneManagement;

public class GridMovement : MonoBehaviour
{
    private bool isMoving;
    private bool movementEnabled = true; 
    private Vector3 origPos, targetPos;
    private float timeToMove = 0.2f;

    [Header("SFX")]
    public AudioClip moveCrate;
    public AudioClip crateDestroy;
    [SerializeField] private AudioMixerGroup sfxMixerGroup;

    [SerializeField] private string wallTag = "Wall";
    [SerializeField] private string crateTag = "Crate";
    [SerializeField] private float collisionCheckDistance = 1f;

    [Header("Destroy Stuff")]
    public bool destroyed = false;
    public GameObject destroyedCrate;
    public GameObject crateDisplay;

    void Update()
    {
        if (destroyed == true)
        {
            StopMovement();
        }

        AudioSource audio = GetComponent<AudioSource>();
        if (!movementEnabled)
            return;

        if (Input.GetKey(KeyCode.W) && !isMoving)
            StartCoroutine(MovePlayer(Vector3.up));

        if (Input.GetKey(KeyCode.A) && !isMoving)
            StartCoroutine(MovePlayer(Vector3.left));

        if (Input.GetKey(KeyCode.S) && !isMoving)
            StartCoroutine(MovePlayer(Vector3.down));

        if (Input.GetKey(KeyCode.D) && !isMoving)
            StartCoroutine(MovePlayer(Vector3.right));
    }

    private IEnumerator MovePlayer(Vector3 direction)
    {
        if (CheckForCollision(direction))
        {
            yield break;
        }

        isMoving = true;

        AudioSource audio = GetComponent<AudioSource>();
        if (audio != null && moveCrate != null)
        {
            audio.outputAudioMixerGroup = sfxMixerGroup;
            audio.clip = moveCrate;
            audio.PlayOneShot(moveCrate);
        }

        float elapsedTime = 0;

        origPos = transform.position;
        targetPos = origPos + direction;

        while (elapsedTime < timeToMove)
        {
            transform.position = Vector3.Lerp(origPos, targetPos, (elapsedTime / timeToMove));
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        transform.position = targetPos;

        isMoving = false;
    }

    private bool CheckForCollision(Vector3 direction)
    {
        float raycastDistance = collisionCheckDistance + 0.1f;

        RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, direction, raycastDistance);

        foreach (RaycastHit2D hit in hits)
        {
            if (hit.collider.gameObject == this.gameObject)
                continue;

            if (hit.collider.CompareTag(wallTag))
            {
                return true;
            }

            if (hit.collider.CompareTag(crateTag))
            {
                return true;
            }
        }

        return false;
    }
    public void StopMovement()
    {
        movementEnabled = false;
        if (isMoving)
        {
            StopAllCoroutines();
            isMoving = false;
        }

        Debug.Log("Movement system stopped");
    }
    public void StartMovement()
    {
        movementEnabled = true;
        Debug.Log("Movement system started");
    }
    public void ToggleMovement()
    {
        movementEnabled = !movementEnabled;
        Debug.Log($"Movement system toggled: {(movementEnabled ? "ON" : "OFF")}");
    }
    public bool IsMovementEnabled()
    {
        return movementEnabled;
    }

    private void Start()
    {
        AudioSource audio = GetComponent<AudioSource>();
        if (audio == null)
        {
            audio = gameObject.AddComponent<AudioSource>();
        }

        if (sfxMixerGroup != null)
        {
            audio.outputAudioMixerGroup = sfxMixerGroup;
        }

        audio.playOnAwake = false;
        audio.spatialBlend = 0f;
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Bullet"))
        {
            Debug.Log("Collided with Bullet");
            if (crateDisplay.activeSelf)
            {
                AudioSource audio = GetComponent<AudioSource>();
                if (audio != null)
                {
                    audio.outputAudioMixerGroup = sfxMixerGroup;
                    audio.clip = crateDestroy;
                    audio.PlayOneShot(crateDestroy);
                    destroyedCrate.SetActive(true);
                    crateDisplay.SetActive(false);
                }
            }
            destroyed = true;
            StopMovement();
        }
    }
}