# edited by glg
import importlib.util
import sys
from pathlib import Path


def _load_reconciliation_job_module():
    repo_root = Path(__file__).resolve().parents[1]
    module_path = repo_root / "scripts" / "ops" / "run_penjualan_reconciliation_job.py"
    spec = importlib.util.spec_from_file_location("run_penjualan_reconciliation_job", module_path)
    module = importlib.util.module_from_spec(spec)
    assert spec and spec.loader
    spec.loader.exec_module(module)
    return module


def test_main_meneruskan_retention_policy_ke_service(monkeypatch, tmp_path):
    module = _load_reconciliation_job_module()
    captured = {}

    class _ServiceStub:
        def __init__(self, db_path, stale_inprogress_seconds):
            captured["db_path"] = str(db_path)
            captured["stale_inprogress_seconds"] = int(stale_inprogress_seconds)

        def run_reconciliation(self, retention_policy=None):
            captured["retention_policy"] = retention_policy if isinstance(retention_policy, dict) else {}
            return {"outbox_dead": 0}

    monkeypatch.setattr(module, "TransaksiEnterpriseControlService", _ServiceStub)
    monkeypatch.setattr(module, "get_db_path", lambda: str(tmp_path / "fallback.db"))
    monkeypatch.setattr(
        sys,
        "argv",
        [
            "run_penjualan_reconciliation_job.py",
            "--db-path",
            str(tmp_path / "pos.db"),
            "--stale-inprogress-seconds",
            "120",
            "--run-retention",
            "1",
            "--retention-idempotency-days",
            "10",
            "--retention-audit-days",
            "20",
            "--retention-approval-days",
            "30",
            "--retention-outbox-days",
            "40",
            "--retention-limit",
            "50",
        ],
    )

    exit_code = module.main()

    assert int(exit_code) == 0
    assert str(captured.get("db_path")) == str(tmp_path / "pos.db")
    assert int(captured.get("stale_inprogress_seconds") or 0) == 120
    policy = captured.get("retention_policy") or {}
    assert bool(policy.get("enabled")) is True
    assert int(policy.get("idempotency_days") or 0) == 10
    assert int(policy.get("audit_days") or 0) == 20
    assert int(policy.get("approval_days") or 0) == 30
    assert int(policy.get("outbox_days") or 0) == 40
    assert int(policy.get("limit") or 0) == 50


def test_main_fail_on_dead_mengembalikan_exit_code_2(monkeypatch, tmp_path):
    module = _load_reconciliation_job_module()

    class _ServiceStub:
        def __init__(self, db_path, stale_inprogress_seconds):
            _ = db_path
            _ = stale_inprogress_seconds

        def run_reconciliation(self, retention_policy=None):
            _ = retention_policy
            return {"outbox_dead": 2}

    monkeypatch.setattr(module, "TransaksiEnterpriseControlService", _ServiceStub)
    monkeypatch.setattr(module, "get_db_path", lambda: str(tmp_path / "fallback.db"))
    monkeypatch.setattr(
        sys,
        "argv",
        [
            "run_penjualan_reconciliation_job.py",
            "--fail-on-dead",
            "1",
        ],
    )

    exit_code = module.main()
    assert int(exit_code) == 2
