#!/usr/bin/env python3
# ============================================================
# cli.py — Giao diện dòng lệnh hệ thống kế toán multi-company
#
# Cách dùng:
#   python cli.py companies list
#   python cli.py companies new
#   python cli.py companies new --name "ACME" --tax "0123456789" --std TT200
#   python cli.py company CTY001 info
#   python cli.py company CTY001 accounts --search "tiền"
#   python cli.py company CTY001 search "phiếu thu"
#   python cli.py company CTY001 partners list
#   python cli.py company CTY001 partners add
#   python cli.py setup-knowledge   # Chạy setup_knowledge_online.py
# ============================================================

import sys
import os
import argparse

# Đảm bảo import được từ root khi chạy: python -m core.cli hoặc python core/cli.py
_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if _ROOT not in sys.path:
    sys.path.insert(0, _ROOT)

from core.company_manager import (
    list_companies, get_company, get_company_db_path,
    create_company, update_company_status, print_companies_table
)
from core.db_init import get_conn, check_db_integrity
from core.search import search_vouchers, search_partners, search_accounts, print_search_results


# ─── Sub-commands: companies ───────────────────────────────

def cmd_companies_list(args):
    print_companies_table()


def cmd_companies_new(args):
    """Tạo công ty mới — hỏi thông tin nếu không truyền args"""

    def ask(prompt, default=""):
        val = input(f"{prompt} [{default}]: ").strip()
        return val if val else default

    print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
    print("  TẠO CÔNG TY MỚI")
    print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")

    name         = getattr(args, "name", "") or ask("Tên ngắn (vd: ACME)")
    legal_name   = getattr(args, "legal_name", "") or ask("Tên pháp lý đầy đủ", name)
    tax_code     = getattr(args, "tax", "") or ask("Mã số thuế (MST)")
    legal_type   = getattr(args, "type", "") or ask("Loại hình (TNHH/CoPhan/TuNhan/HoKinhDoanh)", "TNHH")
    standard     = getattr(args, "std", "") or ask("Chuẩn kế toán (TT200/TT133)", "TT200")
    vat_period   = getattr(args, "vat_period", "") or ask("Kỳ khai thuế (monthly/quarterly)", "monthly")
    address      = getattr(args, "address", "") or ask("Địa chỉ")
    phone        = getattr(args, "phone", "") or ask("Điện thoại")
    email        = getattr(args, "email", "") or ask("Email")
    representative = ask("Người đại diện pháp lý")

    fee_str = ask("Phí dịch vụ kế toán/tháng (VND)", "0")
    try:
        fee_monthly = float(fee_str.replace(",", "")) or None
    except ValueError:
        fee_monthly = None

    notes = ask("Ghi chú")

    if not name:
        print("❌ Tên công ty không được để trống.")
        return

    entry = create_company(
        name=name, legal_name=legal_name, tax_code=tax_code,
        legal_type=legal_type, standard=standard,
        vat_period=vat_period, address=address,
        phone=phone, email=email, representative=representative,
        fee_monthly=fee_monthly, notes=notes,
    )
    print(f"\n🎉 Đã tạo công ty: {entry['code']} — {entry['name']}")
    print(f"   Thư mục: companies/{entry['folder']}")
    print(f"   Database: {entry['db_file']}\n")


# ─── Sub-commands: company <CODE> ─────────────────────────

def cmd_company_info(code: str, args):
    company = get_company(code)
    if not company:
        print(f"❌ Không tìm thấy công ty: {code}")
        return

    print(f"\n━━ {company['code']} — {company['name']} ━━")
    print(f"  Tên pháp lý : {company.get('legal_name', '')}")
    print(f"  MST         : {company.get('tax_code', '')}")
    print(f"  Chuẩn KT    : {company.get('standard', 'TT200')}")
    print(f"  Trạng thái  : {company.get('status', 'active')}")
    print(f"  Thư mục     : companies/{company['folder']}")
    print(f"  Database    : {company['db_file']}")

    db_path = get_company_db_path(code)
    if db_path and os.path.exists(db_path):
        size_kb = os.path.getsize(db_path) / 1024
        ok = check_db_integrity(db_path)
        print(f"  DB Size     : {size_kb:.1f} KB")
        print(f"  DB Integrity: {'✅ OK' if ok else '❌ LỖUI'}")
        conn = get_conn(db_path)
        c = conn.cursor()
        v_count = c.execute("SELECT COUNT(*) FROM vouchers").fetchone()[0]
        p_count = c.execute("SELECT COUNT(*) FROM partners").fetchone()[0]
        conn.close()
        print(f"  Chứng từ    : {v_count}")
        print(f"  Đối tác     : {p_count}")
    print()


