using SharpChat.SockChat.S2CPackets;
using ZLogger;

namespace SharpChat.ClientCommands;

public class ShutdownRestartClientCommand(SockChatServer server, CancellationTokenSource cancellationTokenSource) : ClientCommand {
    public bool IsMatch(ClientCommandContext ctx) {
        return ctx.NameEquals("shutdown")
            || ctx.NameEquals("restart");
    }

    public async Task Dispatch(ClientCommandContext ctx) {
        if(!ctx.User.UserId.Equals("1")) {
            ctx.Logger.ZLogInformation($"{ctx.User.UserId}/{ctx.User.UserName} tried to issue /shutdown or /restart");
            long msgId = ctx.Chat.RandomSnowflake.Next();
            await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
            return;
        }

        if(cancellationTokenSource.IsCancellationRequested)
            return;

        server.IsRestarting = ctx.NameEquals("restart");
        ctx.Logger.ZLogInformation($"{(server.IsRestarting ? "Restart" : "Shutdown")} requested through Sock Chat command...");

        await ctx.Chat.Update();
        await cancellationTokenSource.CancelAsync();
    }
}