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

public class AStarPathfindingAgent : MonoBehaviour
{
    public float speed = 0.5f;
    private NodeMap Map;
    private Pathfinding Pathfinder;
    public Node currentPosition;
    public bool isChasing;
    private Animator myAnim;
    
    public List<Node> path;
    // Start is called before the first frame update

    private void Awake()
    {
        Map = FindObjectOfType<NodeMap>();
        Pathfinder = FindObjectOfType<Pathfinding>();
        
    }

    void Start()
    {
        currentPosition = Map.NodeFromWorldPoint(new Vector2(transform.position.x, transform.position.y));
        //Debug.Log("current world position:" + currentPosition.worldPosition + " current transform position:" + transform.position);
        Map.TeleportTo(this.gameObject, currentPosition);
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void FindPath()
    {
        Pathfinder.FindPath(transform.position,Pathfinder.Player.position, this);
        
    }
    
    public IEnumerator FollowPath()
    {
        myAnim = GetComponent<Animator>();
        myAnim.SetBool("isChasing", true);
        myAnim.SetBool("left", false);
        int targetIndex = 0;
        if (path == null || path.Count == 0)
        {
            isChasing = false;
            myAnim.SetBool("isChasing", false);
            yield break;
        }

        Vector3 currentWorldPosition;
        Node currentWaypoint = path[targetIndex];
        while (true)
        {
            currentWorldPosition = transform.position;
            //if (transform.position == currentWaypoint.worldPosition) 
            if (Vector3.Distance(transform.position, currentWaypoint.worldPosition)<0.01f)
            {
                targetIndex++;
                bool reachedPosition = targetIndex >= path.Count;
                if (reachedPosition)
                {
                    myAnim.SetBool("isChasing", false);
                    yield break;
                }
                currentWaypoint = path[targetIndex];
            }

            Vector3 current = transform.position;
            Vector3 target = currentWaypoint.worldPosition;
            if (Pathfinder.Player.position.x < current.x)
            {
                myAnim.SetBool("Left", true);
            }
            if (Pathfinder.Player.position.x >= current.x)
            {
                myAnim.SetBool("Left", false);
            }
            transform.position = Vector3.MoveTowards(current, target, speed * Time.deltaTime);
            yield return null;
        }
    }
    
    public void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawCube(currentPosition.worldPosition, Vector3.one);
        
        Gizmos.color = Color.black;
        if (path == null) return;
        foreach (var n in path)
        {
            Gizmos.DrawCube(n.worldPosition, Vector3.one);
        }
    }
}