import json
import tempfile
import traceback
from datetime import datetime

import requests

from functions.Bigcartel.Auth import getAuth
from V2.functions.Applications.main import Application
from V2.functions.Images.main import Image
from V2.functions.LastUpdate import LastUpdate
from V2.functions.Products.main import Product
from V2.functions.Products.Variants import Property, Variant
from V2.functions.Shops.main import Shop, getShopsByPlatformId
from V2.middlewares.auth import API_Error
from V2.Params import Params


def updateAllProducts(params:Params):
    shops = getShopsByPlatformId(platformId="8", credentials= True)
    return str([updateShopProducts(shop) for shop in shops])

def updateShopProducts(shop:Shop):      
    try:    
        shopId = shop.id
        res = getBigcartelProducts(shop)
        products = res.get("data")
        included = res.get("included")
        savedProducts = []
        for product in products:
            platformProductId = str(product.get("id"))
            relationships = product.get("relationships")
            variantIds = [variant.get("id") for variant in relationships.get("options").get("data") if variant.get("type")=="product_options"]
            variants = [variant for variant in included if variant.get("type")=="product_options" and variant.get("id") in variantIds]
            images= Image(url=product.get("attributes").get("primary_image_url")),
            convertedProduct = Product(
                id=shop.platformId+shop.id+platformProductId,
                uid=shop.uid, 
                platformId=shop.platformId,
                shopId=shopId,
                enterpriseId=shop.enterpriseId,
                platformProductId=platformProductId,
                name = product.get("attributes").get("name"),
                description = product.get("attributes").get("description"),
                createdAt= datetime.fromisoformat(product.get("attributes").get("created_at").replace("Z","")),
                updatedAt= datetime.fromisoformat(product.get("attributes").get("updated_at").replace("Z","")),
                price = 0,
                tags = [],
                images = images
            )
            variants = [Variant(
                id=variant.get("id"),
                uid=shop.uid,
                enterpriseId=shop.enterpriseId,
                productId=convertedProduct.id,
                # ignore sku for app.myshirtpod.com
                price=0,
                properties=[dict(
                    name=variant.get("attributes").get("name"),
                    value=variant.get("attributes").get("name")
                )]
            ) for variant in variants]
            savedProducts.append(convertedProduct.save(variants=variants))
        return savedProducts
    except Exception as e:
        traceback.print_exc()
        raise API_Error(e)

def getBigcartelProducts(shop:Shop):
    url = f"https://api.bigcartel.com/v1/accounts/{shop.platformShopId}/products.json"
    res = requests.get(url, headers=getAuth(shop.accessToken))
    if res.status_code in [200,201]: return res.json()
    raise API_Error(res.text, status_code=res.status_code)