module ApiTypes where
 
+import Control.Monad ((<=<))
 import CssContentType
 import Lucid
 import Servant
   parseQueryParam theme = do
     case T.splitOn "," theme of
       [lightText, redText, greenText, blueText] -> do
+        let parseColorComponent = pure . flip mod 0x100 <=< parseQueryParam
         light <- parseQueryParam lightText
-        red <- parseQueryParam redText
-        green <- parseQueryParam greenText
-        blue <- parseQueryParam blueText
+        red <- parseColorComponent redText
+        green <- parseColorComponent greenText
+        blue <- parseColorComponent blueText
         pure $ Theme { themeType = light, themeRed = red, themeGreen = green, themeBlue = blue }
       _ -> Left $ "Invalid value '" <> theme <> "'. Value must contain four integer values delimited by commas."
 
 
 findBlogPost = liftIO . T.readFile . (<>) staticPath . flip (<>) (T.unpack markdownExtension)
 
 styling :: Maybe Theme -> Handler C.Css
-styling Nothing = pure $ darkStyle $ getColorFromInput 0 0 0
-styling (Just theme) = pure $ getStyleFromTheme (themeType theme) $ getColorFromInput (themeRed theme) (themeGreen theme) (themeBlue theme)
+styling Nothing = pure $ darkStyle C.black
+styling (Just theme) = pure $ getStyleFromTheme (themeType theme) $ C.rgba (themeRed theme) (themeGreen theme) (themeBlue theme) 1
 
 getStyleFromTheme :: LightDark -> C.Color -> C.Css
 getStyleFromTheme Dark = darkStyle
 getStyleFromTheme Light = lightStyle
-
-getColorFromInput :: Integer -> Integer -> Integer -> C.Color
-getColorFromInput redColor greenColor blueColor = do
-  let red = getIndividualColor redColor
-  let green = getIndividualColor greenColor
-  let blue = getIndividualColor blueColor
-  C.rgba red green blue 1
-
-getIndividualColor :: Integer -> Integer
-getIndividualColor = flip mod 0x100