lib/ibanity/api/xs2a/periodic_payment_initiation_request.ex

defmodule Ibanity.Xs2a.PeriodicPaymentInitiationRequest do
  @moduledoc """
  [Payment initiation requests](https://documentation.ibanity.com/xs2a/api#payment-initiation-request) API wrapper
  """

  use Ibanity.Resource

  @api_schema_path ~w(xs2a customer financialInstitution periodicPaymentInitiationRequests)
  @resource_type "periodic_payment_initiation_request"

  defstruct id: nil,
            status: nil,
            status_reason: nil,
            remittance_information_type: nil,
            remittance_information: nil,
            product_type: nil,
            end_to_end_id: nil,
            debtor_name: nil,
            debtor_account_reference_type: nil,
            debtor_account_reference: nil,
            currency: nil,
            creditor_name: nil,
            creditor_agent_type: nil,
            creditor_agent: nil,
            creditor_account_reference_type: nil,
            creditor_account_reference: nil,
            consent_reference: nil,
            amount: nil,
            redirect_link: nil,
            financial_institution_id: nil,
            start_date: nil,
            end_date: nil,
            execution_rule: nil,
            frequency: nil,
            skip_ibanity_completion_callback: false,
            allow_financial_institution_redirect_uri: false

  @doc false
  def key_mapping do
    [
      id: {~w(id), :string},
      status: {~w(attributes status), :string},
      status_reason: {~w(attributes status_reason), :string},
      remittance_information_type: {~w(attributes remittanceInformationType), :string},
      remittance_information: {~w(attributes remittanceInformation), :string},
      product_type: {~w(attributes productType), :string},
      end_to_end_id: {~w(attributes endToEndId), :string},
      debtor_name: {~w(attributes debtorName), :string},
      debtor_account_reference_type: {~w(attributes debtorAccountReferenceType), :string},
      debtor_account_reference: {~w(attributes debtorAccountReference), :string},
      currency: {~w(attributes currency), :string},
      creditor_name: {~w(attributes creditorName), :string},
      creditor_agent_type: {~w(attributes creditorAgentType), :string},
      creditor_agent: {~w(attributes creditorAgent), :string},
      creditor_account_reference_type: {~w(attributes creditorAccountReferenceType), :string},
      creditor_account_reference: {~w(attributes creditorAccountReference), :string},
      consent_reference: {~w(attributes consentReference), :string},
      amount: {~w(attributes amount), :float},
      redirect_link: {~w(links redirect), :string},
      financial_institution_id: {~w(relationships financialInstitution data id), :string},
      frequency: {~w(attributes frequency), :string},
      start_date: {~w(attributes startDate), :date},
      end_date: {~w(attributes endDate), :date},
      execution_rule: {~w(attributes executionRule), :string},
      skip_ibanity_completion_callback: {~w(attributes skipIbanityCompletionCallback), :boolean},
      allow_financial_institution_redirect_uri:  {~w(attributes allowFinancialInstitutionRedirectUri), :boolean}
    ]
  end

  @doc """
  Convenience function for creating a payment initiation request for a financial institution.

  Returns `{:ok, payment_initiation_request}` if successful, `{:error, reason}` otherwise.

  See `create/1`
  """
  def create(%Request{} = request, financial_institution_id) do
    request
    |> Request.resource_type(@resource_type)
    |> Request.id(:financial_institution_id, financial_institution_id)
    |> create
  end

  @doc """
  [Creates a payment initiation request](https://documentation.ibanity.com/xs2a/api#create-payment-initiation-request) for a financial institution.

  Returns `{:ok, payment_initiation_request}` if successful, `{:error, reason}` otherwise.

  ## Example

      iex> [
      ...>   redirect_uri: "https://fake-tpp.com/payment-initiated",
      ...>   consent_reference: "b57cca6b-74d6-4ac8-ba5d-4e28160d8dde",
      ...>   ...
      ...> ]
      ...> |> Request.attributes
      ...> |> Request.id(:financial_institution_id, "b2c76f6b-ab34-4843-8ef3-84300ef98a09")
      ...> |> PeriodicPaymentInitiationRequest.create
      {:ok, %Ibanity.PeriodicPaymentInitiationRequest{id: "270141aa-0c93-42a5-9adf-e2b9a8ab4cea"}}
  """
  def create(%Request{} = request) do
    request
    |> Request.id(:id, "")
    |> Request.resource_type(@resource_type)
    |> Client.execute(:post, @api_schema_path)
  end

  @doc """
  [Retrieves a payment initiation request](https://documentation.ibanity.com/xs2a/api#get-payment-initiation-request)
  based on its id and the id of the financial institution.

  See `find/1`
  """
  def find(%Request{} = request, financial_institution_id, initiation_request_id) do
    request
    |> Request.id(:id, financial_institution_id)
    |> Request.id(:payment_initiation_request_id, initiation_request_id)
    |> find
  end

  @doc """
  [Retrieves a payment initiation request](https://documentation.ibanity.com/xs2a/api#get-payment-initiation-request)
  based on its id and the id of the financial institution.

  Returns `{:ok, payment_initiation_request}` if successful, `{:error, reason}` otherwise.

  ## Example

      iex> Request.id(:financial_institution_id, "b2c76f6b-ab34-4843-8ef3-84300ef98a09")
      ...> |> Request.id(:id, "270141aa-0c93-42a5-9adf-e2b9a8ab4cea")
      ...> |> PeriodicPaymentInitiationRequest.find
      {:ok, %Ibanity.Xs2a.PeriodicPaymentInitiationRequest{id: "270141aa-0c93-42a5-9adf-e2b9a8ab4cea"}}
  """
  def find(%Request{} = request) do
    request
    |> Client.execute(:get, @api_schema_path)
  end

  def delete(%Request{} = request) do
    request
    |> Client.execute(:delete, @api_schema_path)
  end
end