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 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()
    {
        int targetIndex = 0;
        if (path == null || path.Count == 0) 
        {
            yield break;
        }

        Vector3 currentWorldPosition;
        Node currentWaypoint = path[targetIndex];
        while (true)
        {
            currentWorldPosition = transform.position;
            if (transform.position == currentWaypoint.worldPosition)
            {
                targetIndex++;
                bool reachedPosition = targetIndex >= path.Count;
                if (reachedPosition)
                {
                    yield break;
                }
                currentWaypoint = path[targetIndex];
            }

            Vector3 current = transform.position;
            Vector3 target = currentWaypoint.worldPosition;
            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);
        }
    }
}