# frozen_string_literal: true

class Users::RegistrationsController < Devise::RegistrationsController
  include ProcedureContextConcern

  # before_action :configure_sign_up_params, only: [:create]
  # before_action :configure_account_update_params, only: [:update]
  before_action :restore_procedure_context, only: [:new, :create]

  layout 'login', only: [:new, :create]

  # GET /resource/sign_up
  def new
    # Allow pre-filling the user email from a query parameter
    build_resource({ email: sign_up_params[:email] })

    if block_given?
      yield resource
    end

    respond_with resource
  end

  # POST /resource
  def create
    # We may need the confirmation mailer to access the current procedure.
    # But there's no easy way to pass an argument to the mailer through
    # all Devise code.
    # So instead we use a per-request global variable.
    CurrentConfirmation.procedure_after_confirmation = @procedure
    CurrentConfirmation.prefill_token = @prefill_token

    # Handle existing user trying to sign up again
    existing_user = User.find_by(user_email_params)
    if existing_user.present?
      if existing_user.confirmed?
        UserMailer.new_account_warning(existing_user, @procedure).deliver_later
      else
        existing_user.resend_confirmation_instructions
      end
      return redirect_to after_inactive_sign_up_path_for(existing_user)
    end

    super do
      resource.update_preferred_domain(Current.host) if resource.valid? && helpers.switch_domain_enabled?(request)
    end
  end

  # GET /resource/edit
  # def edit
  #   super
  # end

  # PUT /resource
  # def update
  #   super
  # end

  # DELETE /resource
  # def destroy
  #   super
  # end

  # GET /resource/cancel
  # Forces the session data which is usually expired after sign
  # in to be expired now. This is useful if the user wants to
  # cancel oauth signing in/up in the middle of the process,
  # removing all OAuth session data.
  # def cancel
  #   super
  # end

  # protected

  # You can put the params you want to permit in the empty array.
  # def configure_sign_up_params
  #   devise_parameter_sanitizer.for(:sign_up) << :attribute
  # end

  # You can put the params you want to permit in the empty array.
  # def configure_account_update_params
  #   devise_parameter_sanitizer.for(:account_update) << :attribute
  # end

  # The path used after sign up.
  # def after_sign_up_path_for(resource)
  #   super(resource)
  # end

  # The path used after sign up for inactive accounts.
  def after_inactive_sign_up_path_for(resource)
    flash.discard(:notice) # Remove devise's default message (as we have a custom page to explain it)
    new_confirmation_path(resource, :user => { email: resource.email })
  end

  private

  def user_email_params
    params.require(:user).permit(:email)
  end
end
