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

public class FollowingEnemy : Enemy
{
    public Transform target;
    public float chaseRadius;
    public float attackRadius;
    public Transform homePosition;

    public float roundingDistance;
    private Rigidbody2D myRigidbody;
    public Animator anim;
    public GameObject other;

    public bool inRange = false;
    public bool hit = false;
    public GameObject player;
    private bool firstAttack = false;

    private float timerDmg = 0f;
    private float waitTime = 1.0f;

    private float timerHit = 0f;
    private float hitWaitTime = 0.55f;

    public float thrust;
    public float knockTime;


    // Start is called before the first frame update
    void Start()
    {
        myRigidbody = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        target = GameObject.FindWithTag("Player").transform;
    }

    // Update is called once per frame
    void Update()
    {
        CheckDistance();
        //StartCoroutine(Timer());

        //Code below is for dealing damage to player

        if (inRange == true)
        {
            if (firstAttack == false)
            {
                if (timerDmg >= 0.15f)
                {
                    firstAttack = true;
                    other.GetComponent<Player>().TakeDamage(baseAttack);
                    timerDmg = 0f;
                }
            }
            if (timerDmg >= waitTime)
            {
                timerDmg = 0f;
                other.GetComponent<Player>().TakeDamage(baseAttack);
            }
            timerDmg += Time.deltaTime;
        }

        timerHit += Time.deltaTime;
        if(hit == true)
        {
            if(timerHit >= hitWaitTime)
            {
                TakeDamage(1.0f);
                hit = false;
                timerHit = 0f;
                TakeKnockback();
            }
        }
    }


    void CheckDistance()
    {
        if(Vector3.Distance(target.position, transform.position) <= chaseRadius && Vector3.Distance(target.position, transform.position) > attackRadius)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.position, moveSpeed * Time.deltaTime);
        }
    }


    void OnTriggerEnter2D(Collider2D collision)
    {
        ///For attacking player
        if (collision.tag == "PlayerHitbox")
        {
            inRange = true;
            firstAttack = false;
        }

        if (collision.tag == "AttackHitbox")
        {
            hit = true;
        }
    }

    void OnTriggerStay2D(Collider2D collision)
    {
        ///For attacking player
        if (collision.tag == "PlayerHitbox")
        {
            inRange = true;
        }
    }

    void OnTriggerExit2D(Collider2D collision)
    {
        ///For attacking player
        inRange = false;
        timerDmg = 0f;
        hit = false;
    }

    public void TakeDamage(float damage)
    {
        health = health - damage;
        if (health <= 0)
        {
            gameObject.SetActive(false);
        }
    }

    public void TakeKnockback()
    {
        Rigidbody2D enemy = gameObject.GetComponent<Rigidbody2D>();
        Rigidbody2D player = other.GetComponent<Rigidbody2D>();
        if (enemy != null)
        {
            enemy.isKinematic = false;
            Vector2 difference = enemy.transform.position - player.transform.position;
            difference = difference.normalized * thrust;
            enemy.AddForce(difference, ForceMode2D.Impulse);
            StartCoroutine(KnockCo(enemy));
        }
    }

    private IEnumerator KnockCo(Rigidbody2D enemy)
    {
        if (enemy != null)
        {
            yield return new WaitForSeconds(knockTime);
            enemy.velocity = Vector2.zero;
            enemy.isKinematic = true;
        }
    }
}