public static void CreateGeometry(IMinecraftCommandService commandService, params string[] args)
        {
            var position = commandService.GetLocation();
            var lines    = new CreateCommandHandler(commandService).Handle(args.ToList().Skip(1).ToArray(), position,
                                                                           new List <SavedPosition>());

            if (lines.Any())
            {
                var _commandFormater = commandService.GetFormater();
                var sw = new Stopwatch();
                sw.Start();
                var lastLine = lines.First();
                foreach (var line in lines)
                {
                    if (lastLine.Start.Distance2D(line.Start) > 100)
                    {
                        commandService.Command($"tp @s {line.Start.X} ~ {line.Start.Z}");
                    }
                    var command = _commandFormater.Fill(line.Start.X, line.Start.Y, line.Start.Z, line.End.X, line.End.Y, line.End.Z, line.Block, line.Block.Contains(" ")?"":"0");
                    commandService.Command(command);
                    lastLine = line;
                }
                sw.Stop();
                commandService.Status($"time to queue commands {sw.Elapsed.TotalSeconds}");
                //Console.WriteLine($"time to queue commands {sw.Elapsed.TotalSeconds}");
                sw.Reset();
                sw.Start();
                commandService.Wait();
                sw.Stop();
                commandService.Status($"time to complete import {sw.Elapsed.TotalSeconds}");
                //Console.WriteLine($"time to complete import {sw.Elapsed.TotalSeconds}");
            }
        }
        public void Handle(string[] args, IMinecraftCommandService minecraftService)
        {
            var position = minecraftService.GetLocation();

            for (var i = 0; i <= RadiusHandler.Radius; i++)
            {
                CreateHandler.CreateGeometry(minecraftService, "create", "circle", $"{i}", "1", "air", $"{position.X}", $"{position.Y+i}", $"{position.Z}");
                //minecraftService.Command($"fill ~-{i} ~{i} ~-{i} ~{i} ~{i} ~{i} air");
            }
        }
        public static void CreateGeometry(IMinecraftCommandService commandService, List <SavedPosition> savedPositions, params string[] args)
        {
            var sw = new Stopwatch();

            sw.Start();
            var position = commandService.GetLocation();

            var commandArgs   = args.Skip(1).ToArray();
            var lines         = new List <Line>();
            var createCommand = (commandArgs.ElementAtOrDefault(0) ?? "").ToLower();

            switch (createCommand)
            {
            case "circle":
                lines = CreateCircle(commandService, commandArgs, position, savedPositions);
                break;

            case "ring":
                lines = CreateRing(commandService, commandArgs, position, savedPositions);
                break;

            case "walls":
                lines = CreateWalls(commandService, commandArgs, position, savedPositions);
                break;

            case "outline":
                lines = CreateBox(commandService, commandArgs, position, savedPositions, false);
                break;

            case "box":
                lines = CreateBox(commandService, commandArgs, position, savedPositions, true);
                break;

            case "floor":
                lines = CreateFloor(commandService, commandArgs, position, savedPositions);
                break;

            case "sphere":
                lines = CreateSphere(commandService, commandArgs, position, savedPositions);
                break;

            case "merlon":
                lines = CreateMerlon(commandService, commandArgs, position, savedPositions);
                break;

            case "maze":
                lines = CreateMaze(commandService, commandArgs, position, savedPositions);
                break;

            case "house":
                lines = CreateHouse(commandService, commandArgs, position, savedPositions);
                break;

            case "triangle":
                lines = CreateTriangle(commandService, commandArgs, position, savedPositions);
                break;

            case "poly":
            case "polygon":
                lines = CreatePoly(commandService, commandArgs, position, savedPositions);
                break;

            default:
                commandService.Status("CREATE\n" +
                                      "create circle\n" +
                                      "create ring\n" +
                                      "create walls\n" +
                                      "create outline\n" +
                                      "create box\n" +
                                      "create floor\n" +
                                      "create sphere\n" +
                                      "create merlon\n" +
                                      "create triangle\n" +
                                      "create [poly|polygon]\n" +
                                      "create maze"
                                      );
                return;
            }

            if (!lines.Any())
            {
                return;
            }
            LogTime(commandService, sw, $"CREATE {createCommand.ToUpper()}: time to get lines to render: {sw.Elapsed.TotalSeconds}");

            var commandFormater = commandService.GetFormater();

            var lastLine = lines.First();

            foreach (var line in lines)
            {
                if (lastLine.Start.Distance2D(line.Start) > 100)
                {
                    commandService.Command($"tp @s {line.Start.X} ~ {line.Start.Z}");
                }

                var command = commandFormater.Fill(line.Start.X, line.Start.Y, line.Start.Z, line.End.X, line.End.Y,
                                                   line.End.Z, line.Block, line.Block.Contains(" ") ? "" : "0");
                // TODO: Identify the limitation here and account for it.
                // Should this be executed on a thread so that other commands can be processed at the same time?
                // Is that possible?
                commandService.Command(command);
                lastLine = line;
            }

            LogTime(commandService, sw, $"CREATE {createCommand.ToUpper()}: time to queue commands: {sw.Elapsed.TotalSeconds}");

            commandService.Wait();
            LogTime(commandService, sw, $"CREATE {createCommand.ToUpper()}: time to complete import: {sw.Elapsed.TotalSeconds}");
        }