"""
Generate color map images and fill in the docs to point to them.

"""
from __future__ import print_function

import argparse
import os
import sys
from importlib import import_module

from jinja2 import Template
from palettable.palette import Palette

MODULES = {
    'palettable.colorbrewer.diverging': './colorbrewer/diverging',
    'palettable.colorbrewer.qualitative': './colorbrewer/qualitative',
    'palettable.colorbrewer.sequential': './colorbrewer/sequential',
    'palettable.tableau': './tableau',
    'palettable.wesanderson': './wesanderson',
    'palettable.cubehelix': './cubehelix',
    'palettable.matplotlib': './matplotlib',
    'palettable.mycarta': './mycarta',
    'palettable.cmocean.diverging': './cmocean/diverging',
    'palettable.cmocean.sequential': './cmocean/sequential',
    'palettable.cartocolors.diverging': './cartocolors/diverging',
    'palettable.cartocolors.qualitative': './cartocolors/qualitative',
    'palettable.cartocolors.sequential': './cartocolors/sequential',
}


def find_palettes(mod):
    """
    Find all Palette instances in mod.

    """
    return {
        k: v for k, v in vars(mod).items()
        if isinstance(v, Palette) and not k.endswith('_r')}


def gen_images(palettes, dir_):
    """
    Create images for each palette in the palettes dict.
    For qualitative palettes only the discrete images is made.

    """
    img_dir = os.path.join(dir_, 'img')
    os.makedirs(img_dir, exist_ok=True)

    discrete_fmt = '{}_discrete.png'.format
    continuous_fmt = '{}_continuous.png'.format

    img_size = (6, 0.5)

    for name, p in palettes.items():
        print('Making discrete image for palette {}'.format(name))
        p.save_discrete_image(
            os.path.join(img_dir, discrete_fmt(name)), size=img_size)

        if p.type != 'qualitative':
            print('Making continuous image for palette {}'.format(name))
            p.save_continuous_image(
                os.path.join(img_dir, continuous_fmt(name)), size=img_size)


def render_doc_page(dir_, palette_names, palette_dict):
    """
    Render the documentation page in a given directory.

    """
    print('Rendering index in dir {}'.format(dir_))

    with open(os.path.join(dir_, 'index.md.tpl')) as f:
        tpl = Template(f.read())

    with open(os.path.join(dir_, 'index.md'), 'w') as f:
        f.write(tpl.render(palettes=palette_names, palette_dict=palette_dict))


def palette_name_sort_key(name):
    base, length = name.rsplit('_', maxsplit=1)
    return base, int(length)


def mkdocs(mod, dir_, images=False):
    palettes = find_palettes(mod)
    if images:
        gen_images(palettes, dir_)
    render_doc_page(
        dir_, sorted(palettes.keys(), key=palette_name_sort_key), palettes)


def parse_args(args=None):
    parser = argparse.ArgumentParser(
        description='Build Palettable documentation.')
    parser.add_argument(
        '-i', '--images', action='store_true', help='force rebuild images')
    return parser.parse_args(args)


def main(args=None):
    args = parse_args(args)

    for mod, dir_ in MODULES.items():
        print('Running module {}'.format(mod))
        mkdocs(import_module(mod), dir_, images=args.images)


if __name__ == '__main__':
    sys.exit(main())
