from datetime import datetime
from gettext import Catalog
import traceback
from functions.Amazon.Auth import createCredentials
from functions.Products import convertImage, convertProduct, convertProperty, convertVariant, saveProduct
from functions.Response import API_Error
from sp_api.api import Catalog

from functions.Shops import getShopById
def updateSingleProduct(params:dict):
    shopId = params.get('shopId')
    shop = params.get("shop", getShopById(shopId, True))
    platformProductId = params.get("platformProductId")
    try:
            uid = shop.get('uid')
            enterpriseId = shop.get('enterpriseId')
            platformId = shop.get("platformId")
            credentials = createCredentials(shop.get("refreshToken"))
            res = getProduct(credentials, platformProductId)
            if not res:return
            product, variant = res
            product = product.get("AttributeSets")[0]
            convertedProduct = convertProduct(
                        uid=uid, 
                        platformId=platformId,
                        shopId=shopId,
                        enterpriseId=enterpriseId,
                        platformProductId=platformProductId,
                        name = product.get("Title"),
                        description = "",
                        createdAt= datetime.now(),
                        updatedAt= datetime.now(),
                        price = float(product.get("ListPrice").get("Amount")),
                        tags = [],
                        images = [
                            convertImage(product.get("SmallImage").get("URL"))
                        ]
                )
            variants = [
                        convertVariant(
                            id = variant.get("Identifiers").get("MarketplaceASIN").get("ASIN"),
                            properties=[
                                convertProperty(
                                name = key, 
                                value = value
                                ) for key, value in variant.get("AttributeSets")[0].items() if key in ["Color", "Size"]
                        ],
                    )
                ]
            print('product', saveProduct(convertedProduct, variants))
            return variant.get("Identifiers").get("MarketplaceASIN").get("ASIN")
    except Exception as e:
            print(traceback.format_exc())
            raise API_Error(str(e),500, meta=dict(shopId=shopId, msg = str(e)))



def getProduct(credentials, platformProductId):
    from sp_api.base import Marketplaces
    res = Catalog(credentials=credentials, marketplace=Marketplaces.US).get_item(
        asin=platformProductId,
        MarketplaceId=Marketplaces.US.marketplace_id,
        includedData="productTypes"
    )
    if not res.errors:
        attr = res.payload.get("AttributeSets")
        Relationships = ("," in attr[0].get("Color", "") or "," in attr[0].get("Size", "")) and len(res.payload.get("Relationships", []))>0 if len(attr)>0 else False
        if Relationships:
            print(f"relation {platformProductId}")
            return res.payload, getVariant(credentials,res.payload.get("Relationships")[0].get("Identifiers").get("MarketplaceASIN").get("ASIN"))
        return res.payload,res.payload
    else:
        print(res.errors)
    return None



def getVariant(credentials, platformProductId):
    from sp_api.base import Marketplaces
    res = Catalog(credentials=credentials, marketplace=Marketplaces.US).get_item(
        asin=platformProductId,
        MarketplaceId=Marketplaces.US.marketplace_id,
        includedData="productTypes"
    )
    if not res.errors:
        return res.payload
    else:
        print(res.errors)
    return None
