module Lib
    ( convertSingle
    , asHex
    , convert
    ) where

import           Encoder

import           Data.Word
import           Data.ByteString.Builder ( byteStringHex, toLazyByteString )
import           Data.Maybe              ( fromMaybe )

import qualified Data.ByteString         as BS
import qualified Data.ByteString.Lazy    as BSL
import qualified Data.Map.Strict         as Map

convertSingle :: Word -> BS.ByteString
convertSingle = BS.pack . encodeUtf8

asHex :: BS.ByteString -> BSL.ByteString
asHex = toLazyByteString . byteStringHex

convert :: BSL.ByteString -> BSL.ByteString
convert = BSL.concatMap (BSL.pack . encodeUtf8 . converter)
  where
    converter x = fromIntegral x `fromMaybe` Map.lookup x cp437toUnicode



cp437toUnicode :: Map.Map Word8 Word
cp437toUnicode = Map.fromList $
    [1 .. 9] `zip`
    [ 0x263A
    , 0x263B
    , 0x2665
    , 0x2666
    , 0x2663
    , 0x2660
    , 0x2022
    , 0x25D8
    , 0x25CB
    ]
    ++
    [11 .. 12] `zip` [ 0x2642, 0x2640 ]
    ++
    [14 .. 31] `zip`
    [ 0x266B
    , 0x263C
    , 0x25B6
    , 0x25C0
    , 0x2195
    , 0x203C
    , 0xB6
    , 0xA7
    , 0x2582
    , 0x21A8
    , 0x2191
    , 0x2193
    , 0x2192
    , 0x2190
    , 0x221F
    , 0x2194
    , 0x25B2
    , 0x25BC
    ]
    ++
    [128 .. 255] `zip`
    [ 0xC7
    , 0xFC
    , 0xE9
    , 0xE2
    , 0xE4
    , 0xE0
    , 0xE5
    , 0xE7
    , 0xEA
    , 0xEB
    , 0xE8
    , 0xEF
    , 0xEE
    , 0xEC
    , 0xC4
    , 0xC5
    , 0xC9
    , 0xE6
    , 0xC6
    , 0xF4
    , 0xF6
    , 0xF2
    , 0xFB
    , 0xF9
    , 0xFF
    , 0xD6
    , 0xDC
    , 0xA2
    , 0xA3
    , 0xA5
    , 0x20A7
    , 0x192
    , 0xE1
    , 0xED
    , 0xF3
    , 0xFA
    , 0xF1
    , 0xD1
    , 0xAA
    , 0xBA
    , 0xBF
    , 0x2310
    , 0xAC
    , 0xBD
    , 0xBC
    , 0xA1
    , 0xAB
    , 0xBB
    , 0x2591
    , 0x2592
    , 0x2593
    , 0x2502
    , 0x2524
    , 0x2561
    , 0x2562
    , 0x2556
    , 0x2555
    , 0x2563
    , 0x2551
    , 0x2557
    , 0x255D
    , 0x255C
    , 0x255B
    , 0x2510
    , 0x2514
    , 0x2534
    , 0x252C
    , 0x251C
    , 0x2500
    , 0x253C
    , 0x255E
    , 0x255F
    , 0x255A
    , 0x2554
    , 0x2569
    , 0x2566
    , 0x2560
    , 0x2550
    , 0x256C
    , 0x2567
    , 0x2568
    , 0x2564
    , 0x2565
    , 0x2559
    , 0x2558
    , 0x2552
    , 0x2553
    , 0x256B
    , 0x256A
    , 0x2518
    , 0x250C
    , 0x2588
    , 0x2584
    , 0x258C
    , 0x2590
    , 0x2580
    , 0x3B1
    , 0xDF
    , 0x393
    , 0x3C0
    , 0x3A3
    , 0x3C3
    , 0xB5
    , 0x3C4
    , 0x3A6
    , 0x398
    , 0x3A9
    , 0x3B4
    , 0x221E
    , 0x3C6
    , 0x3B5
    , 0x2229
    , 0x2261
    , 0xB1
    , 0x2265
    , 0x2264
    , 0x2320
    , 0x2321
    , 0xF7
    , 0x2248
    , 0xB0
    , 0x2219
    , 0xB7
    , 0x221A
    , 0x207F
    , 0xB2
    , 0x25A0
    , 0xA0
    ]