from __future__ import annotations

import argparse

from ..context import CliContext
from .common import load_list_arg


def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
    parser = subparsers.add_parser("export", help="导出")
    export_subparsers = parser.add_subparsers(dest="export_command", required=True)

    start = export_subparsers.add_parser("start", help="启动导出")
    start.add_argument("--app-key", required=True)
    start.add_argument("--view-id", required=True)
    start.add_argument("--column", dest="columns", action="append", type=int, default=[], help="只导出这些 field_id；不传时导出当前视图全部字段")
    start.add_argument("--columns-file", help="JSON/YAML list，内容与 --column 语义一致")
    start.add_argument("--where-file", help="JSON/YAML list，内容与 record list 的 where DSL 一致；内部先查命中 record_id 再走原生导出")
    start.add_argument("--order-by-file", help="JSON/YAML list，内容与 record list 的 order_by DSL 一致；内部查询和导出记录顺序保持一致")
    start.add_argument("--record-id", dest="record_ids", action="append", default=[], help="只导出这些 record_id；不传时导出当前视图全部数据")
    start.add_argument("--record-ids-file", help="JSON/YAML list，内容与 --record-id 语义一致")
    start.add_argument("--include-workflow-log", action=argparse.BooleanOptionalAction, default=False, help="是否同时导出流程日志")
    start.set_defaults(handler=_handle_start, format_hint="export_start")

    status = export_subparsers.add_parser("status", help="查询导出状态")
    status.add_argument("--export-handle", required=True)
    status.set_defaults(handler=_handle_status, format_hint="export_status")

    get = export_subparsers.add_parser("get", help="获取导出结果")
    get.add_argument("--export-handle", required=True)
    get.add_argument("--download-to-path")
    get.set_defaults(handler=_handle_get, format_hint="export_get")

    direct = export_subparsers.add_parser("direct", help="直接导出并下载")
    direct.add_argument("--app-key", required=True)
    direct.add_argument("--view-id", required=True)
    direct.add_argument("--column", dest="columns", action="append", type=int, default=[], help="只导出这些 field_id；不传时导出当前视图全部字段")
    direct.add_argument("--columns-file", help="JSON/YAML list，内容与 --column 语义一致")
    direct.add_argument("--where-file", help="JSON/YAML list，内容与 record list 的 where DSL 一致；内部先查命中 record_id 再走原生导出")
    direct.add_argument("--order-by-file", help="JSON/YAML list，内容与 record list 的 order_by DSL 一致；内部查询和导出记录顺序保持一致")
    direct.add_argument("--record-id", dest="record_ids", action="append", default=[], help="只导出这些 record_id；不传时导出当前视图全部数据")
    direct.add_argument("--record-ids-file", help="JSON/YAML list，内容与 --record-id 语义一致")
    direct.add_argument("--include-workflow-log", action=argparse.BooleanOptionalAction, default=False, help="是否同时导出流程日志")
    direct.add_argument("--download-to-path")
    direct.add_argument("--wait-timeout-seconds", type=float)
    direct.set_defaults(handler=_handle_direct, format_hint="export_direct")


def _columns(args: argparse.Namespace) -> list[int | dict]:
    columns: list[int | dict] = list(args.columns or [])
    if args.columns_file:
        columns.extend(load_list_arg(args.columns_file, option_name="--columns-file"))
    return columns


def _record_ids(args: argparse.Namespace) -> list[str | int]:
    record_ids: list[str | int] = list(args.record_ids or [])
    if args.record_ids_file:
        record_ids.extend(load_list_arg(args.record_ids_file, option_name="--record-ids-file"))
    return record_ids


def _where(args: argparse.Namespace) -> list[dict]:
    return load_list_arg(args.where_file, option_name="--where-file") if args.where_file else []


def _order_by(args: argparse.Namespace) -> list[dict]:
    return load_list_arg(args.order_by_file, option_name="--order-by-file") if args.order_by_file else []


def _handle_start(args: argparse.Namespace, context: CliContext) -> dict:
    return context.exports.record_export_start(
        profile=args.profile,
        app_key=args.app_key,
        view_id=args.view_id,
        columns=_columns(args),
        where=_where(args),
        order_by=_order_by(args),
        record_ids=_record_ids(args),
        include_workflow_log=args.include_workflow_log,
    )


def _handle_status(args: argparse.Namespace, context: CliContext) -> dict:
    return context.exports.record_export_status_get(
        profile=args.profile,
        export_handle=args.export_handle,
    )


def _handle_get(args: argparse.Namespace, context: CliContext) -> dict:
    return context.exports.record_export_get(
        profile=args.profile,
        export_handle=args.export_handle,
        download_to_path=args.download_to_path,
    )


def _handle_direct(args: argparse.Namespace, context: CliContext) -> dict:
    return context.exports.record_export_direct(
        profile=args.profile,
        app_key=args.app_key,
        view_id=args.view_id,
        columns=_columns(args),
        where=_where(args),
        order_by=_order_by(args),
        record_ids=_record_ids(args),
        include_workflow_log=args.include_workflow_log,
        download_to_path=args.download_to_path,
        wait_timeout_seconds=args.wait_timeout_seconds,
    )
