using System.Collections.Generic;
using System.Linq;
using Cinemachine;
using UnityEngine;

public class NewPlayerFocusCamera : MonoBehaviour
{
    [SerializeField] CinemachineVirtualCamera _focusCamera;

    Coroutine _routine;
    List<Battler> _battlersToShow = new();
    Battler _lastBattler;
    float _nextSwitchTime;

    void Awake() => Battler.AnyJoinedGame += FocusBattler;

    void OnValidate()
    {
        _focusCamera = GetComponent<CinemachineVirtualCamera>();
    }

    void FocusBattler(Battler battler)
    {
        _battlersToShow.Add(battler);
        Debug.Log($"Added {battler.name}");
    }

    void Update()
    {
        if (Time.time >= _nextSwitchTime)
            FocusNearestUnshownBattler();
    }

    void FocusNearestUnshownBattler()
    {
        Debug.Log("Started Routine");
        _focusCamera.Priority = 100;

        if (BattleManager.Instance.BattleState != BattleState.WaitingForPlayers ||
            _battlersToShow.Count == 0)
        {
            _focusCamera.Priority = 0;
            return;
        }

        if (_lastBattler == null)
            _lastBattler = _battlersToShow.FirstOrDefault();
        var battler = _battlersToShow
            .OrderBy(t => Vector3.Distance(t.transform.position, _lastBattler.transform.position))
            .FirstOrDefault();
        _battlersToShow.Remove(battler);

        _lastBattler = battler;

        BattleManager.Instance.SetText($"{battler.PlayerName}");
        Debug.Log($"Focused {battler.name}");
        _focusCamera.Follow = battler.transform;
        _focusCamera.LookAt = battler.transform;

        _nextSwitchTime = Time.time + 3f;
        if (_battlersToShow.Count == 0)
            _nextSwitchTime += 7f;
    }
}