"""
此文件为命令行入口。
避免在此文件中引用 router 和 service 模块内的代码。
"""

from typing import Annotated

import typer

from nyahome import __version__
from nyahome.cli.cli import console
from nyahome.cli.cli_env import ENV_PATH, env_app

app = typer.Typer(
    name="NyaHome",
    help="🌸 为你而存在的故事之家 ~",
    rich_markup_mode="rich",
    no_args_is_help=True,
)


def version_callback(value: bool = False) -> None:
    if value:
        console.print(f"[green]NyaHome[/green] version {__version__}")


@app.callback(invoke_without_command=True)
def main(
    version: bool = typer.Option(
        False,
        "--version",
        "-v",
        help="显示版本号并退出，没有其他命令会被执行。",
        callback=version_callback,
        is_eager=True,
    ),
) -> None:
    console.print("[bright_black]NyaHome 仍然处于极早期的阶段。如果遇到任何问题，请告诉芒果帆帆喵！[/bright_black]")


@app.command()
def run() -> None:
    """
    运行 NyaHome。
    """
    import os

    import uvicorn
    from dotenv import load_dotenv

    load_dotenv(ENV_PATH)

    uvicorn.run(
        "nyahome.server:app",
        reload=os.getenv("NYAHOME_UVICORN_RELOAD", "false") in ["True", "true", "1"],
        host=os.getenv("NYAHOME_UVICORN_HOST", "0.0.0.0"),
        port=int(os.getenv("NYAHOME_UVICORN_PORT", "9000")),
        timeout_graceful_shutdown=2,
        log_config="logging.yaml",
        log_level="debug",
    )


@app.command()
def openapi(
    path: Annotated[str, typer.Argument(help="导出的 json 格式 openapi.json 应该保存为……")] = "openapi.json",
) -> None:
    """
    根据代码导出 NyaHome 的 openapi.json 。
    """
    from nyahome.server import save_openapi_json

    save_openapi_json(path)
    console.print(f"[cyan]已经保存 openapi.json 到 {path} 。[/cyan]")


app.add_typer(env_app, name="env", no_args_is_help=True, help="设置 NyaHome 应用的环境变量。")


if __name__ == "__main__":
    app()
