"""Store customer CLI entry."""

from __future__ import annotations

import argparse
import sys

from store_customer_lib import fields, followups, import_cmds, members, wallet


def build_parser() -> argparse.ArgumentParser:
    p = argparse.ArgumentParser(description="Store customer CLI")
    sub = p.add_subparsers(dest="cmd", required=True)

    s = sub.add_parser("member-add")
    s.add_argument("--name", required=True)
    s.add_argument("--phone")
    s.add_argument("--birthday")
    s.add_argument("--due-date")
    s.add_argument("--note")
    s.add_argument("--tags-json", default="[]")
    s.add_argument("--fields-json", default="{}")
    s.add_argument("--member-id")
    s.add_argument("--session-id")
    s.set_defaults(func=members.cmd_member_add)

    s = sub.add_parser("member-update")
    s.add_argument("--member-id", required=True)
    s.add_argument("--set", required=True)
    s.add_argument("--session-id")
    s.set_defaults(func=members.cmd_member_update)

    s = sub.add_parser("member-query")
    s.add_argument("--member-id")
    s.add_argument("--name")
    s.add_argument("--phone")
    s.add_argument("--tag")
    s.add_argument("--birthday-month")
    s.add_argument("--birthday-today", action="store_true")
    s.add_argument("--field-key")
    s.add_argument("--field-value")
    s.add_argument("--filters-json")
    s.add_argument("--due-within-days", type=int)
    s.add_argument("--include-deleted", action="store_true")
    s.add_argument("--with-wallet", action="store_true")
    s.add_argument("--with-cards", action="store_true")
    s.add_argument("--with-profile", action="store_true")
    s.add_argument("--with-fields", action="store_true")
    s.add_argument("--limit", type=int)
    s.add_argument("--session-id")
    s.set_defaults(func=members.cmd_member_query)

    s = sub.add_parser("member-txn-query")
    s.add_argument("--member-id", required=True)
    s.add_argument("--type", choices=["recharge", "consume", "cash", "card_use", "card_purchase"])
    s.add_argument("--date-from")
    s.add_argument("--date-to")
    s.add_argument("--limit", type=int)
    s.add_argument("--session-id")
    s.set_defaults(func=members.cmd_member_txn_query)

    s = sub.add_parser("member-delete")
    s.add_argument("--member-id", required=True)
    s.add_argument("--yes", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=members.cmd_member_delete)

    s = sub.add_parser("member-restore")
    s.add_argument("--member-id", required=True)
    s.add_argument("--yes", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=members.cmd_member_restore)

    s = sub.add_parser("member-birthdays")
    s.add_argument("--month", type=int, required=True)
    s.add_argument("--limit", type=int, default=20)
    s.add_argument("--with-wallet", action="store_true")
    s.add_argument("--with-cards", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=import_cmds.cmd_member_birthdays)

    s = sub.add_parser("member-due")
    s.add_argument("--within-days", type=int, default=30)
    s.add_argument("--limit", type=int, default=20)
    s.add_argument("--with-wallet", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=import_cmds.cmd_member_due)

    s = sub.add_parser("balance-recharge")
    s.add_argument("--member-id", required=True)
    s.add_argument("--amount", type=float, required=True)
    s.add_argument("--bonus", type=float, default=0)
    s.add_argument("--yes", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=wallet.cmd_balance_recharge)

    s = sub.add_parser("balance-query")
    s.add_argument("--member-id", required=True)
    s.add_argument("--session-id")
    s.set_defaults(func=wallet.cmd_balance_query)

    s = sub.add_parser("card-open")
    s.add_argument("--member-id", required=True)
    s.add_argument("--name", required=True)
    s.add_argument("--times", type=int, required=True)
    s.add_argument("--price", type=float, required=True)
    s.add_argument("--service")
    s.add_argument("--expire")
    s.add_argument("--card-id")
    s.add_argument("--yes", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=wallet.cmd_card_open)

    s = sub.add_parser("card-query")
    s.add_argument("--member-id", required=True)
    s.add_argument("--session-id")
    s.set_defaults(func=wallet.cmd_card_query)

    s = sub.add_parser("card-expiring")
    s.add_argument("--days", type=int, default=7)
    s.add_argument("--session-id")
    s.set_defaults(func=wallet.cmd_card_expiring)

    s = sub.add_parser("followup-add")
    s.add_argument("--member-id", required=True)
    s.add_argument("--content", default="")
    s.add_argument("--contact-at")
    s.add_argument("--next-followup-date", required=True)
    s.add_argument("--followup-id")
    s.add_argument("--session-id")
    s.set_defaults(func=followups.cmd_followup_add)

    s = sub.add_parser("followup-query")
    s.add_argument("--member-id")
    s.add_argument("--due-date")
    s.add_argument("--session-id")
    s.set_defaults(func=followups.cmd_followup_query)

    s = sub.add_parser("followup-due")
    s.add_argument("--date")
    s.add_argument("--session-id")
    s.set_defaults(func=followups.cmd_followup_due)

    s = sub.add_parser("field-def-add")
    s.add_argument("--field-key", required=True)
    s.add_argument("--label", required=True)
    s.add_argument("--field-type", default="text")
    s.add_argument("--options-json", default="[]")
    s.add_argument("--session-id")
    s.set_defaults(func=fields.cmd_field_def_add)

    s = sub.add_parser("field-def-update")
    s.add_argument("--field-key", required=True)
    s.add_argument("--set", required=True)
    s.add_argument("--session-id")
    s.set_defaults(func=fields.cmd_field_def_update)

    s = sub.add_parser("field-def-delete")
    s.add_argument("--field-key", required=True)
    s.add_argument("--yes", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=fields.cmd_field_def_delete)

    s = sub.add_parser("field-def-list")
    s.add_argument("--session-id")
    s.set_defaults(func=fields.cmd_field_def_list)

    imp = sub.add_parser("import")
    imp_sub = imp.add_subparsers(dest="import_cmd", required=True)
    s = imp_sub.add_parser("preview")
    s.add_argument("--path", required=True)
    s.add_argument("--session-id")
    s.set_defaults(func=import_cmds.cmd_import_preview)
    s = imp_sub.add_parser("commit")
    s.add_argument("--path", required=True)
    s.add_argument("--yes", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=import_cmds.cmd_import_commit)

    s = sub.add_parser("export")
    exp_sub = s.add_subparsers(dest="export_cmd", required=True)
    s = exp_sub.add_parser("file")
    s.add_argument("--output", required=True)
    s.add_argument("--member-id")
    s.add_argument("--with-wallet", action="store_true")
    s.add_argument("--with-cards", action="store_true")
    s.add_argument("--session-id")
    s.set_defaults(func=import_cmds.cmd_export_file)

    return p


def main() -> int:
    args = build_parser().parse_args()
    return int(args.func(args))


if __name__ == "__main__":
    sys.exit(main())
