class Faker::Vehicle

def calculate_vin_check_digit(vin)

def calculate_vin_check_digit(vin)
  sum = 0
  vin.each_char.with_index do |c, i|
    n = vin_char_to_number(c).to_i
    weight = VIN_WEIGHTS[i].to_i
    sum += weight * n
  end
  mod = sum % 11
  mod == 10 ? 'X' : mod
end

def car_options

def car_options
  Array.new(rand(5...10)) { fetch('vehicle.car_options') }
end

def car_type

def car_type
  fetch('vehicle.car_types')
end

def color

def color
  fetch('vehicle.colors')
end

def doors

def doors
  sample(fetch_all('vehicle.doors'))
end

def drive_type

def drive_type
  fetch('vehicle.drive_types')
end

def engine

def engine
  "#{sample(fetch_all('vehicle.doors'))} #{fetch('vehicle.cylinder_engine')}"
end

def first_eight(number)

def first_eight(number)
  return number[0...8] unless number.nil?
  regexify(VIN_REGEX)
end

def fuel_type

def fuel_type
  fetch('vehicle.fuel_types')
end

def license_plate(legacy_state_abreviation = NOT_GIVEN, state_abreviation: '')

def license_plate(legacy_state_abreviation = NOT_GIVEN, state_abreviation: '')
  warn_for_deprecated_arguments do |keywords|
    keywords << :state_abreviation if legacy_state_abreviation != NOT_GIVEN
  end
  return regexify(bothify(fetch('vehicle.license_plate'))) if state_abreviation.empty?
  key = 'vehicle.license_plate_by_state.' + state_abreviation
  regexify(bothify(fetch(key)))
end

def make

def make
  fetch('vehicle.makes')
end

def make_and_model

def make_and_model
  m = make
  "#{m} #{model(make_of_model: m)}"
end

def manufacture

def manufacture
  fetch('vehicle.manufacture')
end

def mileage(legacy_min = NOT_GIVEN, legacy_max = NOT_GIVEN, min: MILEAGE_MIN, max: MILEAGE_MAX)

def mileage(legacy_min = NOT_GIVEN, legacy_max = NOT_GIVEN, min: MILEAGE_MIN, max: MILEAGE_MAX)
  warn_for_deprecated_arguments do |keywords|
    keywords << :min if legacy_min != NOT_GIVEN
    keywords << :max if legacy_max != NOT_GIVEN
  end
  rand_in_range(min, max)
end

def model(legacy_make_of_model = NOT_GIVEN, make_of_model: '')

def model(legacy_make_of_model = NOT_GIVEN, make_of_model: '')
  warn_for_deprecated_arguments do |keywords|
    keywords << :make_of_model if legacy_make_of_model != NOT_GIVEN
  end
  return fetch("vehicle.models_by_make.#{make}") if make_of_model.empty?
  fetch("vehicle.models_by_make.#{make_of_model}")
end

def singapore_checksum(plate_number)

def singapore_checksum(plate_number)
  padded_alphabets = format('%3s', plate_number[/^[A-Z]+/]).tr(' ', '-').split('')
  padded_digits = format('%04d', plate_number[/\d+/]).split('').map(&:to_i)
  sum = [*padded_alphabets, *padded_digits].each_with_index.reduce(0) do |memo, (char, i)|
    value = char.is_a?(Integer) ? char : char.ord - 64
    memo + (SG_CHECKSUM_WEIGHTS[i] * value)
  end
  SG_CHECKSUM_CHARS.split('')[sum % 19]
end

def singapore_license_plate

def singapore_license_plate
  key = 'vehicle.license_plate'
  plate_number = regexify(bothify(fetch(key)))
  "#{plate_number}#{singapore_checksum(plate_number)}"
end

def standard_specs

def standard_specs
  Array.new(rand(5...10)) { fetch('vehicle.standard_specs') }
end

def style

def style
  fetch('vehicle.styles')
end

def transmission

def transmission
  fetch('vehicle.transmissions')
end

def vin

def vin
  regexify(VIN_REGEX)
end

def vin_char_to_number(char)

def vin_char_to_number(char)
  index = VIN_LETTERS.split('').index(char)
  return char.to_i if index.nil?
  VIN_MAP[index]
end

def year

def year
  Faker::Time.backward(days: rand_in_range(365, 5475), period: :all, format: '%Y').to_i
end