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

public class PlayerController : MonoBehaviour
{
    public float moveSpeed = 5f;  // 이동 속도
    public float dashDistance = 3f;  // 대시 거리
    public float dashCooldown = 1f;  // 대시 쿨타임
    public float maxSpeed = 8f;   // 최대 속도 (2~3초 후 최대 속도 도달)
    public float accelerationTime = 2f; // 2초 동안 가속
    public float dashTime = 0.5f;
    public float moveTime = 0f;  // 이동한 시간
    public enum PlayerState { Idle, Walking, Dash, Attack, Skill }
    public PlayerState playerState;
    private Vector2 moveDirection = Vector2.zero;  // 현재 이동 방향
    PlayerAttack playerAttack;
    Animator animator;

    public float idleState = 0f; // 0: 오른쪽, 0.333: 왼쪽, 0.666: 위, 1: 아래

    void Start()
    {
        animator = GetComponentInChildren<Animator>();
        playerAttack = GetComponent<PlayerAttack>();

        // 키 이벤트와 스프라이트 및 회전 처리 연결
        PlayManager.Instance.keySdown += () => SetMovement(Vector2.down, 1f / 3f);  // 아래
        PlayManager.Instance.keyWdown += () => SetMovement(Vector2.up, 2f / 3f);   // 위
        PlayManager.Instance.keyAdown += () => SetMovement(Vector2.left, 1f);  // 왼쪽
        PlayManager.Instance.keyDdown += () => SetMovement(Vector2.right, 1f); // 오른쪽

        // 대시 기능
        PlayManager.Instance.keySpace += Dash;
    }

    void Update()
    {
        HandleMovement(); // 이동 처리
    }

    // 이동 처리
    void HandleMovement()
    {
        if (playerState == PlayerState.Dash || playerState == PlayerState.Attack || playerState == PlayerState.Skill) return;
        moveDirection = Vector2.zero;  // 매 프레임 초기화

        if (Input.GetKey(KeyCode.A)) moveDirection += Vector2.left;
        if (Input.GetKey(KeyCode.D)) moveDirection += Vector2.right;
        if (Input.GetKey(KeyCode.W)) moveDirection += Vector2.up;
        if (Input.GetKey(KeyCode.S)) moveDirection += Vector2.down;

        // 이동 여부 판별
        if (moveDirection != Vector2.zero)
        {
            animator.SetBool("isWalking", true);

            playerState = PlayerState.Walking;
            moveTime += Time.deltaTime;
            // 2초 이상 이동하면 즉시 속도를 maxSpeed로 증가
            float currentSpeed = HandleAcceleration();

            transform.position += (Vector3)(moveDirection.normalized * currentSpeed * Time.deltaTime);
            // A 또는 D가 눌린 상태라면 Side 애니메이션을 우선 적용
            if (moveDirection.x != 0)
            {
                animator.SetFloat("PosX", 1);
                animator.SetFloat("PosY", 0);  
            }
            else
            {
                animator.SetFloat("PosX", 0);
                animator.SetFloat("PosY", moveDirection.y);
            }
            // 회전 처리
            if (Mathf.Abs(moveDirection.x) > 0)
            {
                PlayerRot(moveDirection);
            }
        }
        else
        {
            // 이동하지 않으면 Idle 상태를 설정
            moveTime = 0f;
            animator.SetBool("isWalking", false);
            animator.SetFloat("PosX", 0);
            animator.SetFloat("PosY", 0);
            animator.SetFloat("idleState", idleState);
        }
    }
    private void PlayerRot(Vector2 direction)
    {
        if (direction.x < 0 && transform.GetChild(0).localEulerAngles.y != 180)
        {
            transform.GetChild(0).localEulerAngles = new Vector3(0, 180, 0);
        }
        else if (direction.x > 0 && transform.GetChild(0).localEulerAngles.y != 0)
        {
            transform.GetChild(0).localEulerAngles = new Vector3(0, 0, 0);
        }
    }
    float HandleAcceleration()
    {
        if (playerState == PlayerState.Walking)
        {
            moveTime += Time.deltaTime;
            if (moveTime >= accelerationTime)
            {
                return maxSpeed; // 2초 이상 이동 시 가속
            }
        }
        return moveSpeed; // 기본 속도
    }
    // 대시 처리
    void Dash()
    {
        if (playerState != PlayerState.Dash)
        {
            playerState = PlayerState.Dash;
            animator.SetTrigger("DodgeTrigger");
            playerAttack.AttackInitialized();
            moveTime = 0f;
            StartCoroutine(DashCoroutine()); // 대시 시작
        }
    }

    IEnumerator DashCoroutine()
    {
        Vector3 startPosition = transform.position;
        Vector3 targetPosition = startPosition + (Vector3)(moveDirection.normalized * dashDistance);
        float elapsedTime = 0f;

        while (elapsedTime < dashTime)
        {
            transform.position = Vector3.Lerp(startPosition, targetPosition, elapsedTime / dashTime);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        transform.position = targetPosition;
        playerState = PlayerState.Idle;
    }
    // 이동 방향과 스프라이트, 회전 처리
    void SetMovement(Vector2 direction, float idleStateValue)
    {
        moveDirection = direction;
        idleState = idleStateValue;
    }

}