module Fundraising
  class DonationsController < ApplicationController
    def create
      @campaign = Campaign.current
      begin
        @donation = Donation.create_from_charge(
          @campaign, current_user, params[:donation])
      rescue Stripe::CardError => e
        flash[:alert] = "We couldn't process your donation: #{e.message}"
        redirect_to :donate
      rescue => e
        flash[:alert] =
          "We couldn't process your donation: #{e.message} " +
          "Please try again later!"
        redirect_to :donate
      else
        redirect_to @donation
      end
    end

    def show
      @donation = Donation.from_param(params[:id])
      @features = @donation.features
      @outfits = current_user.outfits.wardrobe_order if user_signed_in?
    end

    def update
      @donation = Donation.from_param(params[:id])
      @donation.attributes = donation_params

      feature_params = params[:feature] || {}
      @features = @donation.features.find(feature_params.keys)
      @features.each do |feature|
        feature.outfit_url = feature_params[feature.id.to_s][:outfit_url]
      end

      begin
        Donation.transaction do
          @donation.save!
          @features.each(&:save!)
        end
      rescue ActiveRecord::RecordInvalid
        flash[:alert] = "Couldn't save donation details. Do those outfits exist?"
        redirect_to @donation
      else
        flash[:notice] = 'Donation details saved! ' +
          'Also, have we thanked you yet today? Thank you!'
        redirect_to @donation
      end
    end

    private

    def donation_params
      params.require(:donation).permit(:donor_name)
    end
  end
end