using System.Configuration;
using System.Security.Cryptography;
using System.Threading;
using UnityEngine;

public class FollowPlayer : MonoBehaviour
{
    private Vector2 playerPos;
    private Vector2 leftplayerPos;

    private Vector2 newPos;
    private Vector2 RandomRange;
    private float RandomX;

    private float RRayDist;
    private float LRayDist;

    public float Xpos;
    public float Ypos;

    public Vector2 WallCheck;

    private int leftLayer;
    private int rightLayer;

    public Health healthScript;
    private Vector3 playerposition;
    public GameObject player;

    private float hitCheck;

    public int health;
    public int numOfHearts;
    public bool GetHit;

    public GameObject enemy;

    public float PunchForce;

    private ParticleSystem part;
    public List<ParticleCollisionEvent> collisionEvents;

    Rigidbody2D rb;

    void Start()
    {
        InvokeRepeating("PlayerSearch", 1f, 1f);
        InvokeRepeating("DamagePlayer", 1.5f, 1.5f);

        RandomRange = new Vector2(Mathf.Clamp(Xpos + Random.Range(-30f, 30f), 18.67f, 91f), Ypos);

        rb = GetComponent<Rigidbody2D>();
    }

    void PlayerSearch ()
    {
        RaycastHit2D leftSearch = Physics2D.Raycast(this.gameObject.transform.position, Vector2.left);
        RaycastHit2D rightSearch = Physics2D.Raycast(this.gameObject.transform.position, Vector2.right);
        RRayDist = rightSearch.distance;
        LRayDist = leftSearch.distance;

        rightLayer = rightSearch.transform.gameObject.layer;
        leftLayer = leftSearch.transform.gameObject.layer;

        playerPos = new Vector2(rightSearch.point.x, this.gameObject.transform.position.y);
        leftplayerPos = new Vector2(leftSearch.point.x, this.gameObject.transform.position.y);
    }

    void RandomMovement()
    {
        if(transform.position.x > RandomRange.x)
        {
            transform.rotation = Quaternion.Euler(transform.rotation.x, 0, transform.rotation.z);
        } else
        {
            transform.rotation = Quaternion.Euler(transform.rotation.x, 180, transform.rotation.z);
        }

        transform.position = Vector2.MoveTowards(this.gameObject.transform.position, RandomRange, 6f * Time.deltaTime);

        if (new Vector2(transform.position.x, transform.position.y) == RandomRange)
        {
            RandomX = Mathf.Clamp(Xpos - Random.Range(-30f, 30f), 18.67f, 91f);

            RandomRange = new Vector2(RandomX, Ypos);
        }
    }

    void Update()
    {
        playerposition = GameObject.FindGameObjectWithTag("Player").transform.position;




        if (rightLayer == LayerMask.NameToLayer("Player"))
        {
            if (RRayDist <= 10f)
            {
                newPos = Vector2.MoveTowards(this.gameObject.transform.position, playerPos, 6f * Time.deltaTime);

                transform.position = newPos;

                transform.rotation = Quaternion.Euler(transform.rotation.x, 180, transform.rotation.z);
            } else
            {
                RandomMovement();
            }
        }
        else if (leftLayer == LayerMask.NameToLayer("Player"))
        {
            if (LRayDist <= 10f)
            {
                newPos = Vector2.MoveTowards(this.gameObject.transform.position, leftplayerPos, 6f * Time.deltaTime);

                transform.position = newPos;

                transform.rotation = Quaternion.Euler(transform.rotation.x, 0, transform.rotation.z);
            } else
            {
                RandomMovement();
            }
        }
        else if (leftLayer != LayerMask.NameToLayer("Player") && rightLayer != LayerMask.NameToLayer("Player"))
        {
            RandomMovement();
        }

        if (health > numOfHearts)
        {
            health = numOfHearts;
        }

        if(health <= 0)
        {
            Destroy(this.gameObject);
            // Add force Animation
            // Add Death Animation
        }
    }

    void DamagePlayer()
    {
        hitCheck = Mathf.Abs(playerposition.x - transform.position.x);
        if (hitCheck < 0.9f)
        {
            healthScript.Damage();
        }
    }

    public void DamageEnemy()
    {
        health -= 1;
        if(player.transform.rotation.eulerAngles.y != 180f)
        {
            rb.AddForce(new Vector2(5, 4), ForceMode2D.Impulse);
            
        }
        else if (player.transform.rotation.eulerAngles.y == 180f)
        {
            rb.AddForce(new Vector2(-5, 4), ForceMode2D.Impulse);

        }

        
    
    }

    public void DamageEnemySecondary()
    {
        health -= 1;
        if (player.transform.rotation.eulerAngles.y != 180f)
        {
            rb.AddForce(new Vector2(10, 4), ForceMode2D.Impulse);

        }
        else if (player.transform.rotation.eulerAngles.y == 180f)
        {
            rb.AddForce(new Vector2(-10, 4), ForceMode2D.Impulse);

        }



    }

    private void OnParticleCollision(GameObject enemy)
    {
        health -= 1;
    }
}