--------------------------------------------------------------------------------

module
    Hable.Style.Unicode
        ( UnicodeStyle(..)
        , unicodeCharset
        , maybeUnicodeCharset
        )
  where


--------------------------------------------------------------------------------

import Hable.BoxChar


--------------------------------------------------------------------------------

-- | This module uses a style data type supporting normal, double and thick
-- lines.

data UnicodeStyle = Normal | Double | Thick
  deriving Show


--------------------------------------------------------------------------------

-- | 'charset'. Unfortunately, there is not a Unicode box character for all
-- possible values of @'BoxChar' 'Unicode'@. In case of such an input, an error
-- is thrown.
--
-- If you'd prefer an alternative behavior in that case, use 'maybeUnicodeCharset'.
--
-- An example output:
--
-- >>> putStr (hable myConfig myTable)
-- ╒══════════════════════╤════════════════════════════════════════════════╕
-- │ Name                 │ Hable                                          │
-- ╞══════════════════════╪════════════════════════════════════════════════╡
-- │ Synopsis             │ customizable pretty printer library for tables │
-- │ License              │ Public Domain / Unlicense                      │
-- └──────────────────────┴────────────────────────────────────────────────┘

unicodeCharset :: BoxChar UnicodeStyle -> String

unicodeCharset bxChr = maybe
    (error "Unknown BoxChar.")
    id
    (maybeUnicodeCharset bxChr)


--------------------------------------------------------------------------------

-- | Maybe returns a character representing the given 'BoxChar' with Unicode
-- box characters.

maybeUnicodeCharset :: BoxChar UnicodeStyle -> Maybe String

maybeUnicodeCharset (Bar Normal) = Just "│"
maybeUnicodeCharset (Bar Thick ) = Just "┃"
maybeUnicodeCharset (Bar Double) = Just "║"

maybeUnicodeCharset (Dash Normal) = Just "─"
maybeUnicodeCharset (Dash Thick ) = Just "━"
maybeUnicodeCharset (Dash Double) = Just "═"

maybeUnicodeCharset (Angled HLeft Normal VBottom Normal) = Just "┐"
maybeUnicodeCharset (Angled HLeft Normal VBottom Thick ) = Just "┑"
maybeUnicodeCharset (Angled HLeft Normal VBottom Double) = Just "╕"
maybeUnicodeCharset (Angled HLeft Thick  VBottom Normal) = Just "┑"
maybeUnicodeCharset (Angled HLeft Thick  VBottom Thick ) = Just "┓"
--ybeUnicodeCharset (Angled HLeft Thick  VBottom Double) = Just "·"
maybeUnicodeCharset (Angled HLeft Double VBottom Normal) = Just "╖"
--ybeUnicodeCharset (Angled HLeft Double VBottom Thick ) = Just "·"
maybeUnicodeCharset (Angled HLeft Double VBottom Double) = Just "╗"

maybeUnicodeCharset (Angled HLeft Normal VTop Normal) = Just "┘"
maybeUnicodeCharset (Angled HLeft Normal VTop Thick ) = Just "┙"
maybeUnicodeCharset (Angled HLeft Normal VTop Double) = Just "╛"
maybeUnicodeCharset (Angled HLeft Thick  VTop Normal) = Just "┚"
maybeUnicodeCharset (Angled HLeft Thick  VTop Thick ) = Just "┛"
--ybeUnicodeCharset (Angled HLeft Thick  VTop Double) = Just "·"
maybeUnicodeCharset (Angled HLeft Double VTop Normal) = Just "╜"
--ybeUnicodeCharset (Angled HLeft Double VTop Thick ) = Just "·"
maybeUnicodeCharset (Angled HLeft Double VTop Double) = Just "╝"

maybeUnicodeCharset (Angled HRight Normal VBottom Normal) = Just "┌"
maybeUnicodeCharset (Angled HRight Thick  VBottom Normal) = Just "┎"
maybeUnicodeCharset (Angled HRight Double VBottom Normal) = Just "╓"
maybeUnicodeCharset (Angled HRight Normal VBottom Thick ) = Just "┍"
maybeUnicodeCharset (Angled HRight Thick  VBottom Thick ) = Just "┏"
--ybeUnicodeCharset (Angled HRight Double VBottom Thick ) = Just "·"
maybeUnicodeCharset (Angled HRight Normal VBottom Double) = Just "╒"
--ybeUnicodeCharset (Angled HRight Thick  VBottom Double) = Just "·"
maybeUnicodeCharset (Angled HRight Double VBottom Double) = Just "╔"

