class SiretFormatValidator < ActiveModel::EachValidator
  def validate_each(record,attribute,value)
    if !(value =~ /^\d{14}$/)
      record.errors.add(attribute, :format)
    end
    if value.nil? || (luhn_checksum(value) % 10 != 0)
      record.errors.add(attribute, :checksum)
    end
  end

  private

  def luhn_checksum(value)
    accum = 0
    value.reverse.each_char.map(&:to_i).each_with_index do |digit, index|
      t = index.even? ? digit : digit * 2
      t = t - 9 if t >= 10
      accum += t
    end
    accum
  end
end
