{-# OPTIONS_HADDOCK hide #-}
module Codec.Binary.QRCode.Modes.Numeric where

import Numeric
import Codec.Binary.QRCode.Utils
import Codec.Binary.QRCode.Spec

safeRead :: (Eq a, Num a) => String -> Maybe a
safeRead x = case readDec x of
    [] -> Nothing
    ((x',_):_) -> Just x'

convert :: Input -> Maybe String
convert chunk = showBin `fmap` safeRead chunk
    where
        showBin = case length chunk of
            3 -> showBinPadded 10
            2 -> showBinPadded 7
            1 -> showBinPadded 4
            _ -> error "Invalid chunk size"

encode :: Version -> Input -> Maybe BitStream
encode ver input = ((modeIndicatorBits ++ characterCountBits) ++) `fmap` dataBits
    where
        dataBits = concat `fmap` mapM convert (chunksOf 3 input)
        modeIndicatorBits = "0001"
        characterCountBits = showBinPadded cciLength $ length input
        cciLength = qrLengthOfCCI ver Numeric