#WEBSITEBUILDERADDONENGINE

import os
import zipfile
import urllib.request

from PyQt5.QtWidgets import (
    QDialog,
    QVBoxLayout,
    QLabel,
    QProgressBar,
    QApplication
)
from PyQt5.QtCore import Qt


def INIT(api):
    api.log("Addon Downloader library loaded")


def download(url, save_path, api=None, show_gui=True):
    folder = os.path.dirname(save_path)

    if folder:
        os.makedirs(folder, exist_ok=True)

    dialog = None
    progress = None
    label = None

    if show_gui:
        dialog = QDialog(api.window if api else None)
        dialog.setWindowTitle("Downloading")
        dialog.setWindowModality(Qt.ApplicationModal)
        dialog.setFixedSize(350, 90)

        layout = QVBoxLayout(dialog)

        label = QLabel("Preparing...")
        progress = QProgressBar()

        progress.setRange(0, 100)
        progress.setValue(0)

        layout.addWidget(label)
        layout.addWidget(progress)

        dialog.show()
        QApplication.processEvents()

    def report(block_num, block_size, total_size):
        if total_size <= 0:
            return

        percent = int(block_num * block_size * 100 / total_size)
        percent = min(percent, 100)

        if api:
            api.log(f"Downloading... {percent}%")

        if progress:
            progress.setValue(percent)
            label.setText(f"Downloading... {percent}%")
            QApplication.processEvents()

    urllib.request.urlretrieve(
        url,
        save_path,
        reporthook=report
    )

    if progress:
        progress.setValue(100)
        label.setText("Finished")
        QApplication.processEvents()

    if dialog:
        dialog.close()

    if api:
        api.log(f"Downloaded: {save_path}")

    return save_path


def unpack(zip_file, destination=None, api=None):
    """
    Extracts a zip archive.

    zip_file -> archive.zip
    destination -> folder to extract into
    """

    if destination is None:
        destination = os.path.splitext(zip_file)[0]

    os.makedirs(destination, exist_ok=True)

    if api:
        api.log("Extracting...")

    with zipfile.ZipFile(zip_file, "r") as archive:
        archive.extractall(destination)

    if api:
        api.log("Extraction finished")

    return destination