class RQRCodeCore::QRSegment

def content_size

def content_size
  chunk_size, bit_length, extra = case mode
  when :mode_number
    [3, QRNumeric::NUMBER_LENGTH[3], QRNumeric::NUMBER_LENGTH[data_length % 3] || 0]
  when :mode_alpha_numk
    [2, 11, 6]
  when :mode_8bit_byte
    [1, 8, 0]
  end
  (data_length / chunk_size) * bit_length + ((data_length % chunk_size) == 0 ? 0 : extra)
end

def data_length

def data_length
  data.bytesize
end

def header_size(version)

def header_size(version)
  QRUtil.get_length_in_bits(QRMODE[mode], version)
end

def initialize(data:, mode: nil)

def initialize(data:, mode: nil)
  @data = data
  @mode = QRMODE_NAME.dig(mode&.to_sym)
  # If mode is not explicitely found choose mode according to data type
  @mode ||= if RQRCodeCore::QRNumeric.valid_data?(@data)
    QRMODE_NAME[:number]
  elsif QRAlphanumeric.valid_data?(@data)
    QRMODE_NAME[:alphanumeric]
  else
    QRMODE_NAME[:byte_8bit]
  end
end

def size(version)

def size(version)
  4 + header_size(version) + content_size
end

def writer

def writer
  case mode
  when :mode_number
    QRNumeric.new(data)
  when :mode_alpha_numk
    QRAlphanumeric.new(data)
  when :mode_multi
    QRMulti.new(data)
  else
    QR8bitByte.new(data)
  end
end