using UnityEngine;
using Cinemachine;
//using UnityEditor.Experimental.GraphView;
using System.Collections;
using System.Collections.Generic;


public class BirdController : MonoBehaviour {
    public float flySpeed = 10f;
    public float maxVerticalSpeed = 5f;
    public float maxRotationAngle = 1f;
    public float maxFreezRotationAngle = 30f;
    public float rotationSpeed = 5f;
    public float gravityScale = 1.6f;
    public float damping = 0.1f;
    public float dampingMin = 0.05f;
    public float dampingMax = 0.3f;

    private Rigidbody rb;
    //    private CinemachineVirtualCamera virtualCamera; // CinemachineVirtualCameraを使用する場合

    public GameObject GameOverUI;


    public GameObject CrawAttack;
    public AudioSource AudioSource;
    public AudioClip CrawAttackSE;
    public AudioClip GameOverSE;

    public Animator PlayerAnimator;
    bool isAttack;
    bool isDead;

    //バードストライク判定用
    public string TagName;


    void Awake() {
        rb = GetComponent<Rigidbody>();
        rb.useGravity = false;

        //virtualCamera = GetComponent<CinemachineVirtualCamera>(); // CinemachineVirtualCameraを取得する

        PlayerAnimator = GetComponentInChildren<Animator>();
        isAttack = false;
        isDead = false;
        GameOverUI.SetActive(false);

    }

    void FixedUpdate() {

        if(!isDead) {
            Forward();
            UpAndDown();
            Rotation();
            FreezRotation();

            // 速度減衰を追加する
            rb.velocity *= (1 - damping);

            // 鳥の向いている方向に速度を加える
            Vector3 forwardVelocity = transform.forward * flySpeed;
            rb.AddForce(forwardVelocity, ForceMode.VelocityChange);


            ActionCrawAttack();
        }

    }

    private void OnCollisionEnter(Collision collision) {

        if(!isDead) {

            if(collision.collider.CompareTag(TagName)) {
                Debug.Log("BSBSBS");
                isDead = true;
                PlayerAnimator.SetBool("Dead", isDead);
                AudioSource.PlayOneShot(GameOverSE);
                Invoke("AwakeGameOverUI", 2);

            }
        }
    }

    void AwakeGameOverUI() {

        GameOverUI.SetActive(true);

    }


    private void ActionCrawAttack() {



        if(Input.GetButton("Fire1")) {
            isAttack = true;
            CrawAttack.SetActive(true);
            AudioSource.PlayOneShot(CrawAttackSE);
            //押している最中は少し速度減衰緩和
            damping = damping - 0.0001f;
 
        } else {
            CrawAttack.SetActive(false);
            isAttack = false;
        }
        PlayerAnimator.SetBool("CrawAttack", isAttack);
    }

    private void UpAndDown() {
        // 上下方向の入力処理
        float verticalInput = Input.GetAxis("Vertical"); // コントローラの上下入力
        
        if(verticalInput <= -0.5f) {
                damping = damping -0.001f;
            }
        verticalInput += Input.GetKey(KeyCode.W) ? 1.0f : 0.0f; // Wキーが押されているかどうか
        verticalInput -= Input.GetKey(KeyCode.S) ? 1.0f : 0.0f; // Sキーが押されているかどうか
        rb.velocity = new Vector3(rb.velocity.x, Mathf.Clamp(rb.velocity.y + verticalInput, -maxVerticalSpeed, maxVerticalSpeed), rb.velocity.z);
        rb.AddForce(Vector3.down * gravityScale, ForceMode.Acceleration);
        //速度減衰値を上昇下降で加減算
        damping = damping + (float)(verticalInput * 0.001);
        if(damping < dampingMin) {
            damping = dampingMin;
        }
        if(damping > dampingMax) {
            damping = dampingMax;
        }
    }

    private void Forward() {
        // 鳥の向いている方向に速度を加える
        Vector3 forwardVelocity = transform.forward * flySpeed;
        rb.AddForce(forwardVelocity, ForceMode.VelocityChange);
    }

    private void FreezRotation() {
        if(Mathf.Abs(transform.eulerAngles.z) > maxFreezRotationAngle) {
            // 角度が一定以上の場合、角度を制限する
            Vector3 euler = transform.eulerAngles;
            euler.z = Mathf.Clamp(euler.z, -maxFreezRotationAngle, maxFreezRotationAngle);
            transform.eulerAngles = euler;
        }
        if(Mathf.Abs(transform.eulerAngles.x) > maxFreezRotationAngle) {
            // 角度が一定以上の場合、角度を制限する
            Vector3 euler = transform.eulerAngles;
            euler.x = Mathf.Clamp(euler.x, -maxFreezRotationAngle, maxFreezRotationAngle);
            transform.eulerAngles = euler;
        }
    }
    void Rotation()
{
    // Horizontal2（右スティック）の入力
    float rotationInput = Input.GetAxis("Horizontal2");

    // Horizontal（左スティック）の入力
    rotationInput += Input.GetAxis("Horizontal");

    // AキーとDキーの入力
    if (Input.GetKey(KeyCode.A))
    {
        rotationInput -= 1.0f;
    }
    if (Input.GetKey(KeyCode.D))
    {
        rotationInput += 1.0f;
    }

    float targetRotationAngle = maxRotationAngle * rotationInput;

    // 現在の回転をQuaternionに変換
    Quaternion currentRotation = transform.rotation;

    // Y軸周りに回転させるQuaternionを作成
    Quaternion deltaRotation = Quaternion.Euler(0, targetRotationAngle, 0);

    // 現在の回転にdeltaRotationを加えて新しい回転を得る
    Quaternion newRotation = currentRotation * deltaRotation;

    // 新しい回転を適用
    transform.rotation = newRotation;
}
/*

    void Rotation() {
        float rotationInput = Input.GetAxis("Horizontal2");
        float targetRotationAngle = maxRotationAngle * rotationInput;

        // 現在の回転をQuaternionに変換
        Quaternion currentRotation = transform.rotation;

        // Y軸周りに回転させるQuaternionを作成
        Quaternion deltaRotation = Quaternion.Euler(0, targetRotationAngle, 0);

        // 現在の回転にdeltaRotationを加えて新しい回転を得る
        Quaternion newRotation = currentRotation * deltaRotation;

        // 新しい回転を適用
        transform.rotation = newRotation;
    }
*/
}
