import pydash
import requests

from V2.functions.BlankProducts.main import BlankProduct, BlankVariant
from V2.functions.Images.main import Image
from V2.Params import Params

# Updated API key for Ascolour Australia
au_api_key = "9a6b756f324c4d04b7ed042e158abbcf"

imageTypes = dict(
    MAIN="primary",
    FRONT="front",
    BACK="back",
)


def getAscolourAuProducts(pageNumber=1):
    """Fetch Ascolour Australia products."""
    url = f"https://api.ascolour.com.au/v1/catalog/products?pageNumber={pageNumber}"
    res = requests.get(url, headers={"Subscription-Key": au_api_key})
    return res.json().get("data")


def getAscolourAuProductVariants(productId):
    """Fetch product variants for Ascolour Australia."""
    all_variants = []
    page_number = 1  

    while True:
        url = f"https://api.ascolour.com.au/v1/catalog/products/{productId}/variants?PageNumber={page_number}"
        res = requests.get(url, headers={"Subscription-Key": au_api_key})
        
        if res.status_code != 200:
            raise Exception(f"Failed to fetch data: {res.status_code} - {res.text}")
        
        data = [v for v in res.json().get("data")]
        # print(page_number, len(data))
        if not data:  
            break
        
        all_variants.extend(data)  
        page_number += 1  
    # print("variants for ", productId, len(all_variants))
    return all_variants


def getAscolourAuProductImages(productId):
    """Fetch product images for Ascolour Australia."""
    url = f"https://api.ascolour.com.au/v1/catalog/products/{productId}/images"
    res = requests.get(url, headers={"Subscription-Key": au_api_key})
    return res.json().get("data")


def UpdateAscolourAuProducts(params: Params):
    """Update and save Ascolour Australia products."""
    products = getAscolourAuProducts(params.args.get("pageNumber", 1))
    blankProductId = params.args.get("blankProductId")

    if blankProductId:
        products = [p for p in products if p.get("styleCode") == blankProductId]

    for p in products:
        print(p.get("styleCode"), p.get("styleName"))

    for product in products:
        images = getAscolourAuProductImages(product.get("styleCode"))
        blankProduct = BlankProduct(
            id=f"ASAU{product.get('styleCode')}",
            name=product.get("styleName"),
            description=product.get("description"),
            blankProductId=product.get("styleCode"),
            brand="Ascolour Australia",
            public=True,
            images=[dict(url=image.get("urlZoom"), type=imageTypes.get(image.get("imageType"))) for image in images],
            primaryImage=next((image.get("urlZoom") for image in images if image.get("imageType") == "MAIN"), None),
            supplierName="Ascolour Australia",
            supplierId="ASAU",
            style=product.get("styleCode"),
            categories=[],
            tags=[]
        )
        blankVariants = [
            BlankVariant(
                blankProductId=product.get("styleCode"),
                color=variant.get("colour"),
                size=variant.get("sizeCode"),
                style=product.get("styleCode"),
                weight=variant.get("weight"),
                description=variant.get("name"),
                images=get_variant_images(variant.get("colour"), images),
                id=variant.get("sku"),
                colorCode=None,
                gtin=None,
                weightUnit="grams"
            ) for variant in getAscolourAuProductVariants(product.get("styleCode"))
        ]
        blankProduct.save(blankVariants)
        print(f"{round((products.index(product) / len(products)) * 100, 2)}%", product.get("styleCode"))

    return products


def get_variant_images(variant_color, images):
    """Extracts images for a specific blank variant from an array of image objects."""
    variant_images = []
    for image in images:
        image_type = image.get("imageType")
        if image_type == variant_color or image_type == f"{variant_color} - BACK":
            image_dict = {
                "url": image.get("urlZoom"),
                "type": "Rear" if image_type == f"{variant_color} - BACK" else "Front",
                "color": variant_color
            }
            variant_images.append(image_dict)
    return variant_images