import os
import shutil

import requests
from barcode import Code128
from barcode.writer import ImageWriter
from flask import send_file

from configs.firebase import bucket, db
from functions.Response import API_Error
from functions.Storage import get_file_path, saveFile


def getBarcodeSettings(enterpriseId:str):
    ref = db.collection("enterprises").document(enterpriseId).collection('settings').document('barcodeSettings').get()
    if ref.exists:
        return ref.to_dict()
    return dict(
        module_width = 0.5,
        module_height = 20,
        font_size = 35,
        text_distance = 3.0,
        quite_zone = 6.0,
    )

def saveBarcodes(params:dict):
    enterpriseId , batchId, itemId = params.get('enterpriseId'), params.get('batchId'),params.get('itemId')
    my_code = Code128(itemId,writer=ImageWriter())
    source_file_name = get_file_path(f"{itemId}.png")
    blob = bucket.blob(f"enterprises/{enterpriseId}/batches/{batchId}/barcodes/{itemId}.png")
    barcodeSetting = getBarcodeSettings(enterpriseId)
    file  = my_code.save(source_file_name, barcodeSetting)
    blob.upload_from_filename(file)
    os.remove(file)
    url = blob.public_url
    barcodeSetting['itemId'] = itemId
    barcodeSetting['url'] = url
    barcodesRef = db.collection('enterprises').document(enterpriseId).collection('batches').document(batchId).collection('barcodes').document(itemId)
    barcodesRef.set(barcodeSetting)
    return barcodeSetting

def zipImages(params:dict):
    enterpriseId, uid , batchId = params.get("currentUser").get('enterpriseId'),params.get("currentUser").get('uid'), params.get('id')
    ref = db.collection('enterprises').document(enterpriseId).collection('batches').document(batchId).get()
    if not ref.exists: raise API_Error(f"Batch {batchId} does not exist")
    batch = ref.to_dict()
    imagesZip = batch.get('imagesZip')
    if imagesZip: return imagesZip
    items = db.collection('enterprises').document(enterpriseId).collection('batches').document(batchId).collection("batchItems").get()
    images = []
    for item in items:
        item = item.to_dict()
        images.extend([dict(
            url = i.get("printFile", {}).get("url", i.get("url")),
            # url = i.get("url"),
            itemId = item.get("id"),
            # name = i.get("name")
            name = i.get("printFile", {}).get("name", i.get("name")),
        ) for i in item.get("images")])
    folder = get_file_path(batchId)
    if not os.path.exists(folder):
        os.makedirs(folder)
    for image in images:
        url = image.get("url")
        name = image.get("name")
        itemId = image.get("itemId")
        res = requests.get(url)
        file = f"{folder}/{itemId}_{name}.{url.split('.')[-1]}"
        with open(file, "wb+") as f:
            f.write(res.content)
    path = shutil.make_archive(f"{get_file_path(batchId)}_zip", 'zip', folder)
    data = saveFile(uid, enterpriseId,fileName=f"{batchId}.zip", source_file_name=path, private=False, type="misc")
    ref.reference.update({"imagesZip": data})
    return data