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

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

safeRead :: 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` sequence (map convert . chunksOf 3 $ input)
        modeIndicatorBits = "0001"
        characterCountBits = showBinPadded cciLength $ length input
        cciLength = qrLengthOfCCI ver Numeric