from .abstractosinstaller import OSInstaller
from .tpinstaller import TPInstallerBasis, DebPackageInstaller, UpdateMklAlternativesInstaller
from services import linux_distro

class Debian9TPInstaller(OSInstaller):
    def __init__(self, profile):
        """
        Installs the Debian dependencies, the defaults are based on Debian 8
        :param Profile profile: installation profile
        """
        super(Debian9TPInstaller, self).__init__(profile)
        self.pkg_libssl = 'libssl1.0.0'
        self.pkg_libgrib_build = 'libgrib-api-dev'
        self.pkg_libgrib_run = 'libgrib-api-dev'
        self.override_pygrib_version = True
        self.python_pkg = 'python'
        self.python_dev_pkg = ''
        self.pkg_libguice = ''
        self.pkg_postgis = ['postgis',
                            'postgresql-9.5-postgis-2.2',
                            'postgresql-9.5-postgis-scripts']

    def get_build_core_packages(self):
        ret = ['make', 'libtool', 'gawk', 'autoconf', 'automake',
               'bison', 'flex', 'git', 'g++', 'unzip', 'libpng-dev', 'libjpeg-dev',
               'libboost-thread-dev', 'libboost-system-dev',
               'libtiff-dev', 'libgdal-dev', 'zlib1g-dev', 'libffi-dev', 'libboost-dev',
               'libnetcdf-dev', 'libedit-dev', 'libreadline-dev', 'libdw-dev', 'libpq-dev',
               'libsqlite3-dev', 'libgrib2c-dev', 'curl', 'libssl-dev', self.pkg_libgrib_build,
               self.pkg_libguice, 'libtbb-dev',
               'libjsoncpp-dev', 'libcurl4-openssl-dev'
        ]
        if self.profile.enterprise:
            ret += ['libmkl-dev']
        if self.profile.database == 'postgresql':
            ret += ['libecpg-dev']
        if self.python_dev_pkg is not None and self.python_dev_pkg != '':
            ret += [self.python_dev_pkg]
        return ret

    def get_build_cmake_packages(self):
        return ['cmake', 'ccache']

    def get_build_java_packages(self):
        return ['default-jdk-headless', 'maven', 'ant', 'libgdal-java']

    def get_build_doc_packages(self):
        # pdf documentation generated with `make doc-pdf`
        ret = ['latexmk', 'texlive-latex-base', 'texlive-fonts-recommended', 'texlive-latex-extra']
        # C++ API documentation
        ret = ret + ['doxygen']
        return ret

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

    def get_run_core_packages(self):
        ret = ['postgresql', 'postgresql-contrib', 'sqlite3', 'zlib1g', 'libdw1',
               'gdal-bin', 'debianutils', 'libedit-dev', 'libnetcdf-dev',
               'python3-pip', 'python3-setuptools', 'python3-wheel', 'libgdal-dev',
               'libreadline-dev', self.pkg_libssl, self.pkg_libgrib_run,
               'libpython3-dev', 'sudo', 'libpq5', 'libtbb2', 'libjsoncpp1',
               'libcurl4']
        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 += [self.python_pkg]
        if self.profile.enterprise:
            ret += ['libpython3.8', # Python UDFs
                    ]
        if self.profile.database == 'postgresql':
            ret += ['libecpg6']
        return ret

    def get_run_java_packages(self):
        ret = ['default-jre-headless', 'libgdal-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):
        return ['bc', 'vim-common', 'valgrind', 'netcdf-bin', 'jq', 'zip', 'python3-joblib']

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

    def get_packaging_packages(self):
        return ['ruby-dev', 'ruby', 'rsync', 'jq']

    def get_dependencies(self):
        deps = TPInstallerBasis()
        if self.profile.install_dependencies and self.profile.install_type != "package":
            deps = DebPackageInstaller(deps, self.get_packages(self.profile))
        if self.profile.enterprise and (self.profile.systemtest or self.profile.generate_package):
            deps = UpdateMklAlternativesInstaller(deps)
        return deps

    def validate(self):
        pass
