module Yi.UI.Vty.Conversions
    ( colorToAttr
    , fromVtyEvent
    , fromVtyKey
    , fromVtyMod
    ) where

import Data.List (nub, sort)
import qualified Graphics.Vty as Vty

import qualified Yi.Event
import qualified Yi.Style

fromVtyEvent :: Vty.Event -> Yi.Event.Event
fromVtyEvent (Vty.EvKey Vty.KBackTab mods) =
    Yi.Event.Event Yi.Event.KTab (sort $ nub $ Yi.Event.MShift : map fromVtyMod mods)
fromVtyEvent (Vty.EvKey k mods) =
    Yi.Event.Event (fromVtyKey k) (sort $ map fromVtyMod mods)
fromVtyEvent _ = error "fromVtyEvent: unsupported event encountered."

fromVtyKey :: Vty.Key -> Yi.Event.Key
fromVtyKey (Vty.KEsc      ) = Yi.Event.KEsc
fromVtyKey (Vty.KFun x    ) = Yi.Event.KFun x
fromVtyKey (Vty.KPrtScr   ) = Yi.Event.KPrtScr
fromVtyKey (Vty.KPause    ) = Yi.Event.KPause
fromVtyKey (Vty.KChar '\t') = Yi.Event.KTab
fromVtyKey (Vty.KChar c   ) = Yi.Event.KASCII c
fromVtyKey (Vty.KBS       ) = Yi.Event.KBS
fromVtyKey (Vty.KIns      ) = Yi.Event.KIns
fromVtyKey (Vty.KHome     ) = Yi.Event.KHome
fromVtyKey (Vty.KPageUp   ) = Yi.Event.KPageUp
fromVtyKey (Vty.KDel      ) = Yi.Event.KDel
fromVtyKey (Vty.KEnd      ) = Yi.Event.KEnd
fromVtyKey (Vty.KPageDown ) = Yi.Event.KPageDown
fromVtyKey (Vty.KCenter   ) = Yi.Event.KNP5
fromVtyKey (Vty.KUp       ) = Yi.Event.KUp
fromVtyKey (Vty.KMenu     ) = Yi.Event.KMenu
fromVtyKey (Vty.KLeft     ) = Yi.Event.KLeft
fromVtyKey (Vty.KDown     ) = Yi.Event.KDown
fromVtyKey (Vty.KRight    ) = Yi.Event.KRight
fromVtyKey (Vty.KEnter    ) = Yi.Event.KEnter
fromVtyKey (Vty.KBackTab  ) = error "This should be handled in fromVtyEvent"
fromVtyKey (Vty.KBegin    ) = error "Yi.UI.Vty.fromVtyKey: can't handle KBegin"
fromVtyKey _ = error "Unhandled key in fromVtyKey"

fromVtyMod :: Vty.Modifier -> Yi.Event.Modifier
fromVtyMod Vty.MShift = Yi.Event.MShift
fromVtyMod Vty.MCtrl  = Yi.Event.MCtrl
fromVtyMod Vty.MMeta  = Yi.Event.MMeta
fromVtyMod Vty.MAlt   = Yi.Event.MMeta


-- | Convert a Yi Attr into a Vty attribute change.
colorToAttr :: (Vty.Color -> Vty.Attr -> Vty.Attr)
    -> Yi.Style.Color -> Vty.Attr -> Vty.Attr
colorToAttr set c =
  case c of
    Yi.Style.RGB 0 0 0         -> set Vty.black
    Yi.Style.RGB 128 128 128   -> set Vty.brightBlack
    Yi.Style.RGB 139 0 0       -> set Vty.red
    Yi.Style.RGB 255 0 0       -> set Vty.brightRed
    Yi.Style.RGB 0 100 0       -> set Vty.green
    Yi.Style.RGB 0 128 0       -> set Vty.brightGreen
    Yi.Style.RGB 165 42 42     -> set Vty.yellow
    Yi.Style.RGB 255 255 0     -> set Vty.brightYellow
    Yi.Style.RGB 0 0 139       -> set Vty.blue
    Yi.Style.RGB 0 0 255       -> set Vty.brightBlue
    Yi.Style.RGB 128 0 128     -> set Vty.magenta
    Yi.Style.RGB 255 0 255     -> set Vty.brightMagenta
    Yi.Style.RGB 0 139 139     -> set Vty.cyan
    Yi.Style.RGB 0 255 255     -> set Vty.brightCyan
    Yi.Style.RGB 165 165 165   -> set Vty.white
    Yi.Style.RGB 255 255 255   -> set Vty.brightWhite
    Yi.Style.Default           -> id
    Yi.Style.RGB r g b         -> set (Vty.rgbColor r g b)