# edited by glg
import argparse
import json

from pypos.core.utils.path_utils import get_db_path
from pypos.modules.penjualan.services.transaksi_enterprise_control_service import (
    TransaksiEnterpriseControlService,
)


def parse_args():
    parser = argparse.ArgumentParser(description="Jalankan reconciliation job modul penjualan.")
    parser.add_argument("--db-path", default="", help="Path database sqlite POS.")
    parser.add_argument(
        "--stale-inprogress-seconds",
        type=int,
        default=300,
        help="Ambang stale idempotency IN_PROGRESS (detik).",
    )
    parser.add_argument(
        "--fail-on-dead",
        type=int,
        default=1,
        help="Exit code non-zero jika outbox DEAD > 0 (1=aktif, 0=nonaktif).",
    )
    parser.add_argument(
        "--run-retention",
        type=int,
        default=0,
        help="Jalankan purge retensi idempotency/audit/outbox (1=aktif, 0=nonaktif).",
    )
    parser.add_argument(
        "--retention-idempotency-days",
        type=int,
        default=30,
        help="Retensi hari untuk tabel transaksi_idempotency.",
    )
    parser.add_argument(
        "--retention-audit-days",
        type=int,
        default=90,
        help="Retensi hari untuk tabel transaksi_persist_audit.",
    )
    parser.add_argument(
        "--retention-approval-days",
        type=int,
        default=90,
        help="Retensi hari untuk tabel transaksi_approval_trail.",
    )
    parser.add_argument(
        "--retention-outbox-days",
        type=int,
        default=30,
        help="Retensi hari untuk row terminal outbox free produk.",
    )
    parser.add_argument(
        "--retention-limit",
        type=int,
        default=500,
        help="Batas row purge per tabel setiap eksekusi job.",
    )
    return parser.parse_args()


def main():
    args = parse_args()
    db_path = str(args.db_path or "").strip() or get_db_path()
    service = TransaksiEnterpriseControlService(
        db_path=db_path,
        stale_inprogress_seconds=max(60, int(args.stale_inprogress_seconds or 60)),
    )
    retention_policy = {
        "enabled": int(args.run_retention or 0) == 1,
        "idempotency_days": max(1, int(args.retention_idempotency_days or 1)),
        "audit_days": max(1, int(args.retention_audit_days or 1)),
        "approval_days": max(1, int(args.retention_approval_days or 1)),
        "outbox_days": max(1, int(args.retention_outbox_days or 1)),
        "limit": max(1, int(args.retention_limit or 1)),
    }
    summary = service.run_reconciliation(retention_policy=retention_policy)
    print(json.dumps(summary, ensure_ascii=False, sort_keys=True))
    fail_on_dead = int(args.fail_on_dead or 0) == 1
    if fail_on_dead and int(summary.get("outbox_dead") or 0) > 0:
        return 2
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
