using System;
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.AI;

public class SideLine : MonoBehaviour
{
    [SerializeField] PlayerManager _playerManager;
    
    [SerializeField] Transform _leftSideParent;
    [SerializeField] Transform _rightSideParent;
    [SerializeField] Transform _offStageParent;

    List<Transform> _leftSide;
    List<Transform> _rightSide;
    List<Transform> _offStage;

    Queue<Transform> _sideLineQueue;
    Dictionary<string, Transform> _assignedCharacterModels = new();
    IEnumerable<string> _playersQueue;

    public static List<Battler> ActiveBattlers = new List<Battler>();
    [SerializeField] bool _useNavigation = true;

    void OnValidate() => _playerManager = FindObjectOfType<PlayerManager>();

    void Awake()
    {
        _leftSide = _leftSideParent.GetComponentsInChildren<Transform>().Where(t=> t != _leftSideParent).ToList();
        _rightSide = _rightSideParent.GetComponentsInChildren<Transform>().Where(t=> t != _rightSideParent).ToList();
        _offStage = _offStageParent.GetComponentsInChildren<Transform>().Where(t=> t != _offStageParent).ToList();
    }

    public void Bind(IEnumerable<string> playersQueue)
    {
        _playersQueue = playersQueue;
    }

    public void UpdateSideline()
    {
        ActiveBattlers.Clear();
        
        int i = 0;
        bool left = true;

        if (_playersQueue == null)
	        return;

        int offStageIndex = 0;
        
        foreach (var player in _playersQueue)
        {
            Transform characterPosition;
            if (i >= _leftSide.Count || i >= _rightSide.Count)
            {
                var offstagePoint = offStageIndex < _offStage.Count ? _offStage[offStageIndex] : _offStage.FirstOrDefault();
                characterPosition = offstagePoint;
                offStageIndex++;
            }
            else
                characterPosition = left ? _leftSide[i] : _rightSide[i];

            var battler = _playerManager.Get(player);
            battler.UpdatePlayerSpecies();
            if (_useNavigation)
                battler.SetDestination(characterPosition);
            else
                battler.transform.SetPositionAndRotation(characterPosition.position, characterPosition.rotation);
            
            ActiveBattlers.Add(battler);
            Debug.Log($"Moved {player} to {characterPosition}");
            
            if (!left)
                i++;
            left = !left;
        }
    }
}