using SharpChat.Packet;
using System;
using System.Globalization;
using System.Linq;
using System.Text;

namespace SharpChat.Commands {
    public class AFKCommand : IChatCommand {
        private const string DEFAULT = "AFK";
        public const int MAX_GRAPHEMES = 5;
        public const int MAX_BYTES = MAX_GRAPHEMES * 10;

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

        public void Dispatch(ChatCommandContext 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();
            }

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