from PIL import Image
import requests
import os
import tempfile
from werkzeug.utils import secure_filename
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
cred = credentials.ApplicationDefault()
project_id = os.environ.get("GCP_PROJECT")
firebase_admin.initialize_app(
    cred,
    {
        "projectId": project_id,
    },
)
fs = firestore.client()


def get_file_path(filename):
    # Note: tempfile.gettempdir() points to an in-memory file system
    # on GCF. Thus, any files in it must fit in the instance's memory.
    file_name = secure_filename(filename)
    return os.path.join(tempfile.gettempdir(), file_name)

def isAdmin(uid):
    user = fs.collection("users").document(uid).get().to_dict()
    if user:
        admin = user['admin'] if 'admin' in user.keys() else False
        return admin
    return False

def get_image_from_url(url, name):
    filepath = get_file_path(f"{name}.png")
    f = open(filepath,'wb')
    f.write(requests.get(url).content)
    f.close()
    return filepath


def all_white_pixels(image:Image.Image):
    extrema = image.convert("RGB").getextrema()
    if extrema in  [((0, 0), (0, 0), (0, 0)), ((255, 0), (255, 0), (255, 0))]:
        return "Black"
    elif extrema in [((255, 255), (255, 255), (255, 255)), ((0, 255), (0, 255), (0, 255)) ]:
        return "White"
    return None
        # all white
    # '''Returns True if all white pixels or False if not all white'''
    # H, W = image.shape[:2]
    # gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    # gray_version = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # if cv2.countNonZero(image) == 0:
    #     return "White"
    # if cv2.countNonZero(gray_version) == 0:
    #     return "Black"
    # pixels = cv2.countNonZero(thresh)
    # return "White" if pixels == (H * W) else False

def detect_white_image(url, name):
    #print(url,name)
    filepath = get_image_from_url(url, name)
    image = Image.open(filepath)
    pixels = all_white_pixels(image)
    os.remove(filepath)
    if pixels:
        return f"{pixels} Ink Only"
    else:
        return "Color+White Ink"

def placement_options():
    PLACEMENT_OPTIONS = fs.collection("riverrConfig").document("PLACEMENT_OPTIONS").get().to_dict()
    return PLACEMENT_OPTIONS

def placement_options_v2():
    PLACEMENT_OPTIONS_V2 = fs.collection("riverrConfig").document("PLACEMENT_OPTIONS_V2").get().to_dict()
    return PLACEMENT_OPTIONS_V2

def getImage(uid,itemId, v2=None):
    admin = isAdmin(uid)
    if admin:
        userRef = fs
        batchRef = userRef.collection("batches")
        itemBatches = batchRef.where("contents","array_contains", itemId).get()
    else:
        userRef = fs.collection("users").document(uid)
        batchRef = userRef.collection("batches")
        itemBatches = batchRef.where("contents","array_contains", itemId).get()
    response = {}
    for batch in itemBatches:
        itemRef = batch.reference.collection('items').document(itemId).get()
        if itemRef.exists:
            itemData = itemRef.to_dict()
            user = itemData['user'] if 'user' in itemData.keys() else itemData['uid']
            userRef = fs.collection("users").document(user)
            purchaseOrderData = itemData['purchaseOrderData']
            blankVariant =itemData['blank']['blankVariant']
            response = {}
            response_v2 = {}
            product= itemData['blank']['blankProduct']
            response.update(product)
            response.update(blankVariant)
            response_v2.update(response)
            placement_option = str(purchaseOrderData['placement'])
            response['placement'] = placement_options()[placement_option]
            color = response.get("color")
            image = itemData.get('image')  
            # if color.lower() != "white":
            #     image['print_mode'] = detect_white_image(image['url'], image['name'])
            # else:
            #     image['print_mode'] ="Color Ink Only"
            # response.update(image)
            # itemRef.reference.update(dict(
            #     printing_info = response
            # ))


            ## RESPONSE V2s
            style = response.get("apparelStyle")
            size  = response.get("size")
            if style in ["Mens", "Youth", "Adult", "Unisex"]:
                response_v2['size'] = f'{style} {size}'
            secondary_image = itemData.get("secondary_image") if itemData.get("secondary_image") else dict(name="N/A",url=None)
            placement_config = {
                "1": ["1"],
                "2":["2"],
                "3": ["3"],
                "4": ["4"],
                "5": ["1", "2"],
                "6": ["3", "2"],
                "7": ["4", "2"],
            }
            imageInfo = []
            PLACEMENT_OPTIONS_V2 = placement_options_v2()
            if placement_option in placement_config.keys():
                placement_config = placement_config[placement_option]
                for p in placement_config:
                    url = image.get("url") if placement_config.index(p) == 0 else secondary_image.get("url")
                    name = image.get("name") if placement_config.index(p) == 0 else secondary_image.get("name")
                    if color.lower() != "white":
                        print_mode = detect_white_image(url, name)
                    else:
                        print_mode =  "Color Ink Only"
                    this_image_info = dict(
                        print_mode = print_mode,
                        name=name,
                        url=url
                    )
                    this_image_info.update(PLACEMENT_OPTIONS_V2[p])
                    imageInfo.append(this_image_info)
            response_v2['imageInfo'] = imageInfo
            batch.reference.collection("printing_info_v2").document(itemId).set(response_v2)
            return response if not v2 else response_v2
        else: 
            return "Item not found"
    return "Item not found"

def image_detection(req):
    args=  req.args
    uid = args.get('uid')
    itemId = args.get('itemId')
    v2 = args.get("v2")
    return getImage(uid, itemId, v2)