def cmd_company_accounts(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}")
        return
    query = getattr(args, "search", "") or ""
    if query:
        results = search_accounts(db_path, query)
        print_search_results(results, f"Tài khoản: '{query}'")
    else:
        conn = get_conn(db_path)
        c = conn.cursor()
        rows = c.execute(
            "SELECT code, name, type, level FROM accounts WHERE level<=2 ORDER BY code"
        ).fetchall()
        conn.close()
        print(f"\n{'Mã':>8}  {'Loại':10}  Tên tài khoản")
        print("─" * 65)
        for code_a, name, type_, level in rows:
            indent = "  " * (level - 1)
            print(f"{code_a:>8}  {type_:10}  {indent}{name}")


def cmd_company_search(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}")
        return
    query = args.query
    if not query:
        print("❌ Vui lòng nhập từ khóa tìm kiếm.")
        return

    target = getattr(args, "target", "vouchers")
    if target == "partners":
        results = search_partners(db_path, query)
        print_search_results(results, f"Đối tác: '{query}'")
    else:
        results = search_vouchers(db_path, query)
        print_search_results(results, f"Chứng từ: '{query}'")


def cmd_company_partners_list(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}")
        return
    conn = get_conn(db_path)
    c = conn.cursor()
    rows = c.execute(
        "SELECT code, name, tax_code, type, phone FROM partners ORDER BY code"
    ).fetchall()
    conn.close()

    if not rows:
        print("(Chưa có đối tác nào)")
        return
    print(f"\n{'Mã':>7}  {'L':10}  {'MST':15}  Tên")
    print("─" * 65)
    for row in rows:
        print(f"{(row[0] or ''):>7}  {(row[3] or ''):10}  {(row[2] or ''):15}  {row[1][:35]}")


def cmd_company_partners_add(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}")
        return

    def ask(prompt, default=""):
        val = input(f"{prompt} [{default}]: ").strip()
        return val if val else default

    print(f"\n━━ Thêm đối tác cho {code} ━━")
    name    = ask("Tên đối tác")
    tax_c   = ask("Mã số thuế")
    ptype   = ask("Loại (customer/vendor/both)", "both")
    address = ask("Địa chỉ")
    phone   = ask("Điện thoại")
    email   = ask("Email")

    if not name:
        print("❌ Tên đối tác không được để trống.")
        return

    conn = get_conn(db_path)
    c = conn.cursor()
    # Auto-code
    last = c.execute("SELECT code FROM partners ORDER BY id DESC LIMIT 1").fetchone()
    if last and last[0]:
        import re
        m = re.match(r"([A-Z]+)(\d+)", last[0])
        prefix = m.group(1) if m else "DT"
        seq = int(m.group(2)) + 1 if m else 1
    else:
        prefix, seq = "DT", 1
    new_code = f"{prefix}{seq:03d}"

    c.execute("""
        INSERT INTO partners (code, name, tax_code, type, address, phone, email)
        VALUES (?, ?, ?, ?, ?, ?, ?)
    """, (new_code, name, tax_c, ptype, address, phone, email))
    conn.commit()
    conn.close()
    print(f"✅ Đã thêm đối tác: {new_code} — {name}")


# ─── Setup knowledge ───────────────────────────────────────

def cmd_setup_knowledge(args):
    import subprocess
    script = os.path.join(_ROOT, "db", "setup_knowledge_online.py")
    subprocess.run([sys.executable, script])


# ─── Ledger / Reports ──────────────────────────────────────

