using System.Collections;
using UnityEditor.Search;
using UnityEngine;
using UnityEngine.InputSystem;

public class Player_Controller : MonoBehaviour
{
    // Rigidbody
    [Header("Rigidbody")]
    [SerializeField]
    private Rigidbody2D RB;
    private float Original_Gravity;

    // 移动
    [Header("Movement")]
    [SerializeField]
    private float Player_Speed;
    private float PlayerCurrentPositionX;
    private float PlayerPreviousPositionX;
    private float horizontal;
    private bool Walking;

    // 地面检测
    [Header("Groundcheckpoint")]
    [SerializeField]
    private LayerMask GroundLayer;
    [SerializeField]
    private Transform GroundCheck;

    // 玩家碰撞盒
    [Header("Player_HitBox")]
    [SerializeField]
    private LayerMask Hit_Box_Layer;
    [SerializeField]
    private Transform Hit_Box_Transform;

    // 跳跃
    [Header("Jump")]
    [SerializeField]
    private float Air_Jump = 0;
    [SerializeField]
    private float Air_Jump_Remain;
    [SerializeField]
    private float Jump_Power;

    // 迅速移动
    [Header("Dash")]
    [SerializeField]
    private bool Can_Dash = true;
    [SerializeField]
    private bool Dashing = false;
    [SerializeField]
    private float Dash_Power = 10f;
    private float Dash_Time = 0.3f;
    private float Dash_Cooldown = 0.2f;

    // 健康和耐力
    [Header("Health and Stamina")]
    [SerializeField]
    private float Max_Health_Point = 7f;
    [SerializeField]
    private float Max_Stamina_Point = 30f;
    [SerializeField]
    private float Health_Point;
    [SerializeField]
    private float Stamina_Point;

    // 技能
    [Header("Skill")]
    [SerializeField]
    private float Skill_Animation_Cooldown = 0.1f;
    [SerializeField]
    private bool Can_Skill = true;

    // 点击技能
    [Header("Tap Skill")]
    [SerializeField]
    private Transform Tap_Skill_Spawn_Transform;

    // 闪电技能集
    [Header("Ligthning Skill Set")]
    [SerializeField]
    private GameObject Ligthning_Dash;
    [SerializeField]
    private Transform Lightning_Dash_Transform;

    // 火球技能集
    [Header("Fire Skill Set")]
    [SerializeField]
    private GameObject Fire_Ball;
    [SerializeField]
    private Transform Fire_Ball_Transform;
    [SerializeField]
    private Rigidbody2D Fire_Ball_RigidBody;
    private float Fire_Ball_Speed = 20f;

    // 水技能集
    [Header("Water Skill Set")]
    [SerializeField]
    private GameObject Water_healing;
    [SerializeField]
    private Transform Water_healing_Transform;

    // 风技能集
    [Header("Wind Skill Set")]
    [SerializeField]
    private GameObject Wind_Swirl;
    [SerializeField]
    private Transform Wind_Swirl_Transform;

    // 岩石技能集
    [Header("Rock Skill Set")]
    [SerializeField]
    private GameObject Rock_Pillar;
    [SerializeField]
    private Transform Rock_Pillar_Transform;
    [SerializeField]
    private GameObject Rock_Shard_Vertical;
    [SerializeField]
    private Transform Rock_Shard_Vertical_Transform;

    // void Start()
    void Start()
    {
        RB = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        Debug.Log(".Can_Skill" + Can_Skill);
        if (Hazard() == true)
        {
            transform.localPosition = new Vector2(0, 0);
        }
        if (IsGround() == true)
        {
            Air_Jump_Remain = Air_Jump;
        }
        PlayerPreviousPositionX = transform.localPosition.x;
        if (PlayerCurrentPositionX < PlayerPreviousPositionX)
        {
            transform.localScale = new Vector2(1, 1);
            Tap_Skill_Spawn_Transform.localRotation = Quaternion.Euler(0, 0, 0);
        }
        else if (PlayerCurrentPositionX > PlayerPreviousPositionX)
        {
            transform.localScale = new Vector2(-1, 1);
            Tap_Skill_Spawn_Transform.localRotation = Quaternion.Euler(0, 0, 180);
        }
        PlayerCurrentPositionX = transform.localPosition.x;
    }

