# pylint: disable=invalid-name,missing-docstring
import os
from SpecParser import SpecParser
from StringUtils import StringUtils

class Specutils(object):

    def __init__(self, specfile):
        self.specfile = ""
        self.spec = SpecParser()
        if Specutils._isSpecFile(specfile):
            self.specfile = specfile
            self.spec.parseSpecFile(self.specfile)

    @staticmethod
    def _isSpecFile(specfile):
        if os.path.isfile(specfile) and specfile.endswith(".spec"):
            return True
        return False

    def getSourceNames(self):
        sourceNames = []
        strUtils = StringUtils()
        pkg = self.spec.packages.get('default')
        if pkg is None:
            return None
        for source in pkg.sources:
            sourceName = strUtils.getFileNameFromURL(source)
            sourceNames.append(sourceName)
        return sourceNames

    def getChecksums(self):
        pkg = self.spec.packages.get('default')
        return pkg.checksums

    def getPatchNames(self):
        patchNames = []
        strUtils = StringUtils()
        pkg = self.spec.packages.get('default')
        if pkg is None:
            return None
        for patch in pkg.patches:
            patchName = strUtils.getFileNameFromURL(patch)
            patchNames.append(patchName)
        return patchNames

    def getPackageNames(self):
        packageNames = []
        for pkg in self.spec.packages.values():
            packageNames.append(pkg.name)
        return packageNames

    def getIsRPMPackage(self, pkgName):
        defaultPkgName = self.spec.packages['default'].name
        if pkgName == defaultPkgName:
            pkgName = "default"
        if pkgName in self.spec.packages.keys():
            pkg = self.spec.packages.get(pkgName)
            if pkg.filesMacro is not None:
                return True
        return False

    def getRPMNames(self):
        rpmNames = []
        for pkg in self.spec.packages.values():
            rpmName = pkg.name + "-" + pkg.version + "-" + pkg.release
            rpmNames.append(rpmName)
        return rpmNames

    def getLicense(self):
        pkg = self.spec.packages.get('default')
        if pkg is None:
            return None
        return pkg.license

    def getURL(self):
        pkg = self.spec.packages.get('default')
        if pkg is None:
            return None
        return pkg.URL

    def getSourceURL(self):
        pkg = self.spec.packages.get('default')
        if pkg is None:
            return None
        if not pkg.sources:
            return None
        sourceURL = pkg.sources[0]
        if sourceURL.startswith("http") or sourceURL.startswith("ftp"):
            return sourceURL
        return None

    def getRequiresAllPackages(self):
        dependentPackages = []
        for pkg in self.spec.packages.values():
            for dpkg in pkg.requires:
                dependentPackages.append(dpkg)
        listDependentPackages = list(set(dependentPackages))
        packageNames = self.getPackageNames()
        for pkgName in packageNames:
            for objName in listDependentPackages:
                if objName.package == pkgName:
                        dependentPackages.remove(objName)
        dependentPackages = list(set(dependentPackages))
        return dependentPackages

    def getBuildRequiresAllPackages(self):
        dependentPackages = []
        for pkg in self.spec.packages.values():
            for dpkg in pkg.buildrequires:
                dependentPackages.append(dpkg)
        listDependentPackages = list(set(dependentPackages))
        packageNames = self.getPackageNames()
        for pkgName in packageNames:
            for objName in listDependentPackages:
                if objName.package == pkgName:
                        dependentPackages.remove(objName)
        dependentPackages = list(set(dependentPackages))
        return dependentPackages

    def getCheckBuildRequiresAllPackages(self):
        dependentPackages = []
        for pkg in self.spec.packages.values():
            for dpkg in pkg.checkbuildrequires:
                dependentPackages.append(dpkg)
        dependentPackages = list(set(dependentPackages))
        return dependentPackages

    def getRequires(self, pkgName):
        dependentPackages = []
        for pkg in self.spec.packages.values():
            if pkg.name == pkgName:
                for dpkg in pkg.requires:
                    dependentPackages.append(dpkg.package)
        return dependentPackages

    def getProvides(self, packageName):
        dependentPackages = []
        defaultPkgName = self.spec.packages['default'].name
        pkg = None
        if packageName in self.spec.packages:
            pkg = self.spec.packages.get(packageName)
        if defaultPkgName == packageName:
            pkg = self.spec.packages['default']
        if pkg is not None:
            for dpkg in pkg.provides:
                dependentPackages.append(dpkg.package)
        else:
            print("package not found")
        return dependentPackages

    def getVersion(self):
        pkg = self.spec.packages.get('default')
        return pkg.version

    def getRelease(self):
        pkg = self.spec.packages.get('default')
        return pkg.release

    def getBasePackageName(self):
        pkg = self.spec.packages.get('default')
        return pkg.name

    def getSecurityHardeningOption(self):
        return self.spec.globalSecurityHardening

    def isCheckAvailable(self):
        check = False
        if self.spec.checkMacro is not None:
            check = True
        return check

    def getDefinitions(self):
        return self.spec.defs

def main():
    spec = Specutils("/workspace1/myrepos/photon/SPECS/docker/docker.spec")
    print("packages {}".format(spec.getPackageNames()))
    print("packages {}".format(spec.getRPMNames()))
    print("sources {}".format(spec.getSourceNames()))
    print("patches {}".format(spec.getPatchNames()))
    print("requires {}".format(spec.getRequires('libltdl-devel')))
    print("requires {}".format(spec.getRequires('libtool')))

    print("provides {}".format(spec.getProvides('libtool')))
    print("all-requires {}".format(spec.getPkgNamesFromObj(spec.getRequiresAllPackages())))
    print("all-build-requires {}".format(spec.getPkgNamesFromObj(spec.getBuildRequiresAllPackages())))

if __name__ == '__main__':
    main()