class PembayaranProcessService:
    def __init__(self, split_service, state_service):
        self.split_service = split_service
        self.state_service = state_service

    def process(
        self,
        mode,
        diskon_value,
        read_amounts,
        verify_admin,
        ask_confirm,
        show_warning,
        format_rupiah,
        create_payment_result,
        get_payment_result,
        prepare_split_payment_ui,
    ):
        if int(diskon_value or 0) > 0:
            if self.state_service.should_verify_diskon_admin(diskon_value):
                if not verify_admin():
                    return {"status": "blocked", "result": None}
                self.state_service.mark_diskon_admin_verified(diskon_value)

        jumlah_dibayar, total_dibayar = read_amounts(mode)
        if jumlah_dibayar < total_dibayar:
            metode_text = self.split_service.get_mode_name(mode)
            if ask_confirm(
                "Pembayaran Kurang",
                f"Pembayaran {metode_text} kurang {format_rupiah(total_dibayar - jumlah_dibayar)}.\n"
                "Apakah Anda ingin membayar sisanya dengan metode lain?",
            ):
                current_payment = create_payment_result()
                if self.split_service.add_partial_payment(current_payment, total_dibayar, jumlah_dibayar):
                    prepare_split_payment_ui()
                    return {"status": "partial", "result": None}
            else:
                show_warning(
                    "Pembayaran Tidak Cukup",
                    f"Pembayaran {metode_text} tidak boleh kurang dari total yang harus dibayar.\n\n"
                    f"Total: {format_rupiah(total_dibayar)}\n"
                    f"Dibayar: {format_rupiah(jumlah_dibayar)}\n"
                    f"Kurang: {format_rupiah(total_dibayar - jumlah_dibayar)}",
                )
                return {"status": "blocked", "result": None}

        result = get_payment_result()
        if result:
            return {"status": "ok", "result": self.split_service.merge_final_result(result)}
        return {"status": "invalid", "result": None}
