{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}

module Data.Xournal.Predefined where

import qualified Data.Map as M
import qualified Data.ByteString.Char8 as B

import Text.Printf 

hexToRGBA :: Integer -> (Double,Double,Double,Double) 
hexToRGBA n = 
  let r = n `div` (256*256*256)
      g = (n-r*256*256*256) `div` (256*256)
      b = (n-r*256*256*256-g*256*256) `div` 256 
      a = n-r*256*256*256-g*256*256-b*256  
  in  (fromIntegral r/255.0,fromIntegral g/255.0,fromIntegral b/255.0,fromIntegral a/255.0)

rgbaToHEX :: (Double,Double,Double,Double) -> String
rgbaToHEX (r,g,b,a) = 
  let i :: Integer = round (255*a) + round (256*255*b) + round (256*256*255*g) + round (256*256*256*255*r) 
  in printf "#%08x" i

predefined_pencolor :: M.Map B.ByteString (Double,Double,Double,Double)
predefined_pencolor = 
  M.fromList [ ("black"     , hexToRGBA 0x000000ff)
             , ("blue"      , hexToRGBA 0x3333ccff)
             , ("red"       , hexToRGBA 0xff0000ff)
             , ("green"     , hexToRGBA 0x008000ff)
             , ("gray"      , hexToRGBA 0x808080ff)
             , ("lightblue" , hexToRGBA 0x00c0ffff)
             , ("lightgreen", hexToRGBA 0x00ff00ff)
             , ("magenta"   , hexToRGBA 0xff00ffff)
             , ("orange"    , hexToRGBA 0xff8000ff)
             , ("yellow"    , hexToRGBA 0xffff00ff)
             , ("white"     , hexToRGBA 0xffffffff) ] 

{-
getPenColor :: B.ByteString -> Maybe (Double,Double,Double,Double) 
getPenColor b | (not . B.null) b = 
  case B.head b of 
    '#' -> B.tail b 
-}

predefined_bkgcolor :: M.Map B.ByteString (Double,Double,Double,Double)
predefined_bkgcolor = 
  M.fromList [ (""      , hexToRGBA 0xffffffff) 
             , ("blue"  , hexToRGBA 0xa0e8ffff)
             , ("pink"  , hexToRGBA 0xffc0d4ff)
             , ("green" , hexToRGBA 0x80ffc0ff)
             , ("orange", hexToRGBA 0xffc080ff)
             , ("yellow", hexToRGBA 0xffff80ff)
             , ("white" , hexToRGBA 0xffffffff) ]

predefined_veryfine :: Double
predefined_veryfine = 0.42 

predefined_fine :: Double
predefined_fine = 0.85

predefined_medium :: Double
predefined_medium = 1.41

predefined_thick :: Double
predefined_thick = 2.26

predefined_verythick :: Double 
predefined_verythick = 5.67

predefined_RULING_MARGIN_COLOR :: (Double,Double,Double,Double)
predefined_RULING_MARGIN_COLOR = hexToRGBA 0xff0080ff

predefined_RULING_COLOR :: (Double,Double,Double,Double)
predefined_RULING_COLOR = hexToRGBA 0x40a0ffff

predefined_RULING_THICKNESS :: Double
predefined_RULING_THICKNESS = 0.5

predefined_RULING_LEFTMARGIN :: Double
predefined_RULING_LEFTMARGIN = 72.0

predefined_RULING_TOPMARGIN :: Double
predefined_RULING_TOPMARGIN = 80.0

predefined_RULING_SPACING :: Double
predefined_RULING_SPACING = 24.0

predefined_RULING_BOTTOMMARGIN :: Double 
predefined_RULING_BOTTOMMARGIN = predefined_RULING_SPACING

predefined_RULING_GRAPHSPACING :: Double
predefined_RULING_GRAPHSPACING = 14.17