import matplotlib as mpl
import matplotlib.pyplot as plt
from cycler import cycler

# Palette
P = {
    "bg0": "#282828",
    "bg0-hard": "#1d2021",
    "bg0-soft": "#32302f",
    "bg1": "#3c3836",
    "bg2": "#504945",
    "bg3": "#665c54",
    "bg4": "#7c6f64",
    "fg0": "#fbf1c7",
    "fg0-hard": "#f9f5d7",
    "fg0-soft": "#f2e5bc",
    "fg1": "#ebdbb2",
    "fg2": "#d5c4a1",
    "fg3": "#bdae93",
    "fg4": "#a89984",
    "dark-red": "#cc241d",
    "dark-green": "#98971a",
    "dark-yellow": "#d79921",
    "dark-blue": "#458588",
    "dark-purple": "#b16286",
    "dark-aqua": "#689d6a",
    "dark-orange": "#d65d0e",
    "dark-gray": "#928374",
    "light-red": "#fb4934",
    "light-green": "#b8bb26",
    "light-yellow": "#fabd2f",
    "light-blue": "#83a598",
    "light-purple": "#d3869b",
    "light-aqua": "#8ec07c",
    "light-orange": "#f38019",
    "light-gray": "#a89984",
    "alt-red": "#9d0006",
    "alt-green": "#79740e",
    "alt-yellow": "#b57614",
    "alt-blue": "#076678",
    "alt-purple": "#8f3f71",
    "alt-aqua": "#427b58",
    "alt-orange": "#af3a03",
    "alt-gray": "#7c6f64",
}

COLORS_LIGHT = [
    P["light-blue"],
	P["light-orange"],
	P["light-green"],
	P["light-red"],
	P["light-purple"],
	P["light-yellow"],
	P["light-aqua"],
	P["light-gray"]]

COLORS_DARK = [
    P["dark-blue"],
	P["dark-orange"],
	P["dark-green"],
	P["dark-red"],
	P["dark-purple"],
	P["dark-yellow"],
	P["dark-aqua"],
	P["dark-gray"]]

COLORS_ALT = [
    P["alt-blue"],
	P["alt-orange"],
	P["alt-green"],
	P["alt-red"],
	P["alt-purple"],
	P["alt-yellow"],
	P["alt-aqua"],
	P["alt-gray"]]

COLORS = COLORS_LIGHT

def set_colorscheme(variant="dark"):
    global COLORS
    if variant == "dark":
        FIG_BG_COLOR = P["bg0"]
        PLT_FG_COLOR = P["fg0"]
        PLT_BG_COLOR = P["bg0"]
        PLT_GRID_COLOR = P["bg2"]
        LEGEND_FG_COLOR     = PLT_FG_COLOR
        LEGEND_BG_COLOR     = P["bg1"]
        LEGEND_BORDER_COLOR = P["bg2"]
        COLORS = COLORS_LIGHT
    else:
        FIG_BG_COLOR = P["fg0"]
        PLT_FG_COLOR = P["bg0"]
        PLT_BG_COLOR = P["fg0"]
        PLT_GRID_COLOR = P["fg2"]
        LEGEND_FG_COLOR     = PLT_FG_COLOR
        LEGEND_BG_COLOR     = P["fg1"]
        LEGEND_BORDER_COLOR = P["fg2"]
        COLORS = COLORS_DARK
    if variant == "alt":
      COLORS = COLORS_ALT

    color_rcParams = {
        'axes.edgecolor': PLT_FG_COLOR,
        'axes.facecolor': PLT_BG_COLOR,
        'axes.labelcolor': PLT_FG_COLOR,
        'axes.titlecolor': 'auto',
        # 'axes.prop_cycle': cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']),
        'axes.prop_cycle': cycler('color', COLORS),
        # 'axes3d.xaxis.panecolor': (0.95, 0.95, 0.95, 0.5),
        # 'axes3d.yaxis.panecolor': (0.9, 0.9, 0.9, 0.5),
        # 'axes3d.zaxis.panecolor': (0.925, 0.925, 0.925, 0.5),
        # 'boxplot.boxprops.color': 'black',
        # 'boxplot.capprops.color': 'black',
        # 'boxplot.flierprops.color': 'black',
        # 'boxplot.flierprops.markeredgecolor': 'black',
        # 'boxplot.flierprops.markeredgewidth': 1.0,
        # 'boxplot.flierprops.markerfacecolor': 'none',
        # 'boxplot.meanprops.color': 'C2',
        # 'boxplot.meanprops.markeredgecolor': 'C2',
        # 'boxplot.meanprops.markerfacecolor': 'C2',
        # 'boxplot.meanprops.markersize': 6.0,
        # 'boxplot.medianprops.color': 'C1',
        # 'boxplot.whiskerprops.color': 'black',
        'figure.edgecolor': PLT_BG_COLOR,
        'figure.facecolor': PLT_BG_COLOR,
        # 'figure.figsize': [6.4, 4.8],
        # 'figure.frameon': True,
        # 'figure.labelsize': 'large',
        'grid.color': PLT_GRID_COLOR,
        # 'hatch.color': 'black',
        'legend.edgecolor': LEGEND_BORDER_COLOR,
        'legend.facecolor': LEGEND_BG_COLOR,
        'xtick.color': PLT_FG_COLOR,
        'ytick.color': PLT_FG_COLOR,
        'xtick.labelcolor': PLT_FG_COLOR,
        'ytick.labelcolor': PLT_FG_COLOR,
        # 'lines.color': 'C0',
        'text.color': PLT_FG_COLOR,
    }

    for k, v in color_rcParams.items():
        plt.rcParams[k] = v

    # override single char codes
    mpl.colors.get_named_colors_mapping()["b"] = COLORS[0]
    mpl.colors.get_named_colors_mapping()["o"] = COLORS[1]
    mpl.colors.get_named_colors_mapping()["g"] = COLORS[2]
    mpl.colors.get_named_colors_mapping()["r"] = COLORS[3]
    mpl.colors.get_named_colors_mapping()["m"] = COLORS[4]
    mpl.colors.get_named_colors_mapping()["y"] = COLORS[5]
    mpl.colors.get_named_colors_mapping()["c"] = COLORS[6]
    mpl.colors.get_named_colors_mapping()["k"] = P["fg0"]
    mpl.colors.get_named_colors_mapping()["w"] = P["bg0"]