class Support::User < ApplicationRecord
  has_secure_password

  include Personable
  include Validatable

  has_many :tokens, dependent: :destroy
  has_many :user_tokens, dependent: :destroy, class_name: '::Token', foreign_key: :support_user_id,
    inverse_of: :support_user
  has_one :permission, dependent: :destroy

  before_validation -> { self.username = username.gsub(/\s/, '') }, if: :username_changed?

  validates :username, :first_name, :last_name, :email, presence: true
  validates :password, confirmation: { case_sensitive: true }, length: { minimum: 14, maximum: 60 },
    if: :password_digest_changed?
  validates :username, :email, uniqueness: { case_sensitive: true }
  validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }

  before_save :set_password_changed_at, if: :password_digest_changed?

  scope :ordered, -> { order(:last_name, :first_name) }
  scope :active, ->(flag) { where(active: true) if flag }

  scope :by_login_access_permission, -> do
    joins(:permission).merge(Support::Permission.by_login_access)
  end

  def has_permissions?(area, permissions)
    permissions.include?(permission[area])
  end

  private
    def set_password_changed_at
      self.password_changed_at = Time.current
    end
end
