#!/usr/bin/env python3

import os.path
import collections
import json
import copy

from constants import constants
from PackageManager import PackageManager
from SpecData import SPECS
from PackageInfo import PackageInfo


class Builder:
    def buildSpecifiedPackages(
        listPackages,
        buildThreads,
        pkgBuildType,
        pkgInfoJsonFile=None,
        logger=None,
        build_extra_pkgs=False,
    ):
        if constants.rpmCheck:
            constants.setTestForceRPMS(copy.copy(listPackages))

        pkgManager = PackageManager(pkgBuildType=pkgBuildType)

        if not build_extra_pkgs:
            listPackages = set(listPackages) - set(constants.extraPackagesList)

        pkgManager.buildPackages(listPackages, buildThreads)

        if pkgInfoJsonFile:
            # Generating package info file which is required by installer
            if logger:
                logger.debug(
                    f"Writing Package info to the file: {pkgInfoJsonFile}"
                )
            pkgInfo = PackageInfo()
            pkgInfo.loadPackagesData()
            pkgInfo.writePkgListToFile(pkgInfoJsonFile)

    def buildPackagesInJson(
        pkgJsonInput, buildThreads, pkgBuildType, pkgInfoJsonFile, logger
    ):
        listPackages = []
        with open(pkgJsonInput) as jsonData:
            pkg_list_json = json.load(jsonData)
            listPackages = pkg_list_json["packages"]
            archSpecificPkgs = f"packages_{constants.buildArch}"
            if archSpecificPkgs in pkg_list_json:
                listPackages += pkg_list_json[archSpecificPkgs]

        Builder.buildSpecifiedPackages(
            listPackages, buildThreads, pkgBuildType, pkgInfoJsonFile, logger
        )

    def buildPackagesForAllSpecs(
            buildThreads, pkgBuildType, pkgInfoJsonFile, logger
    ):
        listPackages = SPECS.getData().getListPackages()
        Builder.buildSpecifiedPackages(
            listPackages, buildThreads, pkgBuildType, pkgInfoJsonFile, logger
        )

    def get_packages_with_build_options(pkg_build_options_file):
        if os.path.exists(pkg_build_options_file):
            with open(pkg_build_options_file) as jsonData:
                pkg_build_option_json = json.load(
                    jsonData, object_pairs_hook=collections.OrderedDict
                )
                constants.setBuildOptions(pkg_build_option_json)

    def get_baseurl(conf_file):
        with open(conf_file) as jsonFile:
            config = json.load(jsonFile)
        return config["baseurl"]

    def get_all_package_names(build_install_option):
        base_path = os.path.dirname(build_install_option)
        packages = []

        with open(build_install_option) as jsonData:
            option_list_json = json.load(
                jsonData, object_pairs_hook=collections.OrderedDict
            )
            options_sorted = option_list_json.items()

            for install_option in options_sorted:
                filename = os.path.join(base_path, install_option[1]["file"])
                with open(filename) as pkgJsonData:
                    package_list_json = json.load(pkgJsonData)
                packages = packages + package_list_json["packages"]

        return packages