def cmd_trial_balance(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    year, month = _parse_period(args.month)
    from core.ledger import print_trial_balance
    print_trial_balance(db_path, year, month)


def cmd_ledger_card(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    year, month = _parse_period(args.month)
    from core.ledger import get_ledger_card
    from core.db_init import get_conn
    entries = get_ledger_card(db_path, args.account, year, month)
    conn = get_conn(db_path)
    acc = conn.execute("SELECT name FROM accounts WHERE code=?", (args.account,)).fetchone()
    conn.close()
    acc_name = acc[0] if acc else args.account
    print(f"\n─── Sổ Cái TK {args.account} — {acc_name} [{month:02d}/{year}] ───")
    print(f"{'Ngày':<12} {'Số CT':<14} {'Diễn giải':<40} {'Nợ':>14} {'Có':>14} {'Số dư':>14}")
    print("─"*110)
    for e in entries:
        print(f"{e['voucher_date']:<12} {(e['voucher_no'] or ''):<14} {(e.get('description') or '')[:40]:<40} {e['debit'] or 0:>14,.0f} {e['credit'] or 0:>14,.0f} {e.get('running_balance',0):>14,.0f}")


def cmd_report(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    year, month = _parse_period(args.month)
    out = args.out or os.path.join(_ROOT, "tmp")
    os.makedirs(out, exist_ok=True)
    company = get_company(code)
    cname = company.get("name", code) if company else code

    rtype = args.rtype
    if rtype in ("trial-balance", "bdsp", "all"):
        from core.reports.trial_balance import export_trial_balance
        p = os.path.join(out, f"BDSP_{code}_{year}{month:02d}.xlsx")
        export_trial_balance(db_path, year, month, cname, p)
    if rtype in ("ledger", "so-cai", "all"):
        from core.reports.trial_balance import export_ledger_card
        acc = getattr(args, "account", None)
        if acc:
            p = os.path.join(out, f"SoCai_{acc}_{year}{month:02d}.xlsx")
            export_ledger_card(db_path, acc, year, month, cname, p)
        else:
            print("❌ Sổ cái cần --account <mã TK>")


# ─── Batch Import ─────────────────────────────────────────

def cmd_import(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    if args.template_only:
        from core.batch_import import create_import_template
        out = os.path.join(_ROOT, "tmp", "import_template.xlsx")
        create_import_template(out)
        return
    if not args.file:
        print("❌ Cần --file <path.xlsx> hoặc --template-only"); return
    from core.batch_import import import_from_excel
    import_from_excel(db_path, args.file, dry_run=args.dry_run)


# ─── Recurring ────────────────────────────────────────────

def cmd_recurring(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    from core.recurring import list_recurring_templates, run_recurring

    if args.rsub == "list":
        rows = list_recurring_templates(db_path)
        if not rows:
            print("(Chưa có mẫu định kỳ nào)")
        for r in rows:
            status = "✅" if r["is_active"] else "⏹"
            last = f"{r['last_run_month']:02d}/{r['last_run_year']}" if r['last_run_year'] else "chưa chạy"
            print(f"  {status} #{r['id']}  [{r['frequency']:9}]  {r['name']:<35} last: {last}")

    elif args.rsub == "run":
        year, month = _parse_period(args.month)
        print(f"🔄 Chạy bút toán định kỳ {month:02d}/{year} ...")
        from core.recurring import run_recurring
        run_recurring(db_path, year, month,
                      template_id=getattr(args, "id", None))


# ─── Backup ───────────────────────────────────────────────

def cmd_backup(code: str, args):
    from core.backup import backup_company, list_backups, restore_backup

    if args.bsub == "run":
        backup_company(code.upper(), note=getattr(args, "note", ""))
    elif args.bsub == "list":
        rows = list_backups(code.upper())
        if not rows:
            print("(Chưa có backup)")
        for r in rows:
            print(f"  {r['created']}  {r['size_kb']:>7.1f} KB  {r['name']}")
    elif args.bsub == "restore":
        restore_backup(code.upper(), args.zip)


# ─── OCR ──────────────────────────────────────────────────

def cmd_ocr(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    from core.ocr import ocr_invoice, ocr_batch, print_ocr_result
    from core.journal import post_voucher

    results = []
    if args.file:
        r = ocr_invoice(args.file)
        print_ocr_result(r)
        results = [r]
    elif args.dir:
        results = ocr_batch(args.dir)
        for r in results:
            print_ocr_result(r)
    else:
        print("❌ Cần --file <ảnh> hoặc --dir <thư mục>"); return

    if args.auto_post:
        for r in results:
            if r.get("suggested_entries") and not r.get("error"):
                vid = post_voucher(
                    db_path,
                    voucher_type="HDMV" if r.get("invoice_side") == "purchase" else "HDXB",
                    voucher_date=r.get("invoice_date", ""),
                    description=f"OCR HĐ {r.get('invoice_no','')}",
                    entries=r["suggested_entries"],
                    notes=f"OCR từ: {os.path.basename(r.get('image_path',''))}",
                )
                print(f"  ✅ Đã ghi chứng từ #{vid}")


# ─── Audit ────────────────────────────────────────────────

def cmd_audit(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    from core.audit import print_audit_history
    print_audit_history(db_path,
                        table=getattr(args, "table", None),
                        record_id=getattr(args, "id", None))


# ─── Tax Report GTGT ──────────────────────────────────────

def cmd_tax_gtgt(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return

    from core.tax_report import run_tax_gtgt
    company = get_company(code)
    name = company.get("name", code) if company else code

    year, month = _parse_period(getattr(args, "month", ""))
    out_dir = getattr(args, "out", "") or None
    no_excel = getattr(args, "no_excel", False)

    run_tax_gtgt(
        db_path=db_path,
        year=year,
        month=month,
        out_dir=None if no_excel else (out_dir or "tmp"),
        company_name=name,
    )


# ─── BCTC ─────────────────────────────────────────────

def cmd_bctc(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    from core.reports.financial_statements import run_bctc
    company = get_company(code)
    name = company.get("name", code) if company else code
    year = int(getattr(args, "year", "") or __import__("datetime").date.today().year)
    out_dir = getattr(args, "out", "") or None
    run_bctc(db_path, year, out_dir=out_dir or "tmp", company_name=name)


# ─── Thuế TNDN ───────────────────────────────────────

def cmd_tndn(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    from core.tndn_report import run_tndn
    company = get_company(code)
    name = company.get("name", code) if company else code
    year = int(getattr(args, "year", "") or __import__("datetime").date.today().year)
    sme  = getattr(args, "sme", False)
    out_dir = getattr(args, "out", "") or "tmp"
    run_tndn(db_path, year, out_dir=out_dir, company_name=name, sme=sme)


# ─── Công nợ AR/AP ────────────────────────────────────

def cmd_cong_no(code: str, args):
    db_path = get_company_db_path(code)
    if not db_path:
        print(f"❌ Không tìm thấy công ty: {code}"); return
    from core.ar_ap import run_ar_ap
    company = get_company(code)
    name = company.get("name", code) if company else code
    out_dir = getattr(args, "out", "") or "tmp"
    run_ar_ap(db_path, out_dir=out_dir, company_name=name)


# ─── Deadline tracker ──────────────────────────────

def cmd_deadlines(args):
    from core.deadline_tracker import print_all_companies_deadlines
    year, month = _parse_period(getattr(args, "month", ""))
    print_all_companies_deadlines(year, month)


# ─── Helper ───────────────────────────────────────────────

def _parse_period(period_str: str) -> tuple:
    """Parse '2026-02' → (2026, 2)"""
    import datetime
    if not period_str:
        n = datetime.date.today()
        return n.year, n.month
    parts = period_str.split("-")
    return int(parts[0]), int(parts[1])


# ─── Main ──────────────────────────────────────────────────

def main():
    parser = argparse.ArgumentParser(
        description="🧾 Hệ thống kế toán multi-company v2.1",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
Ví dụ:
  python core/cli.py companies list
  python core/cli.py company CTY001 info
  python core/cli.py company CTY001 trial-balance --month 2026-02
  python core/cli.py company CTY001 ledger --account 111 --month 2026-02
  python core/cli.py company CTY001 report trial-balance --month 2026-02 --out tmp/
  python core/cli.py company CTY001 tax-gtgt --month 2026-02
  python core/cli.py company CTY001 tax-tndn --year 2026
  python core/cli.py company CTY001 bctc --year 2026
  python core/cli.py company CTY001 hkd --month 2026-02 --loai dich_vu
  python core/cli.py company CTY001 cong-no
  python core/cli.py deadlines --month 2026-02
  python core/cli.py company CTY001 import --file tmp/import.xlsx
  python core/cli.py company CTY001 import --template-only
  python core/cli.py company CTY001 recurring run --month 2026-02
  python core/cli.py company CTY001 ocr --dir tmp/hoadon/ --auto-post
  python core/cli.py company CTY001 audit
  python core/cli.py backup CTY001 run
        """
    )
    sub = parser.add_subparsers(dest="cmd")

    # ── companies ──
    p_co = sub.add_parser("companies", help="Quản lý danh sách công ty")
    sub_co = p_co.add_subparsers(dest="sub")
    sub_co.add_parser("list")
    p_new = sub_co.add_parser("new")
    p_new.add_argument("--name"); p_new.add_argument("--legal-name")
    p_new.add_argument("--tax"); p_new.add_argument("--type", default="TNHH")
    p_new.add_argument("--std", default="TT200", choices=["TT200","TT133"])
    p_new.add_argument("--vat-period", default="monthly")
    p_new.add_argument("--address", default="")
    p_new.add_argument("--phone", default=""); p_new.add_argument("--email", default="")

    # ── company <CODE> ──
    p_c = sub.add_parser("company", help="Thao tác với 1 công ty")
    p_c.add_argument("code")
    sub_c = p_c.add_subparsers(dest="sub")

    sub_c.add_parser("info")
    p_acc = sub_c.add_parser("accounts"); p_acc.add_argument("--search")
    p_srch = sub_c.add_parser("search"); p_srch.add_argument("query")
    p_srch.add_argument("--target", default="vouchers", choices=["vouchers","partners"])
    p_prt = sub_c.add_parser("partners")
    sub_prt = p_prt.add_subparsers(dest="psub")
    sub_prt.add_parser("list"); sub_prt.add_parser("add")

    # Ledger
    p_tb = sub_c.add_parser("trial-balance", help="Bảng CĐSP")
    p_tb.add_argument("--month", default="", help="2026-02")
    p_lg = sub_c.add_parser("ledger", help="Sổ cái 1 TK")
    p_lg.add_argument("--account", required=True); p_lg.add_argument("--month", default="")

    # Report
    p_rp = sub_c.add_parser("report", help="Xuất báo cáo xlsx")
    p_rp.add_argument("rtype", choices=["trial-balance","bdsp","ledger","so-cai","all"])
    p_rp.add_argument("--month", default=""); p_rp.add_argument("--account")
    p_rp.add_argument("--out", default="", help="Thư mục xuất file")

    # Import
    p_im = sub_c.add_parser("import", help="Import Excel chứng từ")
    p_im.add_argument("--file"); p_im.add_argument("--dry-run", action="store_true")
    p_im.add_argument("--template-only", action="store_true")

    # Recurring
    p_rc = sub_c.add_parser("recurring", help="Bút toán định kỳ")
    sub_rc = p_rc.add_subparsers(dest="rsub")
    sub_rc.add_parser("list")
    p_rcr = sub_rc.add_parser("run")
    p_rcr.add_argument("--month", default=""); p_rcr.add_argument("--id", type=int)

    # OCR
    p_ocr = sub_c.add_parser("ocr", help="OCR hóa đơn (PaddleOCR)")
    p_ocr.add_argument("--file"); p_ocr.add_argument("--dir")
    p_ocr.add_argument("--auto-post", action="store_true")

    # Audit
    p_au = sub_c.add_parser("audit", help="Xem audit log")
    p_au.add_argument("--table"); p_au.add_argument("--id", type=int)

    # Tax GTGT
    p_tax = sub_c.add_parser("tax-gtgt", help="Báo cáo thuế GTGT đầu vào/đầu ra")
    p_tax.add_argument("--month", default="", help="VD: 2026-02 (mặc định: tháng hiện tại)")
    p_tax.add_argument("--out", default="", help="Thư mục xuất Excel (mặc định: tmp/)")
    p_tax.add_argument("--no-excel", action="store_true", help="Chỉ in console, không xuất Excel")

    # BCTC
    p_bctc = sub_c.add_parser("bctc", help="Báo cáo tài chính (Bảng CĐKT + KQ HĐKD)")
    p_bctc.add_argument("--year", default="", help="Năm (VD: 2026)")
    p_bctc.add_argument("--out", default="", help="Thư mục xuất Excel")

    # Thuế TNDN
    p_tndn = sub_c.add_parser("tax-tndn", help="Tờ khai thuế TNDN (Mẫu 03/TNDN rút gọn)")
    p_tndn.add_argument("--year", default="", help="Năm quyết toán")
    p_tndn.add_argument("--sme", action="store_true", help="Thuế suất 17% (DN vừa và nhỏ)")
    p_tndn.add_argument("--out", default="")

    # Công nợ AR/AP
    p_cn = sub_c.add_parser("cong-no", help="Báo cáo công nợ phải thu/phải trả (Aging)")
    p_cn.add_argument("--out", default="")

    # Deadlines (top-level)
    p_dl = sub.add_parser("deadlines", help="Lịch hạn nộp thuế tất cả công ty")
    p_dl.add_argument("--month", default="", help="Tháng (VD: 2026-02)")

    # ── backup <CODE> ──
    p_bk = sub.add_parser("backup", help="Backup/restore database")
    p_bk.add_argument("code")
    sub_bk = p_bk.add_subparsers(dest="bsub")
    sub_bk.add_parser("list")
    p_bkr = sub_bk.add_parser("run"); p_bkr.add_argument("--note", default="")
    p_bkrs = sub_bk.add_parser("restore"); p_bkrs.add_argument("zip")

    # ── setup-knowledge ──
    sub.add_parser("setup-knowledge")

    args = parser.parse_args()

    if args.cmd == "companies":
        if args.sub == "list":    cmd_companies_list(args)
        elif args.sub == "new":   cmd_companies_new(args)
        else:                     p_co.print_help()

    elif args.cmd == "company":
        code = args.code.upper()
        s = args.sub
        if s == "info":            cmd_company_info(code, args)
        elif s == "accounts":      cmd_company_accounts(code, args)
        elif s == "search":        cmd_company_search(code, args)
        elif s == "partners":
            if args.psub == "list":   cmd_company_partners_list(code, args)
            elif args.psub == "add":  cmd_company_partners_add(code, args)
        elif s == "trial-balance": cmd_trial_balance(code, args)
        elif s == "ledger":        cmd_ledger_card(code, args)
        elif s == "report":        cmd_report(code, args)
        elif s == "import":        cmd_import(code, args)
        elif s == "recurring":     cmd_recurring(code, args)
        elif s == "ocr":           cmd_ocr(code, args)
        elif s == "audit":         cmd_audit(code, args)
        elif s == "tax-gtgt":      cmd_tax_gtgt(code, args)
        elif s == "bctc":          cmd_bctc(code, args)
        elif s == "tax-tndn":      cmd_tndn(code, args)
        elif s == "cong-no":       cmd_cong_no(code, args)
        else:                      p_c.print_help()

    elif args.cmd == "backup":
        cmd_backup(args.code, args)

    elif args.cmd == "deadlines":
        cmd_deadlines(args)

    elif args.cmd == "setup-knowledge":
        cmd_setup_knowledge(args)

    else:
        print("🧾 Hệ thống kế toán multi-company v2.1 + PaddleOCR")
        print("Dùng: python core/cli.py --help")
        print()
        print_companies_table()


if __name__ == "__main__":
    main()


