lib/requests/payments/payment/airline_data.ex

defmodule Requests.Payments.Payment.AirlineData do
  @moduledoc false
  alias Requests.Payments.Payment.FlightLegDetail

  @type passenger :: %{
          name: %{full_name: String.t()},
          date_of_birth: String.t(),
          country_code: <<_::2>>
        }

  @type ticket :: %{
          number: String.t(),
          issue_date: String.t(),
          issuing_carrier_code: String.t(),
          travel_agency_name: String.t(),
          travel_agency_code: String.t()
        }

  @type t() :: %{
          ticket: ticket(),
          passenger: passenger(),
          flight_leg_details: FlightLegDetail.t()
        }

  @enforce_keys [:ticket, :passenger, :flight_leg_details]

  defstruct [
    :ticket,
    :passenger,
    :flight_leg_details
  ]

  def build(params) when is_map(params) do
    %{
      ticket: build_ticket(params[:ticket]),
      passenger: build_passenger(params[:passenger]),
      flight_leg_details: FlightLegDetail.build(params[:flight_leg_details])
    }
  end

  def build(_), do: nil

  defp build_passenger(params) when is_map(params) do
    %{
      name: %{full_name: params[:name][:full_name]},
      date_of_birth: params[:date_of_birth],
      country_code: params[:country_code]
    }
  end

  defp build_passenger(_), do: nil

  defp build_ticket(params) when is_map(params) do
    %{
      number: params[:number],
      issue_date: params[:issue_date],
      issuing_carrier_code: params[:issuing_carrier_code],
      travel_agency_name: params[:travel_agency_name],
      travel_agency_code: params[:travel_agency_code]
    }
  end

  defp build_ticket(_), do: nil
end