using System.Globalization;
using System.Text;

namespace SharpChat.ClientCommands;

public class AFKClientCommand : ClientCommand {
    private const string DEFAULT = "AFK";
    public const int MAX_GRAPHEMES = 5;
    public const int MAX_BYTES = MAX_GRAPHEMES * 10;

    public bool IsMatch(ClientCommandContext ctx) {
        return ctx.NameEquals("afk");
    }

    public async Task Dispatch(ClientCommandContext ctx) {
        string? statusText = ctx.Args.FirstOrDefault();
        if(string.IsNullOrWhiteSpace(statusText))
            statusText = DEFAULT;
        else {
            statusText = statusText.Trim();

            StringInfo sti = new(statusText);
            if(Encoding.UTF8.GetByteCount(statusText) > MAX_BYTES
                || sti.LengthInTextElements > MAX_GRAPHEMES)
                statusText = sti.SubstringByTextElements(0, Math.Min(sti.LengthInTextElements, MAX_GRAPHEMES)).Trim();
        }

        await ctx.Chat.UpdateUser(
            ctx.User,
            status: UserStatus.Away,
            statusText: statusText
        );
    }
}