# edited by glg
class TransaksiPersistUiUseCaseService:
    """
    Use-case adapter untuk memisahkan orkestrasi persist dari controller UI.
    """

    @staticmethod
    def execute(
        *,
        persist_service,
        transaksi_data,
        detail_data,
        transaksi_data_dict,
        metode_text,
        audit_message,
        voucher_callback=None,
    ):
        _ = metode_text
        result = persist_service.persist(
            transaksi_data=transaksi_data,
            detail_data=detail_data,
            transaksi_data_dict=transaksi_data_dict,
            audit_message=audit_message,
            voucher_callback=voucher_callback,
        )
        return result if isinstance(result, dict) else {"ok": False, "error": {}}

    @staticmethod
    def normalize_error_payload(result):
        data = result if isinstance(result, dict) else {}
        err = data.get("error") if isinstance(data.get("error"), dict) else {}
        return {
            "error_code": str(err.get("error_code") or "TRX_SAVE_CONTROLLER_ERROR"),
            "error_message": str(err.get("message") or "Gagal menyimpan transaksi.").strip(),
            "reason": str(err.get("reason") or "transaksi_save_error").strip() or "transaksi_save_error",
            "trace_id": str(err.get("trace_id") or "").strip(),
            "raw_error": str(err.get("error") or "").strip(),
        }

    @staticmethod
    def normalize_success_payload(result):
        data = result if isinstance(result, dict) else {}
        return {
            "transaksi_id": int(data.get("transaksi_id") or 0),
            "arr_free_produk": list(data.get("arr_free_produk") or []),
            "free_items_summary": list(data.get("free_items_summary") or []),
            "trace_id": str(data.get("trace_id") or "").strip(),
            "idempotent_replay": bool(data.get("idempotent_replay")),
        }
