class Account < Ohm::Model
  attr_accessor :password, :password_confirmation

  # Keys
  attribute :name
  attribute :surname
  attribute :email
  attribute :crypted_password
  attribute :role

  index  :email
  unique :email

  # Validations
  def validate
    assert_present  :email
    assert_present  :role
    if password_required
      assert_present :password
      assert_present :password_confirmation
      assert_length  :password, 4..40
      assert self.password == self.password_confirmation, [:password_not_confirmed]
    end
    assert_email :email
    assert_format :role, /[A-Za-z]/
  end

  # Callbacks
  def save!
    encrypt_password
    super
  end

  ##
  # This method is for authentication purpose.
  #
  def self.authenticate(email, password)
    account = with(:email, email) if email.present?
    account if account&.has_password?(password)
  end

  ##
  # This method is used by AuthenticationHelper.
  #
  def self.find_by_id(id)
    self[id]
  end

  ##
  # This method is used by Admin Sessions Controller for login bypass.
  #
  def self.first
    first_id = key[:all].sort(order: "asc", limit: [0, 1]).first
    self[first_id] if first_id
  end

  def has_password?(password)
    ::BCrypt::Password.new(crypted_password) == password
  end

  private

  def encrypt_password
    self.crypted_password = ::BCrypt::Password.create(password)  if password_required
  end

  def password_required
    crypted_password.blank? || password.present?
  end
end
