import argparse
import http.server
import socketserver
import sys
import os

import comfyrecipes.builder


def main() -> None:
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(required=True, dest="subcommand")

    parser_build = subparsers.add_parser("build")
    parser_build.add_argument("directory", type=str)
    parser_build.add_argument("--outdir", type=str, default="out")

    parser_serve = subparsers.add_parser("serve")
    parser_serve.add_argument("directory", type=str)
    parser_serve.add_argument("--port", type=int, default=8000)
    parser_serve.add_argument("--address", type=str, default="127.0.0.1")
    parser_serve.add_argument("--outdir", type=str, default="out/html")

    parser_generate_units = subparsers.add_parser("generate-units")
    parser_generate_units.add_argument("directory", type=str)
    parser_generate_units.add_argument("--force", dest="force", action="store_true")

    parser_generate_ingredients = subparsers.add_parser("generate-ingredients")
    parser_generate_ingredients.add_argument("directory", type=str)
    parser_generate_ingredients.add_argument(
        "--force", dest="force", action="store_true"
    )

    args = parser.parse_args()

    ret = 0
    builder = comfyrecipes.builder.Builder()
    if args.subcommand == "build":
        ret = builder.build(args.directory, args.outdir)
    elif args.subcommand == "serve":
        os.chdir(args.directory)
        os.chdir(args.outdir)
        httpd = socketserver.TCPServer(
            (args.address, args.port), http.server.SimpleHTTPRequestHandler
        )
        print(f"serving at http://{args.address}:{args.port}")
        print("THIS WEB SERVER IS ONLY MEANT FOR LOCAL TESTING, IT IS NOT SUITABLE FOR PRODUCTION")
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            pass
    elif args.subcommand == "generate-units":
        os.chdir(args.directory)
        if not args.force and os.path.isfile("units.yaml"):
            print(
                "units.yaml already exists, pass --force if you want to overwrite it",
                file=sys.stderr,
            )
            ret = 1
        else:
            builder.generate_units()
    elif args.subcommand == "generate-ingredients":
        os.chdir(args.directory)
        if not args.force and os.path.isfile("ingredients.yaml"):
            print(
                "ingredients.yaml already exists, pass --force if you want to overwrite it",
                file=sys.stderr,
            )
            ret = 1
        else:
            builder.generate_ingredients()
    else:
        # unhandled, but valid subcommand
        assert False
    sys.exit(ret)


if __name__ == "__main__":
    main()