class Admin::Threoze::Payjunction::VaultsController < Admin::Controller
  def show
    render_success :ok, json: vault_props
  end

  def create
    if vault_service[:errors]
      render_error :unprocessable_entity, errors: vault_service[:errors]
    else
      render_success :ok, json: vault_props
    end
  end

  def update
    if vault_service[:errors]
      render_error :unprocessable_entity, errors: vault_service[:errors]
    else
      render_success :ok, json: vault_props
    end
  end

  def destroy
    if vault_service[:success]
      render_success :ok
    else
      render_error :unprocessable_entity, errors: vault_service[:errors]
    end
  end

  private
    def vault_service
      @vault_service ||= Threoze::Payjunction::VaultService
        .call(current_school, action_name.to_sym, params)
    end

    def vault_props
      {}.tap do |props|
        props[:vault_id] = vault_service[:vaultId]
        return props if vault_service.blank?

        props[:name] = vault_service[:name]
        props[:payment_method] = vault_service[:type]
        props[:last_four] = vault_service[:lastFour]
        props[:card_type] = card_type

        if vault_service[:type] == 'CARD'
          props[:expiration_month] = vault_service[:cardExpMonth]
          props[:expiration_year] = vault_service[:cardExpYear]
        else
          props[:ach_type] = vault_service[:achType]
          props[:account_type] = vault_service[:accountType]
        end

        return props unless vault_service[:address]

        props[:address] = vault_service[:address][:address]
        props[:city] = vault_service[:address][:city]
        props[:state] = vault_service[:address][:state]
        props[:zip] = vault_service[:address][:zip]
      end
    end

    def card_type
      case vault_service[:accountType].downcase.to_sym
      when :american_express
        :amex
      when :visa, :mastercard, :discover
        vault_service[:accountType].downcase
      else
        :other
      end
    end
end
