from datetime import datetime, timedelta

import pytz

from configs.firebase import db
from V2.functions.Printify.Orders import PRINTIFY_SKUS
from V2.functions.Printify.Params import Location, PrintifyParams
from V2.middlewares.auth import PrintifyError


def getPrintifyStock(params:PrintifyParams) -> dict:
    user = params.currentUser
    location  = params.location
    limit = params.args.get("limit", 20)
    offset = params.args.get("offset", 0)
    printifyStock = {}
    printifySkus = {value.upper():key for key, value in PRINTIFY_SKUS.items()}
    inventoryVariants = db.collection(f"enterprises/{user.enterpriseId}/locations/{location.id}/inventoryVariants").limit(int(limit)).get()
    for variant in inventoryVariants:
        variant = variant.to_dict()
        stock = int(variant.get('stock', {}).get("on_hand", 0))
        name = str(variant.get("name")).upper()
        name = printifySkus.get(name)
        if name:
            printifyStock[name] = dict(
                status = "in-stock" if stock > 0 else "out-of-stock",
                stock = stock,
            )
    return printifyStock


def getPrintifyProductStock(params: PrintifyParams) -> dict:
    user = params.currentUser
    location = params.location
    requestedSku:str = params.args.get("sku")
    sku = None
    for printifySku, mySku in PRINTIFY_SKUS.items():
        if str(printifySku).lower() == str(requestedSku).lower(): sku = mySku
    if not sku: 
        raise PrintifyError(status_code =  404, errors=[
        dict(
            type="sku",
            message=f"Specified sku {requestedSku} does not exist."
        )
    ])
    ref = db.collection(f"enterprises/{user.enterpriseId}/locations/{location.id}/inventoryVariants").where("name", 'in', [sku, sku.upper(), sku.lower(),sku.capitalize()]).get()
    if len(ref) > 0:
        variant = ref[0].to_dict()
        on_hand = int(variant.get("stock", {}).get("on_hand", 0))
        stock  = dict(
            status = "in-stock" if on_hand else "out-of-stock",
            stock = on_hand
        )
        return stock
    return dict(
        stock=0,
        status="out-of-stock",
    )


def getPrintifyStockAtLocation(params: PrintifyParams) -> dict:
    user = params.currentUser
    locationId = params.id
    location = Location.get(user.enterpriseId,locationId)
    if not location:
        raise PrintifyError(status_code = 404, errors=[dict(
            type='facility_id',
            message=f"Specified facility {locationId} is invalid"
        )])
    requestedSku:str = params.args.get("sku")
    sku = None
    for printifySku, mySku in PRINTIFY_SKUS.items():
        if str(printifySku).lower() == str(requestedSku).lower(): sku = mySku
    if not sku: raise PrintifyError(status_code =404, errors=[
        dict(
            type="sku",
            message=f"Specified sku {requestedSku} does not exist."
        )
    ])
    ref = db.collection(f"enterprises/{user.enterpriseId}/locations/{locationId}/inventoryVariants").where("name", 'in', [sku, sku.upper(), sku.lower(),sku.capitalize()]).get()
    if len(ref) > 0:
        variant = ref[0].to_dict()
        on_hand = variant.get("stock", {}).get("on_hand", 0)
        stock  = dict(
            status = "in-stock" if on_hand else "out-of-stock",
            stock = on_hand
        )
        today = datetime.now(tz=pytz.timezone("US/Eastern"))
        offset = today.strftime("%z")
        offset = f"{offset[:3]}:{offset[3:]}"
        restock_estimate = ((datetime(today.year, today.month, today.day, today.hour,0,0,0) + timedelta(days=1)).strftime("%Y-%m-%dT%H:%M:%S"))
        restock_estimate+=offset
        if stock.get("status") == "out-of-stock": stock['restock_estimate'] = restock_estimate
        return stock
    return dict(
        stock=0,
        status="out-of-stock",
    )