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

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