# frozen_string_literal: true

class Users::ConfirmationsController < Devise::ConfirmationsController
  # GET /resource/confirmation/new
  def new
    # Allow displaying the user email in the message
    self.resource = resource_class.new(email: user_email_param)
  end

  # POST /resource/confirmation
  # def create
  #   super
  # end

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    super do
      # When email was already confirmed, default is to render :new with a specific error.
      # Because our :new is customized with the email and a form to resend a confirmation,
      # we redirect to after confirmation page instead.
      if resource.errors.of_kind?(:email, :already_confirmed)
        respond_with_navigational(resource) do
          flash.notice = t('.email_already_confirmed')
          redirect_to after_confirmation_path_for(resource_name, resource) and return
        end
      end
    end
  end

  # protected

  def user_email_param
    params.permit(user: :email).dig(:user, :email)
  end

  # The path used after resending confirmation instructions.
  # def after_resending_confirmation_instructions_path_for(resource_name)
  #   super(resource_name)
  # end

  # If the user clicks the confirmation link before the maximum delay,
  # they will be signed in directly.
  def sign_in_after_confirmation?(resource)
    # Avoid keeping auto-sign-in links in users inboxes for too long.
    # 95% of users confirm their account within two hours.
    auto_sign_in_timeout = 2.hours
    resource.confirmation_sent_at + auto_sign_in_timeout > Time.zone.now
  end

  # The path used after confirmation.
  def after_confirmation_path_for(resource_name, resource)
    if sign_in_after_confirmation?(resource)
      resource.remember_me = true
      sign_in(resource)
    end

    if procedure_from_params
      commencer_path(path: procedure_from_params.path, prefill_token: params[:prefill_token])
    elsif signed_in?
      # Will try to use `stored_location_for` to find a path
      after_sign_in_path_for(resource_name)
    else
      super(resource_name, resource)
    end
  end

  def procedure_from_params
    params[:procedure_id] && Procedure.find_by(id: params[:procedure_id])
  end
end
