using SharpChat.SockChat.S2CPackets;

namespace SharpChat.ClientCommands;

public class ShutdownRestartClientCommand(ManualResetEvent waitHandle, Func<bool> shutdownCheck) : ClientCommand {
    private readonly ManualResetEvent WaitHandle = waitHandle ?? throw new ArgumentNullException(nameof(waitHandle));
    private readonly Func<bool> ShutdownCheck = shutdownCheck ?? throw new ArgumentNullException(nameof(shutdownCheck));

    public bool IsMatch(ClientCommandContext ctx) {
        return ctx.NameEquals("shutdown")
            || ctx.NameEquals("restart");
    }

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

        if(!ShutdownCheck())
            return;

        if(ctx.NameEquals("restart"))
            foreach(Connection conn in ctx.Chat.Connections)
                conn.PrepareForRestart();

        await ctx.Chat.Update();
        WaitHandle?.Set();
    }
}