// WingsEmu
// 
// Developed by NosWings Team

using WingsEmu.Game.Extensions;
using WingsEmu.Packets.Enums.Chat;

namespace WingsEmu.Game.Entities.Extensions;

public static class VisualEntitiesExtensions
{
    public static string GenerateIn(this IMonsterEntity monsterEntity, bool inEffect = false)
    {
        if (monsterEntity.IsStillAlive)
        {
            return
                $"in 3 {monsterEntity.MonsterVNum} {monsterEntity.Id} {monsterEntity.PositionX} {monsterEntity.PositionY} {monsterEntity.Direction} {monsterEntity.GetHpPercentage()} {monsterEntity.GetMpPercentage()} 0 0 0 -1 {(inEffect ? 0 : 1)} 0 {monsterEntity.Morph} - 0 -1 0 0 0 0 0 0 0 0";
        }

        return string.Empty;
    }

    public static string GenerateIn(this INpcEntity entity, bool inEffect = false)
    {
        if (entity.IsStillAlive)
        {
            string timeSpaceOwnerName = entity.TimeSpaceOwnerId.HasValue ? entity.MapInstance.GetCharacterById(entity.TimeSpaceOwnerId.Value)?.Name : null;

            return
                "in 2 " +
                $"{entity.NpcVNum} " +
                $"{entity.Id} " +
                $"{entity.PositionX} " +
                $"{entity.PositionY} " +
                $"{entity.Direction} " +
                $"{entity.GetHpPercentage()} " +
                $"{entity.GetMpPercentage()} " +
                $"{(entity.TimeSpaceInfo != null ? 10002 : entity.Dialog)} " +
                "0 " +
                $"{(entity.CharacterPartnerId.HasValue ? 3 : 0)} " +
                $"{entity.CharacterPartnerId ?? -1} " +
                $"{(inEffect ? 0 : 1)} " +
                $"{(entity.IsSitting ? 1 : 0)} " +
                "-1 " +
                $"{(string.IsNullOrEmpty(entity.CustomName) ? "@" : entity.CustomName.Replace(' ', '^'))} " +
                "0 " +
                "-1 " +
                "0 " +
                "0 " +
                "0 " +
                "0 " +
                "0 " +
                "0 " +
                "0 " +
                "0 " +
                $"{(entity.TimeSpaceInfo != null ? 647 : 0)} " +
                $"{(string.IsNullOrEmpty(timeSpaceOwnerName) ? "0" : timeSpaceOwnerName)} " +
                "0";
        }

        return string.Empty;
    }

    public static string GenerateOut(this IEntity entity) => $"out {(byte)entity.Type} {entity.Id}";
    public static void BroadcastChatBubble(this IEntity entity, string message, ChatMessageColorType type) => entity.MapInstance.Broadcast(entity.GenerateSayPacket(message, type));
    public static string GenerateSayPacket(this IEntity entity, string message, ChatMessageColorType type) => $"say {(byte)entity.Type} {entity.Id} {(byte)type} {message}";
}