require "cpf_generator/version"

module CpfGenerator
  class Cpf
    attr_accessor :numbers

    def initialize
      @numbers = [*0..9].sample(9)
    end

    def first_dv
      value = 0
      down = [10,9,8,7,6,5,4,3,2]
      up = [0,1,2,3,4,5,6,7,8]

      9.times do |n|
        value += @numbers[up[n]].to_i * down[n]
      end

      remainder = (value % 11)
      if remainder < 2
        @numbers << 0
        0
      else
        @numbers << (11 - remainder)
        (11 - remainder)
      end
    end

    def second_dv
      value = 0
      down = [11,10,9,8,7,6,5,4,3,2]
      up = [0,1,2,3,4,5,6,7,8,9]

      10.times do |n|
        value += @numbers[up[n]].to_i * down[n]
      end

      remainder = (value % 11)
      if remainder < 2
        @numbers << 0
        0
      else
        @numbers << (11 - remainder)
        (11 - remainder)
      end
    end

    def formatted
      first_dv
      second_dv
      cpf = @numbers.join("")
      "#{cpf[0..2]}.#{cpf[3..5]}.#{cpf[6..8]}-#{cpf[9..11]}"
    end

    def unformatted
      first_dv
      second_dv
      @numbers.join("")
    end
  end
end