from configs.firebase import SERVER_TIMESTAMP, db
from functions.LastUpdated import productsLastUpdated, saveProductsLastUpdated
from functions.Products import (convertImage, convertProduct, convertProperty,
                                convertVariant, saveProduct)
from functions.Response import API_Error
from functions.Shops import getShops
from functions.Square.Auth import getClient
from functions.Suppliers.BlankProducts import removehtml, worker


def updateAllProducts(data):
    shops = getShops(platformId="4", credentials= True)
    res =  worker(updateShopProducts, shops)
    return str(res)

def getProducts(client, cursor=None):
    result = client.catalog.list_catalog(
        types = "ITEM,IMAGE,ITEM_OPTION",
        cursor = cursor,
    )
    if result.is_success():
        return (result.body.get('objects')), result.body.get('cursor')
    elif result.is_error():
        raise API_Error(result.errors, 400)

def updateShopProducts(shop):
    if shop:
        updates = []
        uid = shop.get('uid')
        shopId = shop.get('id')
        accessToken = shop.get('accessToken')
        # lastUpdate = productsLastUpdated(shopId)
        client = getClient(accessToken)
        products = []
        images = {}
        options = {}
        response, cursor = getProducts(client)
        products.extend([r  for r in response if r.get("type") == "ITEM"])
        images.update({r.get("id"): r for r in response if r.get("type") == "IMAGE"})
        options.update({r.get('id'):r  for r in response if r.get("type") == "ITEM_OPTION"})
        while cursor:
            response = getProducts(client, cursor)
            products.extend([r  for r in response if r.get("type") == "ITEM"])
            images.update({r.get("id"): r for r in response if r.get("type") == "IMAGE"})
            options.update({r.get('id'):r  for r in response if r.get("type") == "ITEM_OPTION"})
            cursor = response.get('cursor')
        for product in products:
            item_data = product.get('item_data')
            image_id = product.get("image_id")
            image = images.get(image_id, {}).get('image_data',{})
            convertedProduct = convertProduct(
                        uid=uid,
                        shopId = shopId,
                        platformId = shop.get('platformId'),
                        enterpriseId= shop.get('enterpriseId'),
                        platformProductId = product.get('id'),
                        name = item_data.get('name'),
                        description= "",
                        createdAt = SERVER_TIMESTAMP,
                        updatedAt= SERVER_TIMESTAMP,
                        tags = [],
                        images = [
                            convertImage(
                                url = image.get('url'),
                                id= image_id,
                            )
                        ] if image else [],
                )
            variants = item_data.get('variations')
            convertedVariants = []
            for variant in variants:
                item_variation_data = variant.get('item_variation_data')
                # item_option_values = item_variation_data.get('item_option_values')
                # properties = []
                # for option in item_option_values:
                #     item_option= options.get(option.get('item_option_id'))
                #     if not item_option: continue
                #     item_option_data = item_option.get('item_option_data')
                #     values = {value.get('id'): value for value in item_option_data.get('values', [])}
                #     properties.append(
                #         convertProperty(
                #             name = item_option_data.get('name'),
                #             id = option.get('item_option_id'), 
                #             value = values.get(option.get('item_option_value_id')).get('item_option_value_data').get('name'))
                #         )

                item_variation_data = variant.get('item_variation_data')
                properties = [
                    convertProperty(
                            name = "Variation name",
                            id = "1", 
                            value = item_variation_data.get("name")
                    )
                ]
                convertedVariant = convertVariant(
                    id = variant.get('id'),
                    price = float(item_variation_data.get('price_money').get("amount")/100),
                    # ignore sku for app.myshirtpod.com
                    sku = None if shop.get('enterpriseId') == "lJ2eUFov5WyPlRm4geCr" else  item_variation_data.get('sku'),
                    properties=properties,
                    deleted=bool(variant.get('is_deleted')),
                    imageId=product.get('image_id'),
                )
                convertedVariants.append(convertedVariant)
            updates.append(saveProduct(convertedProduct, convertedVariants))
        saveProductsLastUpdated(shopId, len(products), total = len(products))
        return f"Products Updated => {len(updates)}"
    return

def getCatalogObject(client, objectId):
    result = client.catalog.retrieve_catalog_object(
        object_id = objectId,
        include_related_objects = True
    )   
    if result.is_success():
        return result.body
    elif result.is_error():
        print(result.errors)

def saveSquareProduct(response, shop, client):
    product = next((p for p in response.get("related_objects") if p.get("type") == "ITEM"), None)
    productResponse = getCatalogObject(client, product.get("id"))
    # print("PRODUCT", productResponse)
    item_data = productResponse.get("object")
    relatedObjects = productResponse.get("related_objects")
    images= { r.get("id"): r for r in relatedObjects if r.get("type") == "IMAGE"}
    options = {r.get('id'):r  for r in relatedObjects if r.get("type") == "ITEM_OPTION"}
    item_data = product.get('item_data')
    image_id = product.get("image_id")
    image = images.get(image_id, {}).get('image_data',{})
    convertedProduct = convertProduct(
                uid=shop.get("uid"),
                shopId = shop.get("id"),
                platformId = shop.get('platformId'),
                enterpriseId= shop.get('enterpriseId'),
                platformProductId = product.get('id'),
                name = item_data.get('name'),
                description= "",
                createdAt = SERVER_TIMESTAMP,
                updatedAt= SERVER_TIMESTAMP,
                tags = [],
                images = [
                    convertImage(
                        url = image.get('url'),
                        id= image_id,
                    )
                ] if image else [],
        )
    variants = item_data.get('variations')
    convertedVariants = []
    for variant in variants:
        item_variation_data = variant.get('item_variation_data')
        # item_option_values = item_variation_data.get('item_option_values', [])
        properties = [
            convertProperty(
                    name = "Variation name",
                    id = "1", 
                    value = item_variation_data.get("name")
            )
        ]
        # for option in item_option_values:
        #     item_option= options.get(option.get('item_option_id'))
        #     if not item_option: continue
        #     item_option_data = item_option.get('item_option_data')
        #     values = {value.get('id'): value for value in item_option_data.get('values', [])}
        #     properties.append(
        #         convertProperty(
        #             name = item_option_data.get('name'),
        #             id = option.get('item_option_id'), 
        #             value = values.get(option.get('item_option_value_id')).get('item_option_value_data').get('name'))
        #         )
        convertedVariant = convertVariant(
            id = variant.get('id'),
            price = float(item_variation_data.get('price_money').get("amount")/100),
            # ignore sku for app.myshirtpod.com
            sku = None if shop.get('enterpriseId') == "lJ2eUFov5WyPlRm4geCr" else  item_variation_data.get('sku'),
            properties=properties,
            deleted=bool(variant.get('is_deleted')),
            imageId=product.get('image_id'),
        )
        convertedVariants.append(convertedVariant)
    id = saveProduct(convertedProduct, convertedVariants)
    return convertedProduct, convertedVariants