import os

from .abstractosinstaller import OSInstaller
from .tpinstaller import TPInstallerBasis, EpelRepoInstaller, \
    RpmPackageInstaller, PostgresqlCentOsInstaller
from util.distrowrapper import DistroWrapper
from services import linux_distro


class CentOS7TPInstaller(OSInstaller):
    def __init__(self, profile):
        """
        Installs the CentOS 7 dependencies
        :param Profile profile: installation profile
        """
        super(CentOS7TPInstaller, self).__init__(profile)
        self.needs_repo = False
        self.pkg_gdal_python = ['GDAL==1.11.2',
                                '--global-option=build_ext',
                                '--global-option=-I/usr/include/gdal']
        if self.is_gdal2_installed():
            self.pkg_gdal_python = ['GDAL==2.3.2']

    def is_gdal2_installed(self):
        """
        Returns True if gdal 2.x is already installed on the system
        """
        return os.path.exists("/usr/lib/libgdal.so.20")

    def get_build_core_packages(self):
        ret = ['make', 'libtool', 'autoconf', 'bison', 'flex', 'flex-devel', 'git', 'curl',
               'gcc', 'gcc-c++', 'unzip', 'boost-devel', 'libstdc++-static', 'boost-static',
               'libtiff-devel', 'zlib-devel', 'libedit-devel', 'readline-devel', 'libpng-devel',
               'netcdf-devel', 'postgresql-devel', 'eccodes-devel', 'hdf-devel',
               'sqlite-devel', 'openssl-devel', 'libxml2-devel', 'elfutils-devel']
        if not self.is_gdal2_installed():
            ret = ret + ['gdal-devel']
        return ret

    def get_build_cmake_packages(self):
        """
        cmake version < 3
        """
        return []

    def get_build_java_packages(self):
        ret = ['java-1.8.0-openjdk-devel', 'maven', 'ant']
        if not self.is_gdal2_installed():
            ret = ret + ['gdal-java']
        return ret

    def get_build_doc_packages(self):
        # pdf documentation generated with `make doc-pdf`
        ret = ['python-pip', 'texlive-cm', 'texlive-ec', 'texlive-ucs',
               'texlive-metafont-bin', 'texlive-fncychap', 'texlive-pdftex-def',
               'texlive-fancyhdr', 'texlive-titlesec', 'texlive-framed', 'texlive-wrapfig',
               'texlive-parskip', 'texlive-upquote', 'texlive-ifluatex', 'texlive-cmap',
               'texlive-makeindex-bin', 'texlive-times', 'texlive-courier',
               'texlive-dvips', 'texlive-helvetic', 'latexmk']
        # C++ API documentation
        ret = ret + ['doxygen']
        return ret

    def get_build_pip_packages(self):
        ret = []
        if self.profile.generate_docs:
            ret = ['sphinx==3.0.3', 'sphinx_rtd_theme']
        return ret

    def get_run_core_packages(self):
        ret = ['postgresql-server', 'postgresql-contrib', 'sqlite', 'zlib', 'elfutils',
               'netcdf', 'libtiff', 'libedit', 'readline', 'openssl', 'libxml2', 'which',
               'python3-devel', 'python3-pip', 'python3-setuptools', 'python3-wheel',
               'eccodes', 'hdf', 'sysvinit-tools']
        if not self.is_gdal2_installed():
            ret = ret + ['gdal', 'gdal-devel']
        if self.profile.generate_package:
            # python 2 is required to run the installer as post-install script
            # when installing a package, so it needs to be added in package
            # dependencies when generating the package
            ret += ['python']
        return ret

    def get_run_java_packages(self):
        ret = ['java-1.8.0-openjdk']
        if not self.is_gdal2_installed():
            ret = ret + ['gdal-java']
        if self.profile.webapps_deployment == "external":
            ret += [linux_distro.get_tomcat_name()]
        return ret

    def get_run_pip_packages(self):
        ret = ['jsonschema', 'python-dateutil', 'lxml']
        if self.profile.enterprise:
            # needed for migration rasmgr.auth (in protobuf format) -> RASBASE
            ret.append(self.pkg_protobuf_python)
        return ret

    def get_run_systemtest_packages(self):
        # gtk3-devel is needed for selenium/firefox testing
        # jq for json manipulation in test_oapi for example
        return ['bc', 'vim-common', 'valgrind', 'gcc', 'eccodes-devel', 'gtk3-devel', 'jq']

    def get_run_systemtest_pip_packages(self):
        ret = [self.pkg_grpcio_python, self.pkg_protobuf_python,
               'pyproj', 'pygrib', 'numpy', self.pkg_netcdf_python,
               self.pip_pkg_pylint]
        return ret

    def get_packaging_packages(self):
        # gtk3-devel is needed for selenium/firefox testing
        return ['ruby-devel', 'ruby', 'rpm-build', 'rsync', 'gtk3-devel', 'jq']

    def get_dependencies(self):
        """
        Returns all the dependencies for rasdaman on CentOS
        """
        deps = TPInstallerBasis()
        centos7 = DistroWrapper().distro_version < 8
        repo_tool = 'dnf' if not centos7 else 'yum'
        if self.profile.install_type != "package":
            deps = EpelRepoInstaller(deps, not centos7, repo_tool)
        if self.profile.install_dependencies and self.profile.install_type != "package":
            deps = RpmPackageInstaller(deps, self.get_packages(self.profile), repo_tool)
        if not self.profile.generate_package:
            deps = PostgresqlCentOsInstaller(deps, self.profile.petascopedb_username)
        return deps

    def validate(self):
        pass
