from mmcore.geom.materials import ColorRGB
from mmcore.gql.client import GQLMutation

# using colors keywords from Three.js REVISION = '152';
_colorKeywords = {
    'aliceblue': 0xF0F8FF,
    'antiquewhite': 0xFAEBD7,
    'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4,
    'azure': 0xF0FFFF,
    'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD,
    'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
    'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00,
    'chocolate': 0xD2691E, 'coral': 0xFF7F50,
    'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF,
    'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
    'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9,
    'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
    'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000,
    'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
    'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F,
    'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
    'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969,
    'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
    'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC,
    'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
    'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080,
    'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
    'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA,
    'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
    'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF,
    'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
    'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A,
    'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
    'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE,
    'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
    'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA,
    'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
    'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE,
    'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
    'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1,
    'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
    'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500,
    'orangered': 0xFF4500, 'orchid': 0xDA70D6,
    'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE,
    'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
    'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080,
    'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
    'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460,
    'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
    'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD,
    'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
    'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080,
    'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
    'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00,
    'yellowgreen': 0x9ACD32
}


def color_palette(colors, i=None, **kwargs):
    """
    >>> from mmcore.geom.materials import ColorRGB

    >>> colors = [
    ...    {"name":"Malachite","hex":"11e159","rgb":[17,225,89],"cmyk":[92,0,60,12]},
    ...    {"name":"Jade","hex":"21ad6f","rgb":[33,173,111],"cmyk":[81,0,36,32]},
    ...    {"name":"Viridian","hex":"29937a","rgb":[41,147,122],"cmyk":[72,0,17,42]},
    ...    {"name":"Caribbean Current","hex":"307885","rgb":[48,120,133],"cmyk":[64,10,0,48]},
    ...    {"name":"Marian blue","hex":"40439b","rgb":[64,67,155],"cmyk":[59,57,0,39]},
    ...    {"name":"Tekhelet","hex":"5718a7","rgb":[87,24,167],"cmyk":[48,86,0,35]},
    ...    {"name":"Eminence","hex":"6f3689","rgb":[111,54,137],"cmyk":[19,61,0,46]},
    ...    {"name":"Rose taupe","hex":"8e5e61","rgb":[142,94,97],"cmyk":[0,34,32,44]},
    ...    {"name":"Dark goldenrod","hex":"ad863a","rgb":[173,134,58],"cmyk":[0,23,66,32]},
    ...    {"name":"Old gold","hex":"ccad12","rgb":[204,173,18],"cmyk":[0,15,91,20]}
    ... ]

    >>> mutation = GQLMutation(temp_args=dict(attrs=("id", "name", "palette")),schema="presets",table="colors")

    >>> new_colors=[]
    >>> palette=12345
    >>> for k in colors:
    ...    col = ColorRGB(*k["rgb"])
    ...    dct = {"palette": palette, "name": k['name'], "hex": col.hex(), "decimal": col.decimal}
    ...    dct.update(col.__dict__)
    ...    col.__dict__ |= mt.run_query(variables=dct)
    ...    new_colors.append(col)
    >>> new_colors
    [ColorRGB(17, 225, 89),
     ColorRGB(33, 173, 111),
     ColorRGB(41, 147, 122),
     ColorRGB(48, 120, 133),
     ColorRGB(64, 67, 155),
     ColorRGB(87, 24, 167),
     ColorRGB(111, 54, 137),
     ColorRGB(142, 94, 97),
     ColorRGB(173, 134, 58),
     ColorRGB(204, 173, 18)]
    >>> col = new_colors[0]
    >>> col.id
    52
    >>> col.palette
    12345

    """
    mt = GQLMutation(temp_args=dict(attrs=("id", "name", "palette")),
                     schema="presets",
                     table="colors"
                     )

    palette = id(mt) if i is None else i
    nc = []
    for k in colors:
        col = ColorRGB(*k["rgb"])
        dct = {"palette": palette, "name": k['name'], "hex": col.hex(), "decimal": col.decimal}
        dct.update(col.__dict__)

        col.__dict__ |= mt.run_query(variable=dct)
        nc.append(col)
    return nc
