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

public class PlayerBehavior : MonoBehaviour
{

    [Header("Physics:")]
    private float _hInput;
    private Rigidbody2D _rb;
    private int forward = 1;
    public PlayerInput playerInput;

    [Header("Tambourine:")]
    [SerializeField] private Launch launcher;
    [HideInInspector] public bool hasTambourine = true;
    GameObject tambourine;

    [Header("Grappling:")]
    [SerializeField] public Tutorial_GrapplingGun grapplingGun;
    [SerializeField] public Tutorial_GrapplingRope grapplingRope;
    private GameObject grappleSurface;

    [Header("Controllers:")]
    [SerializeField] private PlayerMovement playerController;
    [SerializeField] private StateController stateController;

    Animator animator;


    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
        stateController = GameObject.Find("StateController").GetComponent<StateController>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {

        // throw tambourine
        // if (Input.GetKeyDown(KeyCode.K)) {
        if (playerInput.actions["ThrowTambourine"].WasPressedThisFrame())
        {
            ThrowTambourine();
        }

        // grapple
        tambourine = GameObject.FindGameObjectWithTag("tambourine");
        // if (Input.GetKeyDown(KeyCode.L)) {
        if (playerInput.actions["Grapple"].WasPressedThisFrame())
        {
            AttemptGrapple();
        }
        // if (Input.GetKeyUp(KeyCode.L)) {
        if (playerInput.actions["Grapple"].WasReleasedThisFrame())
        {
            LetGoOfGrapple();
        }

        Animate();
    }

    void Animate() {
        // start walking
        if (playerInput.actions["Move"].WasPressedThisFrame()) {
            animator.SetBool("Walking", true);
        }
        // return to idle animation
        if (playerInput.actions["Move"].WasReleasedThisFrame()) {
            animator.SetBool("Walking", false);
        }
    }

    void OnMove(InputValue value)
    {
        _hInput = value.Get<Vector2>().x;
        if (_hInput < 0)
        {
            // if (forward != -1) { // if character hasnt already flipped 
            //     FlipScale();
            // }
            forward = -1;
        }
        else if (_hInput > 0)
        {
            // if (forward != 1) { // if character hasnt already flipped 
            //     FlipScale();
            // }
            forward = 1;
        }

    }

    void FlipScale() { // DOENST WORK RIGHT
        Vector3 currentScale = this.gameObject.transform.localScale;
        currentScale.x *= -1;
        this.gameObject.transform.localScale = currentScale;
    }

    void ThrowTambourine() {
        if (hasTambourine && !grapplingRope.isGrappling)
            {
                launcher.ThrowTambourine(forward);
                hasTambourine = false;
            }
    }

    void AttemptGrapple() {
        if (tambourine != null)
        { // grapple to tambourine
            if (!grapplingRope.isGrappling && tambourine.GetComponent<TambourineBehavior>().pinned)
            {
                grapplingGun.GrappleToTambourine(tambourine);
                grapplingRope.isGrappling = true;
            }
        }
        else
        {
            if (grappleSurface != null)
            {
                grapplingGun.GrappleToSurface(grappleSurface.transform.position);
                grapplingRope.isGrappling = true;
            }
        }
    }

    void LetGoOfGrapple() {
        if (tambourine != null && grapplingRope.isGrappling)
            {
                tambourine.GetComponent<TambourineBehavior>().DestroySelf();
            }
            grapplingGun.ReleaseGrapple();
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.tag == "grappleSurface")
        {
            grappleSurface = col.gameObject;
        }
        else if (col.tag == "instaDeath")
        {
            this.stateController.SetDeathCanvasActive(true);
            Destroy(this.gameObject);
        }
    }

    void OnTriggerExit2D(Collider2D col)
    {
        if (col.tag == "grappleSurface")
        {
            grappleSurface = null;
        }
    }
}
