from __future__ import annotations

import argparse

from ..context import CliContext
from .common import raise_config_error, require_list_arg, require_object_arg


def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
    parser = subparsers.add_parser("repo", help="代码仓库开发工具")
    repo_subparsers = parser.add_subparsers(dest="repo_command", required=True)

    init_parser = repo_subparsers.add_parser("init", help="从模板初始化仓库")
    init_parser.add_argument("--group-name", required=True)
    init_parser.add_argument("--repo-template", required=True)
    init_parser.set_defaults(handler=_handle_init, format_hint="generic")

    generate_parser = repo_subparsers.add_parser("generate", help="沿用官方 generate 链路生成并提交页面代码")
    generate_parser.add_argument("--repo-name", required=True)
    generate_parser.add_argument("--query", required=True)
    generate_parser.add_argument("--tag-id", type=int)
    generate_parser.add_argument("--app-keys-file")
    generate_parser.add_argument("--extra-info-file")
    generate_parser.add_argument("--file-messages-file")
    generate_parser.add_argument("--agent-id", type=int)
    generate_parser.add_argument("--allow-create-table", action="store_true")
    generate_parser.add_argument("--route-prefix")
    generate_parser.add_argument("--token-name")
    generate_parser.add_argument("--session-id")
    generate_parser.add_argument("--round-version", type=int)
    generate_parser.add_argument("--disable-trace-log", action="store_true")
    generate_parser.set_defaults(handler=_handle_generate, format_hint="generic")

    publish_parser = repo_subparsers.add_parser("publish-prod", help="发布 develop 到生产分支")
    publish_parser.add_argument("--repo-name", required=True)
    publish_parser.add_argument("--confirm", action="store_true")
    publish_parser.set_defaults(handler=_handle_publish_prod, format_hint="generic")


def _handle_init(args: argparse.Namespace, context: CliContext) -> dict:
    return context.repo.repository_init(
        profile=args.profile,
        group_name=args.group_name,
        repo_template=args.repo_template,
    )


def _handle_generate(args: argparse.Namespace, context: CliContext) -> dict:
    app_keys = require_list_arg(args.app_keys_file, option_name="--app-keys-file") if args.app_keys_file else []
    extra_info = require_object_arg(args.extra_info_file, option_name="--extra-info-file") if args.extra_info_file else None
    file_messages = require_list_arg(args.file_messages_file, option_name="--file-messages-file") if args.file_messages_file else []
    return context.repo.repository_generate(
        profile=args.profile,
        repo_name=args.repo_name,
        query=args.query,
        tag_id=args.tag_id,
        app_keys=app_keys,
        extra_info=extra_info,
        file_messages=file_messages,
        being_trace_log_enabled=not args.disable_trace_log,
        agent_id=args.agent_id,
        allow_create_table=args.allow_create_table,
        route_prefix=args.route_prefix,
        token_name=args.token_name,
        session_id=args.session_id,
        round_version=args.round_version,
    )


def _handle_publish_prod(args: argparse.Namespace, context: CliContext) -> dict:
    if args.confirm is not True:
        raise_config_error(
            "repository_publish_prod requires explicit confirmation.",
            fix_hint="Re-run with `--confirm` after verifying the target repo and release intent.",
        )
    return context.repo.repository_publish_prod(
        profile=args.profile,
        repo_name=args.repo_name,
        confirm=args.confirm,
    )
