__all__ = [
    "benchmark_simple_command",
    "benchmark_command_with_flags",
    "benchmark_many_commands",
    "benchmark_command_with_many_flags",
    "benchmark_extreme_router",
]

from argenta.command import Flag, Flags
from argenta.command.models import Command, InputCommand
from argenta.response import Response
from argenta.router import Router

from .entity import benchmarks


@benchmarks.register(type_="finds_appropriate_handler", description="Simple command (no flags)")
def benchmark_simple_command() -> None:
    router = Router()

    @router.command(Command("test"))
    def handler(_res: Response) -> None:
        pass

    input_cmd = InputCommand.parse("test")
    router.finds_appropriate_handler(input_cmd)


@benchmarks.register(type_="finds_appropriate_handler", description="Command with flags (3 flags)")
def benchmark_command_with_flags() -> None:
    router = Router()

    @router.command(Command("test", flags=Flags([Flag("a"), Flag("b"), Flag("c")])))
    def handler(_res: Response) -> None:
        pass

    input_cmd = InputCommand.parse("test -a -b -c")
    router.finds_appropriate_handler(input_cmd)


@benchmarks.register(type_="finds_appropriate_handler", description="Many commands (50 commands)")
def benchmark_many_commands() -> None:
    router = Router()

    for i in range(50):

        @router.command(Command(f"cmd{i}"))
        def handler(_res: Response) -> None:
            pass

    input_cmd = InputCommand.parse("cmd25")
    router.finds_appropriate_handler(input_cmd)


@benchmarks.register(
    type_="finds_appropriate_handler", description="Command with many flags (20 flags)"
)
def benchmark_command_with_many_flags() -> None:
    router = Router()

    flags = Flags([Flag(f"flag{i}") for i in range(20)])

    @router.command(Command("test", flags=flags))
    def handler(_res: Response) -> None:
        pass

    input_cmd = InputCommand.parse("test " + " ".join(f"-flag{i}" for i in range(10)))
    router.finds_appropriate_handler(input_cmd)


@benchmarks.register(
    type_="finds_appropriate_handler", description="Extreme (100 commands, 10 flags each)"
)
def benchmark_extreme_router() -> None:
    router = Router()

    for i in range(100):
        flags = Flags([Flag(f"f{i}_{j}") for j in range(10)])

        @router.command(Command(f"cmd{i}", flags=flags))
        def handler(_res: Response) -> None:
            pass

    input_cmd = InputCommand.parse("cmd50 -f50_0 -f50_1 -f50_2")
    router.finds_appropriate_handler(input_cmd)
