using UnityEngine;

public class NPCManager : MonoBehaviour
{
    [SerializeField] private NPCData[] _npcDataList;
    [SerializeField] private Transform _spawnParent;
    [SerializeField] private SpeechBubbleManager _speechBubbleManager;
    [SerializeField] private Pathfinder _pathfinder;

    void Start()
    {
        SpawnAll();
    }

    public void SpawnAll()
    {
        foreach (var data in _npcDataList)
            SpawnNPC(data);
    }

    public void DespawnAll()
    {
        for (int i = _spawnParent.childCount - 1; i >= 0; i--)
            Destroy(_spawnParent.GetChild(i).gameObject);
    }

    public void Respawn()
    {
        DespawnAll();
        SpawnAll();
    }

    void SpawnNPC(NPCData data)
    {
        if (data.Prefab == null) return;

        // Spawn on walkable tile (expand range if needed)
        var spawnTile = _pathfinder.GetRandomWalkableTile(10);
        if (!_pathfinder.IsWalkable(spawnTile))
            spawnTile = _pathfinder.GetRandomWalkableTile(0);
        if (!_pathfinder.IsWalkable(spawnTile)) return;

        var spawnPos = _pathfinder.TileToWorld(spawnTile);
        spawnPos.z = 0f;

        var character = new GameObject(data.NPCName);
        character.transform.SetParent(_spawnParent);
        character.transform.position = spawnPos;

        var visual = Instantiate(data.Prefab, character.transform);
        visual.name = "Visual";
        visual.transform.localPosition = Vector3.zero;
        visual.transform.localScale = Vector3.one;

        // Rigidbody2D (for movement, no collision)
        var rb = character.AddComponent<Rigidbody2D>();
        rb.bodyType = RigidbodyType2D.Dynamic;
        rb.gravityScale = 0f;
        rb.constraints = RigidbodyConstraints2D.FreezeRotation;

        // Add components
        character.AddComponent<MoveController>();
        character.AddComponent<FlipController>();
        character.AddComponent<AnimationController>();
        character.AddComponent<NPCMovement>();
        character.AddComponent<NPCTalkSystem>();
        var npc = character.AddComponent<NPC>();

        npc.Initialize(data, _speechBubbleManager, _pathfinder);
    }
}
