class Verification::Letter
  include ActiveModel::Model

  attr_accessor :user, :verification_code, :email, :password, :verify

  validate :validate_existing_user

  validates :email, presence: true, if: :verify?
  validates :password, presence: true, if: :verify?
  validates :verification_code, presence: true, if: :verify?

  validate :validate_correct_code, if: :verify?

  def save
    valid? && letter_requested!
  end

  def save!
    validate! && save
  end

  def letter_requested!
    user.update(letter_requested_at: Time.current, letter_verification_code: generate_verification_code)
  end

  def validate_existing_user
    unless user
      errors.add(:email, I18n.t("devise.failure.invalid", authentication_keys: "email"))
    end
  end

  def validate_correct_code
    return if errors.include?(:verification_code)

    if user&.letter_verification_code.to_i != verification_code.to_i
      errors.add(:verification_code, I18n.t("verification.letter.errors.incorrect_code"))
    end
  end

  def verify?
    verify.present?
  end

  def increase_letter_verification_tries
    user.update(letter_verification_tries: user.letter_verification_tries += 1)
  end

  private

    # six-digit numbers, zero not the first digit
    def generate_verification_code
      rand(100000..999999).to_s
    end
end
