module Graphics.Diagrams.Colors where

import Data.Map
import Prelude hiding (lookup)

toRGB :: String -> Maybe (Double, Double, Double)
toRGB s = lookup s colorMap

colors :: [String]
colors = keys colorMap

-- | SVG color codes
colorMap :: Map String (Double, Double, Double)
colorMap = fromList
    [ "aliceblue"  ==>  (240, 248, 255)
    , "antiquewhite"  ==>  (250, 235, 215)
    , "aqua"  ==>  ( 0, 255, 255)
    , "aquamarine"  ==>  (127, 255, 212)
    , "azure"  ==>  (240, 255, 255)
    , "beige"  ==>  (245, 245, 220)
    , "bisque"  ==>  (255, 228, 196)
    , "black"  ==>  ( 0, 0, 0)
    , "blanchedalmond"  ==>  (255, 235, 205)
    , "blue"  ==>  ( 0, 0, 255)
    , "blueviolet"  ==>  (138, 43, 226)
    , "brown"  ==>  (165, 42, 42)
    , "burlywood"  ==>  (222, 184, 135)
    , "cadetblue"  ==>  ( 95, 158, 160)
    , "chartreuse"  ==>  (127, 255, 0)
    , "chocolate"  ==>  (210, 105, 30)
    , "coral"  ==>  (255, 127, 80)
    , "cornflowerblue"  ==>  (100, 149, 237)
    , "cornsilk"  ==>  (255, 248, 220)
    , "crimson"  ==>  (220, 20, 60)
    , "cyan"  ==>  ( 0, 255, 255)
    , "darkblue"  ==>  ( 0, 0, 139)
    , "darkcyan"  ==>  ( 0, 139, 139)
    , "darkgoldenrod"  ==>  (184, 134, 11)
    , "darkgray"  ==>  (169, 169, 169)
    , "darkgreen"  ==>  ( 0, 100, 0)
    , "darkgrey"  ==>  (169, 169, 169)
    , "darkkhaki"  ==>  (189, 183, 107)
    , "darkmagenta"  ==>  (139, 0, 139)
    , "darkolivegreen"  ==>  ( 85, 107, 47)
    , "darkorange"  ==>  (255, 140, 0)
    , "darkorchid"  ==>  (153, 50, 204)
    , "darkred"  ==>  (139, 0, 0)
    , "darksalmon"  ==>  (233, 150, 122)
    , "darkseagreen"  ==>  (143, 188, 143)
    , "darkslateblue"  ==>  ( 72, 61, 139)
    , "darkslategray"  ==>  ( 47, 79, 79)
    , "darkslategrey"  ==>  ( 47, 79, 79)
    , "darkturquoise"  ==>  ( 0, 206, 209)
    , "darkviolet"  ==>  (148, 0, 211)
    , "deeppink"  ==>  (255, 20, 147)
    , "deepskyblue"  ==>  ( 0, 191, 255)
    , "dimgray"  ==>  (105, 105, 105)
    , "dimgrey"  ==>  (105, 105, 105)
    , "dodgerblue"  ==>  ( 30, 144, 255)
    , "firebrick"  ==>  (178, 34, 34)
    , "floralwhite"  ==>  (255, 250, 240)
    , "forestgreen"  ==>  ( 34, 139, 34)
    , "fuchsia"  ==>  (255, 0, 255)
    , "gainsboro"  ==>  (220, 220, 220)
    , "ghostwhite"  ==>  (248, 248, 255)
    , "gold"  ==>  (255, 215, 0)
    , "goldenrod"  ==>  (218, 165, 32)
    , "gray"  ==>  (128, 128, 128)
    , "grey"  ==>  (128, 128, 128)
    , "green"  ==>  ( 0, 128, 0)
    , "greenyellow"  ==>  (173, 255, 47)
    , "honeydew"  ==>  (240, 255, 240)
    , "hotpink"  ==>  (255, 105, 180)
    , "indianred"  ==>  (205, 92, 92)
    , "indigo"  ==>  ( 75, 0, 130)
    , "ivory"  ==>  (255, 255, 240)
    , "khaki"  ==>  (240, 230, 140)
    , "lavender"  ==>  (230, 230, 250)
    , "lavenderblush"  ==>  (255, 240, 245)
    , "lawngreen"  ==>  (124, 252, 0)
    , "lemonchiffon"  ==>  (255, 250, 205)
    , "lightblue"  ==>  (173, 216, 230)
    , "lightcoral"  ==>  (240, 128, 128)
    , "lightcyan"  ==>  (224, 255, 255)
    , "lightgoldenrodyellow"  ==>  (250, 250, 210)
    , "lightgray"  ==>  (211, 211, 211)
    , "lightgreen"  ==>  (144, 238, 144)
    , "lightgrey"  ==>  (211, 211, 211)
    , "lightpink"  ==>  (255, 182, 193)
    , "lightsalmon"  ==>  (255, 160, 122)
    , "lightseagreen"  ==>  ( 32, 178, 170)
    , "lightskyblue"  ==>  (135, 206, 250)
    , "lightslategray"  ==>  (119, 136, 153)
    , "lightslategrey"  ==>  (119, 136, 153)
    , "lightsteelblue"  ==>  (176, 196, 222)
    , "lightyellow"  ==>  (255, 255, 224)
    , "lime"  ==>  ( 0, 255, 0)
    , "limegreen"  ==>  ( 50, 205, 50)
    , "linen"  ==>  (250, 240, 230)
    , "magenta"  ==>  (255, 0, 255)
    , "maroon"  ==>  (128, 0, 0)
    , "mediumaquamarine"  ==>  (102, 205, 170)
    , "mediumblue"  ==>  ( 0, 0, 205)
    , "mediumorchid"  ==>  (186, 85, 211)
    , "mediumpurple"  ==>  (147, 112, 219)
    , "mediumseagreen"  ==>  ( 60, 179, 113)
    , "mediumslateblue"  ==>  (123, 104, 238)
    , "mediumspringgreen"  ==>  ( 0, 250, 154)
    , "mediumturquoise"  ==>  ( 72, 209, 204)
    , "mediumvioletred"  ==>  (199, 21, 133)
    , "midnightblue"  ==>  ( 25, 25, 112)
    , "mintcream"  ==>  (245, 255, 250)
    , "mistyrose"  ==>  (255, 228, 225)
    , "moccasin"  ==>  (255, 228, 181)
    , "navajowhite"  ==>  (255, 222, 173)
    , "navy"  ==>  ( 0, 0, 128)
    , "oldlace"  ==>  (253, 245, 230)
    , "olive"  ==>  (128, 128, 0)
    , "olivedrab"  ==>  (107, 142, 35)
    , "orange"  ==>  (255, 165, 0)
    , "orangered"  ==>  (255, 69, 0)
    , "orchid"  ==>  (218, 112, 214)
    , "palegoldenrod"  ==>  (238, 232, 170)
    , "palegreen"  ==>  (152, 251, 152)
    , "paleturquoise"  ==>  (175, 238, 238)
    , "palevioletred"  ==>  (219, 112, 147)
    , "papayawhip"  ==>  (255, 239, 213)
    , "peachpuff"  ==>  (255, 218, 185)
    , "peru"  ==>  (205, 133, 63)
    , "pink"  ==>  (255, 192, 203)
    , "plum"  ==>  (221, 160, 221)
    , "powderblue"  ==>  (176, 224, 230)
    , "purple"  ==>  (128, 0, 128)
    , "red"  ==>  (255, 0, 0)
    , "rosybrown"  ==>  (188, 143, 143)
    , "royalblue"  ==>  ( 65, 105, 225)
    , "saddlebrown"  ==>  (139, 69, 19)
    , "salmon"  ==>  (250, 128, 114)
    , "sandybrown"  ==>  (244, 164, 96)
    , "seagreen"  ==>  ( 46, 139, 87)
    , "seashell"  ==>  (255, 245, 238)
    , "sienna"  ==>  (160, 82, 45)
    , "silver"  ==>  (192, 192, 192)
    , "skyblue"  ==>  (135, 206, 235)
    , "slateblue"  ==>  (106, 90, 205)
    , "slategray"  ==>  (112, 128, 144)
    , "slategrey"  ==>  (112, 128, 144)
    , "snow"  ==>  (255, 250, 250)
    , "springgreen"  ==>  ( 0, 255, 127)
    , "steelblue"  ==>  ( 70, 130, 180)
    , "tan"  ==>  (210, 180, 140)
    , "teal"  ==>  ( 0, 128, 128)
    , "thistle"  ==>  (216, 191, 216)
    , "tomato"  ==>  (255, 99, 71)
    , "turquoise"  ==>  ( 64, 224, 208)
    , "violet"  ==>  (238, 130, 238)
    , "wheat"  ==>  (245, 222, 179)
    , "white"  ==>  (255, 255, 255)
    , "whitesmoke"  ==>  (245, 245, 245)
    , "yellow"  ==>  (255, 255, 0)
    , "yellowgreen"  ==>  (154, 205, 50)
    ]
 where
    s ==> (r,g,b) = (s, (f r, f g, f b))

    f :: Int -> Double
    f 0 = 0
    f 255 = 1
    f n = fromIntegral n / 255