using Entitas;
using System.Collections.Generic;
using UnityEngine;
using Game;
/// 
/// 主角的技能锁定系统
/// 
public class ComboLockSystem : IExecuteSystem, IInitializeSystem
{
    private IGroup _entities;
    private List _tempList = new List();
    public void Initialize()
    {
        _entities = Util.GetGroup(GameMatcher.Hp);
    }
    public void Execute()
    {
        var entity = Util.GetMaster();
        if (Util.IsPause(entity))
        {
            return;
        }
        UpdateLock(entity);         //更新锁定
    }
    public void UpdateLock(GameEntity entity)
    {
        var combo = entity.combo;
        var hasTarget = combo.TargetLock > 0;
        var lockPress = combo.KeyPressSet.Contains(EFunctionKey.Lock);
        //更新锁定时间
        _tempList.Clear();
        _tempList.AddRange(combo.TargetLastLockTime.Keys);
        foreach (var item in _tempList)
        {
            combo.TargetLastLockTime[item] += Time.deltaTime;
            if (combo.TargetLastLockTime[item] >= GameConst.LockCacheTime)
            {
                combo.TargetLastLockTime.Remove(item);
            }
        }
        //无变化的状态
        if (hasTarget == lockPress)
        {
            if (combo.TargetLock == -1)
            {
                combo.TargetLock = 0;
            }
            return;
        }
        if (hasTarget)
        {
            //取消锁定
            combo.TargetLastLockTime[combo.TargetLock] = 0;
            combo.TargetLock = 0;
        }
        else
        {
            //锁定
            if (combo.TargetLock == -1)
            {
                return;
            }
            //查找锁定对象 现阶段方案只找最近的
            var newTarget = FindTarget(entity);
            //如果没找到 清空锁定时间 再找一次
            if (newTarget == -1 && combo.TargetLastLockTime.Count > 0)
            {
                combo.TargetLastLockTime.Clear();
            }
            newTarget = FindTarget(entity);
            combo.TargetLock = newTarget;
        }
        var target = Util.GetEntity(combo.TargetLock);
        Util.SetSubTarget(target == null ? null : target.view.GameObject.transform);
    }
    private int FindTarget(GameEntity entity)
    {
        var combo = entity.combo;
        var newTarget = -1;
        var distanceMin = float.MaxValue;
        foreach (var target in _entities)
        {
            if (target.Team() != ETeam.Monster)
            {
                continue;
            }
            var entityID = target.ID();
            if (combo.TargetLastLockTime.ContainsKey(entityID))
            {
                continue;
            }
            var distance = Vector3.Distance(entity.Pos(), target.Pos());
            if (distance > GameConst.LockRange)
            {
                continue;
            }
            if (distance < distanceMin)
            {
                newTarget = entityID;
                distanceMin = distance;
            }
        }
        return newTarget;
    }
}