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

public class BattlerTargetCamera : MonoBehaviour
{
    [SerializeField] CinemachineTargetGroup _cinemachineTargetGroup;

    List<Battler> _targets;
    float[] _desiredWeights;
    float[] _desiredRadiuses;
    [SerializeField] float _weightTransitionSpeed = 1f;

    void Awake()
    {
        _targets = new List<Battler>();
        _desiredWeights = new float[_cinemachineTargetGroup.m_Targets.Length];
        _desiredRadiuses = new float[_cinemachineTargetGroup.m_Targets.Length];
        Battler.AnyJoinedBattle += AddBattler;
        Battler.AnyLeftBattle += RemoveBattler;
    }

    void RemoveBattler(Battler battler)
    {
        _targets.Remove(battler);
        for (int i = 0; i < _cinemachineTargetGroup.m_Targets.Length; i++)
        {
            if (_cinemachineTargetGroup.m_Targets[i].target == battler.Head)
            {
                _desiredWeights[i] = 0f;
                _desiredRadiuses[i] = Mathf.Clamp(_cinemachineTargetGroup.m_Targets.Length / (float) _targets.Count, 2f,
                    10f);
            }
        }
    }

    void Update()
    {
        for (int i = 0; i < _targets.Count; i++)
        {
            if (_targets[i] == null || _targets[i].gameObject.activeSelf == false)
                _desiredWeights[i] = 0;
        }
        
        for (int i = 0; i < _cinemachineTargetGroup.m_Targets.Length; i++)
        {
            _cinemachineTargetGroup.m_Targets[i].weight = Mathf.Lerp(_cinemachineTargetGroup.m_Targets[i].weight,
                _desiredWeights[i], Time.deltaTime * _weightTransitionSpeed);
            
            _cinemachineTargetGroup.m_Targets[i].radius = Mathf.Lerp(_cinemachineTargetGroup.m_Targets[i].radius,
                _desiredRadiuses[i], Time.deltaTime * _weightTransitionSpeed);
        }
    }

    void AddBattler(Battler battler)
    {
        _targets.Add(battler);
        if (_targets.Count > _cinemachineTargetGroup.m_Targets.Length)
        {
            _targets.RemoveAt(0);
        }

        for (var i = 0; i < _targets.Count; i++)
        {
            _cinemachineTargetGroup.m_Targets[i].target = _targets[i]?.Head == null ? null : _targets[i].Head;
            _desiredWeights[i] = 1f;
            _desiredRadiuses[i] = Mathf.Clamp( _cinemachineTargetGroup.m_Targets.Length / (float)_targets.Count, 1f, 10f);
        }
    }

}