using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Mole : MonoBehaviour
{
    public float visibleDuration = 1.0f;
    public float moveSpeed = 5f;
    private Vector3 hiddenPosition;
    private Vector3 visiblePosition;
    private bool isVisible = false;
    private bool isMoving = false;

    private GameManager gameManager;

    void Start()
    {
        hiddenPosition = transform.position;
        visiblePosition = hiddenPosition + Vector3.up * 1.0f;
        gameManager = FindObjectOfType<GameManager>();
        HideInstant(); // start hidden
    }

    public void Show()
    {
        if (!isMoving)
            StartCoroutine(MoveTo(visiblePosition, () =>
            {
                isVisible = true;
                Invoke(nameof(Hide), visibleDuration);
            }));
    }

    public void Hide()
    {
        if (!isMoving)
            StartCoroutine(MoveTo(hiddenPosition, () => isVisible = false));
    }
    private IEnumerator HitReaction()
    {
        Vector3 originalScale = transform.localScale;
        Vector3 squashed = new Vector3(1.2f, 0.6f, 1.2f);

        transform.localScale = squashed;
        yield return new WaitForSeconds(0.1f);

        transform.localScale = originalScale;
    }
    private IEnumerator MoveTo(Vector3 targetPos, System.Action onComplete)
    {
        isMoving = true;
        float t = 0;
        Vector3 startPos = transform.position;
        float duration = Vector3.Distance(startPos, targetPos) / moveSpeed;

        while (t < duration)
        {
            t += Time.deltaTime;
            float progress = Mathf.Clamp01(t / duration);
            float eased = EaseOutBounce(progress);
            transform.position = Vector3.Lerp(startPos, targetPos, eased);
            yield return null;
        }

        transform.position = targetPos;
        isMoving = false;
        onComplete?.Invoke();
    }

    private void HideInstant()
    {
        transform.position = hiddenPosition;
        isVisible = false;
    }

    private void OnMouseDown()
    {
        if (isVisible)
        {
            gameManager.AddScore(1);
            StartCoroutine(HitReaction());
            Hide();
        }
    }

    // Bounce easing function (EaseOutBounce)
    private float EaseOutBounce(float x)
    {
        const float n1 = 7.5625f;
        const float d1 = 2.75f;

        if (x < 1 / d1)
        {
            return n1 * x * x;
        }
        else if (x < 2 / d1)
        {
            x -= 1.5f / d1;
            return n1 * x * x + 0.75f;
        }
        else if (x < 2.5f / d1)
        {
            x -= 2.25f / d1;
            return n1 * x * x + 0.9375f;
        }
        else
        {
            x -= 2.625f / d1;
            return n1 * x * x + 0.984375f;
        }
    }
}