maybeUnicodeCharset (Angled HRight Normal VTop Normal) = Just "└"
maybeUnicodeCharset (Angled HRight Normal VTop Thick ) = Just "┕"
maybeUnicodeCharset (Angled HRight Normal VTop Double) = Just "╘"
maybeUnicodeCharset (Angled HRight Thick  VTop Normal) = Just "┖"
maybeUnicodeCharset (Angled HRight Thick  VTop Thick ) = Just "┗"
--ybeUnicodeCharset (Angled HRight Thick  VTop Double) = Just "·"
maybeUnicodeCharset (Angled HRight Double VTop Normal) = Just "╙"
--ybeUnicodeCharset (Angled HRight Double VTop Thick ) = Just "·"
maybeUnicodeCharset (Angled HRight Double VTop Double) = Just "╚"

maybeUnicodeCharset (Angled HCenter Normal VBottom Normal) = Just "┬"
maybeUnicodeCharset (Angled HCenter Normal VBottom Thick ) = Just "┯"
maybeUnicodeCharset (Angled HCenter Normal VBottom Double) = Just "╤"
maybeUnicodeCharset (Angled HCenter Thick  VBottom Normal) = Just "┰"
maybeUnicodeCharset (Angled HCenter Thick  VBottom Thick ) = Just "┳"
--ybeUnicodeCharset (Angled HCenter Thick  VBottom Double) = Just "·"
maybeUnicodeCharset (Angled HCenter Double VBottom Normal) = Just "╥"
--ybeUnicodeCharset (Angled HCenter Double VBottom Thick ) = Just "·"
maybeUnicodeCharset (Angled HCenter Double VBottom Double) = Just "╦"

maybeUnicodeCharset (Angled HLeft Normal VCenter Normal) = Just "┤"
maybeUnicodeCharset (Angled HLeft Normal VCenter Thick ) = Just "┥"
maybeUnicodeCharset (Angled HLeft Normal VCenter Double) = Just "╡"
maybeUnicodeCharset (Angled HLeft Thick  VCenter Normal) = Just "┨"
maybeUnicodeCharset (Angled HLeft Thick  VCenter Thick ) = Just "┫"
--ybeUnicodeCharset (Angled HLeft Thick  VCenter Double) = Just "·"
maybeUnicodeCharset (Angled HLeft Double VCenter Normal) = Just "╢"
--ybeUnicodeCharset (Angled HLeft Double VCenter Thick ) = Just "·"
maybeUnicodeCharset (Angled HLeft Double VCenter Double) = Just "╣"

maybeUnicodeCharset (Angled HCenter  Normal VTop Normal) = Just "┴"
maybeUnicodeCharset (Angled HCenter  Normal VTop Thick ) = Just "┷"
maybeUnicodeCharset (Angled HCenter  Normal VTop Double) = Just "╧"
maybeUnicodeCharset (Angled HCenter  Thick  VTop Normal) = Just "┸"
maybeUnicodeCharset (Angled HCenter  Thick  VTop Thick ) = Just "┻"
--ybeUnicodeCharset (Angled HCenter  Thick  VTop Double) = Just "·"
maybeUnicodeCharset (Angled HCenter  Double VTop Normal) = Just "╧"
--ybeUnicodeCharset (Angled HCenter  Double VTop Thick ) = Just "·"
maybeUnicodeCharset (Angled HCenter  Double VTop Double) = Just "╩"

maybeUnicodeCharset (Angled HRight Normal VCenter Normal) = Just "├"
maybeUnicodeCharset (Angled HRight Thick  VCenter Normal) = Just "┠"
maybeUnicodeCharset (Angled HRight Double VCenter Normal) = Just "╟"
maybeUnicodeCharset (Angled HRight Normal VCenter Thick ) = Just "┝"
maybeUnicodeCharset (Angled HRight Thick  VCenter Thick ) = Just "┣"
--ybeUnicodeCharset (Angled HRight Double VCenter Thick ) = Just "·"
maybeUnicodeCharset (Angled HRight Normal VCenter Double) = Just "╞"
--ybeUnicodeCharset (Angled HRight Thick  VCenter Double) = Just "·"
maybeUnicodeCharset (Angled HRight Double VCenter Double) = Just "╠"

maybeUnicodeCharset (Angled HCenter Normal VCenter Normal) = Just "┼"
maybeUnicodeCharset (Angled HCenter Normal VCenter Thick ) = Just "┿"
maybeUnicodeCharset (Angled HCenter Normal VCenter Double) = Just "╪"
maybeUnicodeCharset (Angled HCenter Thick  VCenter Normal) = Just "╂"
maybeUnicodeCharset (Angled HCenter Thick  VCenter Thick ) = Just "╋"
--ybeUnicodeCharset (Angled HCenter Thick  VCenter Double) = Just "·"
maybeUnicodeCharset (Angled HCenter Double VCenter Normal) = Just "╫"
--ybeUnicodeCharset (Angled HCenter Double VCenter Thick ) = Just "·"
maybeUnicodeCharset (Angled HCenter Double VCenter Double) = Just "╬"

maybeUnicodeCharset _ = Nothing