use crate::client::Client;
use crate::envelope::{Acknowledgement, ApiResponse, StatusResponse};
use crate::error::Result;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateWalletWithBvnRequest {
pub phone_number: String,
pub email: String,
pub bvn: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateWalletWithNinRequest {
pub phone_number: String,
pub email: String,
pub nin: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ValidateOtpRequest {
pub phone_number: String,
pub otp: String,
pub tracking_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ResendOtpRequest {
pub tracking_id: String,
pub phone_number: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DebitRestrictionRequest {
pub pnd_type: String,
pub account_number: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PartnershipAccountDetails {
pub account_number: String,
pub first_name: String,
pub last_name: String,
pub email: String,
pub phone_number: String,
}
impl Client {
pub async fn create_wallet_with_bvn(
&self,
request: &CreateWalletWithBvnRequest,
) -> Result<Acknowledgement> {
self.post_json::<_, StatusResponse>(
"account-creation/api/CustomerAccount/PostPartnershipAccountCreationWithBvn",
request,
&[],
)
.await?
.into_result()
}
pub async fn validate_bvn_otp(&self, request: &ValidateOtpRequest) -> Result<Acknowledgement> {
self.post_json::<_, StatusResponse>(
"account-creation/api/CustomerAccount/ValidateBVNandEnqueueAccountCreation",
request,
&[],
)
.await?
.into_result()
}
pub async fn resend_bvn_otp(&self, request: &ResendOtpRequest) -> Result<Acknowledgement> {
self.post_json::<_, StatusResponse>(
"account-creation/api/CustomerAccount/ResendOtpRequest/ResendOtp",
request,
&[],
)
.await?
.into_result()
}
pub async fn get_bvn_partnership_account_details(
&self,
phone_number: &str,
) -> Result<PartnershipAccountDetails> {
self.get_json::<ApiResponse<PartnershipAccountDetails>>(
"account-creation/api/CustomerAccount/GetPartnershipAccountDetails",
&[("phoneNumber", phone_number)],
&[],
)
.await?
.into_result()
}
pub async fn set_bvn_debit_restriction(
&self,
request: &DebitRestrictionRequest,
) -> Result<Acknowledgement> {
self.post_json::<_, StatusResponse>(
"account-creation/api/CustomerAccount/PartnerDebitRestrictionManagement",
request,
&[],
)
.await?
.into_result()
}
pub async fn create_wallet_with_nin(
&self,
request: &CreateWalletWithNinRequest,
) -> Result<Acknowledgement> {
self.post_json::<_, StatusResponse>(
"wallet-creation/api/CustomerAccount/GenerateWalletAccountForPartnerships/Request",
request,
&[],
)
.await?
.into_result()
}
pub async fn validate_nin_otp(&self, request: &ValidateOtpRequest) -> Result<Acknowledgement> {
self.post_json::<_, StatusResponse>(
"wallet-creation/api/CustomerAccount/GenerateWalletAccountForPartnershipsV2/Otp",
request,
&[],
)
.await?
.into_result()
}
pub async fn resend_nin_otp(&self, request: &ResendOtpRequest) -> Result<Acknowledgement> {
self.post_json::<_, StatusResponse>(
"wallet-creation/api/CustomerAccount/ResendOtpRequest/ResendOtp",
request,
&[],
)
.await?
.into_result()
}
pub async fn get_nin_partnership_account_details(
&self,
phone_number: &str,
) -> Result<PartnershipAccountDetails> {
self.get_json::<ApiResponse<PartnershipAccountDetails>>(
"wallet-creation/api/CustomerAccount/GetPartnershipAccountDetails",
&[("phoneNumber", phone_number)],
&[],
)
.await?
.into_result()
}
pub async fn set_nin_debit_restriction(
&self,
request: &DebitRestrictionRequest,
) -> Result<Acknowledgement> {
self.post_json::<_, StatusResponse>(
"wallet-creation/api/CustomerAccount/PartnerDebitRestrictionManagement",
request,
&[],
)
.await?
.into_result()
}
}