module ProcedureContextConcern
  extend ActiveSupport::Concern

  include Devise::Controllers::StoreLocation
  include Devise::StoreLocationExtension

  def restore_procedure_context
    if has_stored_procedure_path?
      @procedure = find_procedure_in_context

      if @procedure.blank?
        invalid_procedure_context
      end
    end
  end

  private

  def has_stored_procedure_path?
    get_stored_location_for(:user)&.start_with?('/commencer/')
  end

  def find_procedure_in_context
    uri = URI(get_stored_location_for(:user))
    path_components = uri.path.split('/')

    if uri.path.start_with?('/commencer/test/')
      Procedure.brouillon.find_by(path: path_components[3])
    elsif uri.path.start_with?('/commencer/')
      Procedure.publiee.find_by(path: path_components[2])
    else
      nil
    end
  end

  def invalid_procedure_context
    clear_stored_location_for(:user)
    flash.alert = t('errors.messages.procedure_not_found')
    redirect_to root_path
  end
end