from inventree.api import InvenTreeAPI
from inventree.part import Part, PartCategory
from inventree.base import Parameter
from inventree.company import Company, ManufacturerPart, SupplierPart, ManufacturerPartParameter

import os
import sys
import digikey
from digikey.v3.productinformation import KeywordSearchRequest

os.environ['DIGIKEY_CLIENT_ID'] = 'DjV4w1v0ebNTiL7Nqvslw0GkNYuYdrLG'
os.environ['DIGIKEY_CLIENT_SECRET'] = 'dK0dTRimeq3aiPH1'
os.environ['DIGIKEY_CLIENT_SANDBOX'] = 'False'
os.environ['DIGIKEY_STORAGE_PATH'] = 'C:\\Users\\Oliver\\Desktop\\digikey\\'

INVENTREE_URL = "http://localhost:8000"
INVENTREE_USERNAME = "admin"
INVENTREE_PASSWORD = "inventree"

inventree = InvenTreeAPI(INVENTREE_URL, username=INVENTREE_USERNAME, password=INVENTREE_PASSWORD)

resistors = Part.list(inventree, category=6)

def getParameter(result, name):

    for param in result.parameters:
        if param.parameter.lower() == name.lower():
            return param

    return None


def getValue(result, name):

    param = getParameter(result, name)

    if param:
        return param.value
    else:
        return None

manufacturers = {}

DIGIKEY_PK = 1

for res in resistors:

    search_term = res.name.replace('_', ' ').replace('C ' , 'Capacitor ceramic X7R ')

    print(f"Capacitor: {res.name} -> {search_term}")

    request = KeywordSearchRequest(search_term, record_count=25)

    result = digikey.keyword_search(body=request)

    # Set of manufacturer part numbers
    MPN = set()

    if len(result.products) == 0:
        print("--- NO RESULTS FOUND ---")

    for product in result.products:

        mpn = product.manufacturer_part_number

        if mpn in MPN or len(MPN) >= 2:
            continue

        print(f"MPN > {mpn}")

        MPN.add(mpn)

        sku = product.digi_key_part_number

        man_name = product.manufacturer.value

        if man_name in manufacturers.keys():
            manufacturer = manufacturers[man_name]
        else:

            # Search InvenTree for manufacturer name
            query = Company.list(inventree, search=man_name)

            if len(query) == 0:

                print(f"Creating new manufacturer: '{man_name}'")
                
                manufacturer = Company.create(inventree, data={
                    'is_supplier': False,
                    'is_manufacturer': True,
                    'name': man_name,
                })

            else:
                manufacturer = query[0]

            if manufacturer == None:
                continue

            manufacturers[man_name] = manufacturer

        m_parts = ManufacturerPart.list(inventree, MPN=mpn)

        if len(m_parts) == 0:
            print(f"Creating new part: {man_name} -> {mpn}")
            manufacturer_part = ManufacturerPart.create(inventree, data={
                'part': res.pk,
                'manufacturer': manufacturer.pk,
                'MPN': mpn,
            })

            print(manufacturer_part)
        else:
            manufacturer_part = m_parts[0]

        # Check if a "supplier part" exists
        s_parts = SupplierPart.list(
            inventree,
            manufacturer_part=manufacturer_part.pk,
            supplier=DIGIKEY_PK
        )

        if s_parts is None or len(s_parts) == 0:
            print(f"Creating new supplier part")

            SupplierPart.create(inventree, data={
                'part': res.pk,
                'supplier': DIGIKEY_PK,
                'manufacturer_part': manufacturer_part.pk,
                'SKU': sku,
                'link': product.product_url,
                'description': product.product_description,
            })