# frozen_string_literal: true

class UserSecurityKey < ActiveRecord::Base
  belongs_to :user
  MAX_KEYS_PER_USER = 50
  MAX_NAME_LENGTH = 300

  scope :second_factors,
        -> { where(factor_type: UserSecurityKey.factor_types[:second_factor], enabled: true) }

  validates :name, length: { maximum: MAX_NAME_LENGTH }, if: :name_changed?
  validate :count_per_user_does_not_exceed_limit, on: :create

  def self.factor_types
    @factor_types ||= Enum.new(second_factor: 0, first_factor: 1, multi_factor: 2)
  end

  private

  def count_per_user_does_not_exceed_limit
    if UserSecurityKey.where(user_id: self.user_id).count >= MAX_KEYS_PER_USER
      errors.add(:base, I18n.t("login.too_many_security_keys"))
    end
  end
end

# == Schema Information
#
# Table name: user_security_keys
#
#  id            :bigint           not null, primary key
#  user_id       :bigint           not null
#  credential_id :string           not null
#  public_key    :string           not null
#  factor_type   :integer          default(0), not null
#  enabled       :boolean          default(TRUE), not null
#  name          :string(300)      not null
#  last_used     :datetime
#  created_at    :datetime         not null
#  updated_at    :datetime         not null
#
# Indexes
#
#  index_user_security_keys_on_credential_id            (credential_id) UNIQUE
#  index_user_security_keys_on_factor_type              (factor_type)
#  index_user_security_keys_on_factor_type_and_enabled  (factor_type,enabled)
#  index_user_security_keys_on_last_used                (last_used)
#  index_user_security_keys_on_public_key               (public_key)
#  index_user_security_keys_on_user_id                  (user_id)
#
# Foreign Keys
#
#  fk_rails_...  (user_id => users.id)
#