# frozen_string_literal: true

class UserConfirmationsController < DeviseController
  # Needed for access to current_ability, so we can authorize! actions
  include Spree::Core::ControllerHelpers::Auth

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource) }
  end

  # GET /resource/confirmation/new
  def new
    build_resource({})
  end

  # POST /resource/confirmation
  def create
    set_return_url if params.key? :return_url
    self.resource = resource_class.send_confirmation_instructions(resource_params)

    if is_navigational_format?
      if successfully_sent?(resource)
        set_flash_message(:success, :confirmation_sent)
      else
        set_flash_message(:error, :confirmation_not_sent)
      end
    else
      flash.now[:sucess] = t("devise.confirmations.send_instructions")

      return render turbo_stream: turbo_stream.update(
        "#{params[:tab] || 'forgot'}-feedback",
        partial: 'shared/flashes', locals: { flashes: flash }
      )
    end

    respond_with_navigational(resource){ redirect_to login_path }
  end

  protected

  def set_return_url
    session[:confirmation_return_url] = params[:return_url]
  end

  def after_confirmation_path_for(resource)
    result = resource.errors.empty? ? "confirmed" : "not_confirmed"

    if result == 'confirmed' && resource.reset_password_token.present?
      return spree.edit_spree_user_password_path(
        reset_password_token: resource.regenerate_reset_password_token
      )
    end

    path = session[:confirmation_return_url] || root_path(anchor: "/login")
    append_query_to_url(path, "validation", result)
  end

  private

  def append_query_to_url(url, key, value)
    uri = URI.parse(url.to_s)
    query = URI.decode_www_form(uri.query || "") << [key, value]
    uri.query = URI.encode_www_form(query)

    uri.to_s
  end
end
