using System.Collections.Generic;
using System.Threading.Tasks;
using ColdMint.scripts.character;
using ColdMint.scripts.utils;
using Godot;

namespace ColdMint.scripts.deathInfo;

public static class DeathInfoGenerator
{
    private static List<IDeathInfoHandler>? _deathInfoHandlers;

    /// <summary>
    /// <para>Register the death message handler</para>
    /// <para>注册死亡信息处理器</para>
    /// </summary>
    /// <param name="deathInfoHandler"></param>
    public static void RegisterDeathInfoHandler(IDeathInfoHandler deathInfoHandler)
    {
        _deathInfoHandlers ??= new List<IDeathInfoHandler>();
        _deathInfoHandlers.Add(deathInfoHandler);
    }

    /// <summary>
    /// <para>Unregister the death message handler</para>
    /// <para>取消注册死亡信息处理器</para>
    /// </summary>
    /// <param name="deathInfoHandler"></param>
    public static void UnregisterDeathInfoHandler(IDeathInfoHandler deathInfoHandler)
    {
        if (_deathInfoHandlers == null)
        {
            return;
        }

        _deathInfoHandlers.Remove(deathInfoHandler);
    }

    /// <summary>
    /// <para>Generate death info</para>
    /// <para>生成死亡信息</para>
    /// </summary>
    /// <param name="victim"></param>
    /// <param name="killer"></param>
    /// <returns></returns>
    public static async Task<string> GenerateDeathInfo(Player victim, Node killer)
    {
        var victimName = victim.ReadOnlyCharacterName ?? victim.Name;
        string killerName = killer.Name;
        if (killer is CharacterTemplate characterTemplate)
        {
            killerName = characterTemplate.ReadOnlyCharacterName ?? killer.Name;
        }
        if (_deathInfoHandlers == null || _deathInfoHandlers.Count == 0)
        {
            return GenerateDefaultDeathInfo(victimName, killerName) ?? string.Empty;
        }
        foreach (var deathInfoHandler in _deathInfoHandlers)
        {
            var deathInfo = await deathInfoHandler.GenerateDeathInfo(victimName, killerName, victim, killer);
            if (!string.IsNullOrEmpty(deathInfo))
            {
                return deathInfo;
            }
        }

        return GenerateDefaultDeathInfo(victimName, killerName) ?? string.Empty;
    }

    /// <summary>
    /// <para>Generate a default death message</para>
    /// <para>生成默认的死亡信息</para>
    /// </summary>
    /// <param name="victimName"></param>
    /// <param name="killerName"></param>
    /// <returns></returns>
    private static string? GenerateDefaultDeathInfo(string victimName, string killerName)
    {
        return TranslationServerUtils.TranslateWithFormat("death_info_default", victimName, killerName);
    }
}