using Games.GlobeDefine;
using Games.LogicObj;
using Games.Scene;
using GCGame.Table;
using Module.Log;
using UnityEngine;
// 融合效果的控制器 - 切换场景需要删除。逻辑也独立于其他模块,因此单独开EffectController
public class FusionEffectController : MonoBehaviour
{
    private const string _handleHeader = "FusionModel_";
    private const int _defaultAnimId = 0;
    private FusionEffectData _data;
    private int _serverId0;
    private int _serverId1;
    private float _startTime;
    
    private void Start()
    {
        _serverId0 = Animator.StringToHash(_handleHeader + _data.modelId0 + "_" + Time.realtimeSinceStartup + "_0");
        _serverId1 = Animator.StringToHash(_handleHeader + _data.modelId1 + "_" + Time.realtimeSinceStartup + "_1");
        _startTime = Time.unscaledTime;
        var animData0 = GetAnimationData(_data.animId0);
        var animData1 = GetAnimationData(_data.animId1);
        CreateCloneObj(_serverId0, _data.modelId0, animData0.AnimName.ToLower(), _data.endPos);
        CreateCloneObj(_serverId1, _data.modelId1, animData1.AnimName.ToLower(), _data.endPos);
    }

    private Tab_Animation GetAnimationData(int index)
    {
        var result = TableManager.GetAnimationByID(index, 0);
        if (result == null)
        {
            LogModule.ErrorLog(string.Format("无法获得id = {0}的动画!", index));
            result = TableManager.GetAnimationByID(_defaultAnimId, 0);
        }

        return result;
    }
    
    private void Update()
    {
        if (Time.unscaledTime > _startTime + _data.duration)
        {
            Destroy(gameObject);
            if (IndependentEffectManager.Instance != null)
            {
                IndependentEffectManager.Instance.RemoveCharacterClone(_serverId0);
                IndependentEffectManager.Instance.RemoveCharacterClone(_serverId1);
            }
        }
    }

    private Obj_CharacterClone CreateCloneObj(int serverId, int modelId, string animName, Vector2 startPos)
    {
        var result = IndependentEffectManager.Instance.ShowCharacterClone(serverId, startPos, Quaternion.identity,
            CreateInitData(modelId, startPos, animName)).cloneObj;
        result.ObjTransform.localRotation = _data.rotation;
        return result;
    }
    
    private static Obj_Character_Clone_Init_Data CreateInitData(int modelId, Vector2 position, string animName)
    {
        var initData = new Obj_Character_Clone_Init_Data
        {
            m_nProfession = GlobeVar.INVALID_ID,
            m_ModelVisualID = modelId,
            m_WeaponDataID = GlobeVar.INVALID_ID,
            m_fX = position.x,
            m_fZ = position.y,
            animData = new CharacterCloneAnimData
            {
                animName = animName
            }
        };
        return initData;
    }
    
    public static void CreateFusionEffect(FusionEffectData data)
    {
        var gameObject = new GameObject("FusionEffectController");
        var component = gameObject.AddComponent<FusionEffectController>();
        component._data = data;
    }
}

public class FusionEffectData
{
    public int modelId0;
    public int modelId1;
    public int animId0;
    public int animId1;
    public Vector2 endPos;
    public Quaternion rotation;
    public float duration;
}