    private void FixedUpdate()
    {
        if (Dashing == false)
        {
            RB.linearVelocity = new Vector2(horizontal * Player_Speed, RB.linearVelocity.y);
        }
        if (Dashing)
        {
            return;
        }
    }

    // 移动
    public void Move(InputAction.CallbackContext context)
    {
        horizontal = context.ReadValue<Vector2>().x;
    }

    public void Jump(InputAction.CallbackContext context)
    {
        if (context.performed && (Air_Jump_Remain >= 1 || IsGround() == true))
        {
            RB.linearVelocity = new Vector2(RB.linearVelocity.x, Jump_Power);
            Air_Jump_Remain -= 1;
        }
    }

    public void Dash(InputAction.CallbackContext context)
    {
        if (context.performed && Can_Dash == true)
        {
            StartCoroutine(Dash_Coroutine());
        }
    }

    private bool IsGround()
    {
        return Physics2D.OverlapBox(Hit_Box_Transform.position, new Vector2(0.6f, 0.8f), 0, GroundLayer);
    }

    private bool Hazard()
    {
        return Physics2D.OverlapBox(Hit_Box_Transform.position, new Vector2(0.6f, 0.8f), 0, Hit_Box_Layer);
    }

    IEnumerator Dash_Coroutine()
    {
        Can_Dash = false;
        Dashing = true;
        Walking = false;
        Original_Gravity = RB.gravityScale;
        RB.gravityScale = 0f;
        RB.linearVelocity = new Vector2(transform.localScale.x * Dash_Power, 0f);
        yield return new WaitForSeconds(Dash_Time);
        Dashing = false;
        RB.gravityScale = Original_Gravity;
        Walking = true;
        yield return new WaitForSeconds(Dash_Cooldown);
        Can_Dash = true;
    }

    // 玩家技能
    public void Dash_Skill(InputAction.CallbackContext context)
    {
        if (Can_Skill == true && Dashing == true)
        {
            Debug.Log("Dash_skill in");
            StopAllCoroutines();
            RB.gravityScale = 1;
            Can_Dash = true;
            StartCoroutine(Dash_Skill_Coroutine());
        }
    }

    public void Tap_Skill(InputAction.CallbackContext context)
    {
        if (Can_Skill == true && Dashing == false)
        {
            Debug.Log("Can_Skill in tap" + Can_Skill);
            Debug.Log("fire");
            StartCoroutine(Tap_Skill_Coroutine());
        }
    }

    public void Hold_Skill(InputAction.CallbackContext context)
    {
        if (Can_Skill == true)
        {
        }
    }

    public void Up_Skill(InputAction.CallbackContext context)
    {
        if (Can_Skill == true)
        {
        }
    }

    public void Down_Skill(InputAction.CallbackContext context)
    {
        if (Can_Skill == true)
        {
            StartCoroutine(Down_Skill_Coroutine());
        }
    }

    // 技能协程
    IEnumerator Dash_Skill_Coroutine()
    {
        Instantiate(Ligthning_Dash, transform.localPosition, Lightning_Dash_Transform.localRotation, Tap_Skill_Spawn_Transform);
        RB.linearVelocity = new Vector2(transform.localScale.x * Dash_Power * 2f, 0f);
        Dashing = false;
        Can_Skill = false;
        Walking = false;
        yield return new WaitForSeconds(Skill_Animation_Cooldown);
        Can_Skill = true;
        Walking = true;
    }

    IEnumerator Tap_Skill_Coroutine()
    {
        RB.gravityScale = 0f;
        Instantiate(Fire_Ball, transform.localPosition, Tap_Skill_Spawn_Transform.localRotation);
        Can_Skill = false;
        RB.gravityScale = 1f;
        yield return new WaitForSeconds(Skill_Animation_Cooldown);
        Can_Skill = true;
    }

    IEnumerator Down_Skill_Coroutine()
    {
        Instantiate(Rock_Shard_Vertical, transform.localPosition, Rock_Shard_Vertical_Transform.localRotation);
        yield return new WaitForSeconds(Skill_Animation_Cooldown);
    }
}