import argparse
from itertools import *

import os.path
import yaml
from colors import color

import ee.digikey as dk
from ee.digikey import SearchResponseTypes, DigikeyProduct

parser = argparse.ArgumentParser(description="Download facts about parts from Digi-Key")

parser.add_argument("parts",
                    metavar="PART",
                    nargs="+",
                    help="The parts to download fact for")

parser.add_argument("--out",
                    required=True,
                    metavar="OUTPUT_DIRECTORY",
                    dest="out",
                    action="store",
                    help="A directory to store fact files")

parser.add_argument("--force",
                    dest="force",
                    action="store",
                    help="Always download fact even if there is a local file")

args = parser.parse_args()

digikey = dk.Digikey()
client = dk.DigikeyClient(digikey, on_download=lambda s: print(color(s, 'grey')))


def mpn_to_path(mpn):
    return "{}/{}.yaml".format(args.out, mpn)


def on_product(p: DigikeyProduct):
    y = p.to_yaml()
    with open(mpn_to_path(p.mpn), "w") as f:
        yaml.dump(y, f, encoding="utf-8", allow_unicode=True)


for p in args.parts:
    print(color("Searching for {}".format(p), "white"))
    path = mpn_to_path(p)

    if os.path.isfile(path) and not args.force:
        continue

    response = client.search(p)

    if response.response_type == SearchResponseTypes.SINGLE:
        p = response.products[0]
        print(color("Found {}".format(p.mpn), "white"))
        on_product(p)
    elif response.response_type == SearchResponseTypes.MANY:
        for k, g in groupby(sorted(response.products), lambda p: p.mpn):
            print(color("Found {}".format(k), "white"))
            on_product(list(g)[0])
    elif response.response_type == SearchResponseTypes.TOO_MANY:
        print(color("Too many results ({}), select a category first".format(response.count), 'red'))
    elif response.response_type == SearchResponseTypes.NO_MATCHES:
        print(color("Part not found", "orange"))