from .ubuntu2004 import Ubuntu2004TpInstaller
from .tpinstaller import TPInstallerBasis, LibgdalJavaInstaller, DebPackageInstaller
from services import linux_distro


class Ubuntu2204TpInstaller(Ubuntu2004TpInstaller):
    def __init__(self, profile):
        """
        TP Installer for Ubuntu 22.04 Jammy
        :param Profile profile: the installation profile
        """
        super(Ubuntu2204TpInstaller, self).__init__(profile)
        self.python_pkg = 'python3'
        self.pkg_gdal_python = []
        self.pkg_netcdf_python = ''
        self.pkg_grpcio_python = 'grpcio'
        self.pkg_postgis = ['postgis',
                            'postgresql-14-postgis-3',
                            'postgresql-14-postgis-3-scripts']
        # installed from system packages instead of pip packages
        self.pkg_pyproj = None
        self.pkg_setuptools = None

    def get_build_core_packages(self):
        ret = ['make', 'libtool', 'gawk', 'autoconf', 'automake', 'pkg-config',
               'bison', 'flex', 'git', 'g++', 'unzip',
               'libpng-dev', 'libjpeg-dev', 'libtiff-dev', 'libgdal-dev', 'libnetcdf-dev', 'libeccodes-dev',
               'libboost-filesystem-dev', 'libboost-thread-dev', 'libboost-system-dev', 'libboost-dev',
               'zlib1g-dev', 'libffi-dev', 'libedit-dev', 'libreadline-dev', 'libdw-dev',
               'libsqlite3-dev', 'libpq-dev', 'libgrib2c-dev', 'curl', 'libssl-dev']
        if self.profile.database == 'postgresql':
            ret += ['libecpg-dev']
        return ret

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

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

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

    def get_build_pip_packages(self):
        return []

    def get_run_core_packages(self):
        # rasdaman core
        ret = ['sqlite3', 'zlib1g', 'libdw1', 'debianutils', 'sudo', 'libssl3',
               'gdal-bin', 'libnetcdf-dev', 'libgdal-dev', 'libeccodes0',
               'libreadline-dev', 'libedit-dev', 'libpq5']
        if self.profile.database == 'postgresql':
            ret += ['libecpg6']
        # wcst_import
        ret += ['python3-jsonschema', 'python3-dateutil', 'python3-lxml',
                'python3-grib', 'python3-numpy', 'python3-netcdf4', 'python3-pyproj']
        return ret

    def get_run_java_packages(self):
        ret = ['postgresql', 'postgresql-contrib', 'default-jre-headless']
        if self.profile.webapps_deployment == "external":
            ret += [linux_distro.get_tomcat_name()]
        return ret

    def get_run_pip_packages(self):
        return []

    def get_run_systemtest_packages(self):
        ret = ['bc', 'vim-common', 'valgrind', 'netcdf-bin', 'gdal-bin']
        # needed for rasdapy3 tests and installing grpcio with pip3
        ret += ['python3-protobuf', 'python3-pip']
        # for json manipulation in test_oapi for example
        ret += ['jq']
        return ret

    def get_run_systemtest_pip_packages(self):
        # needed for rasdapy3 tests; the python3-grpcio system package makes rasql.py hang
        return ['grpcio', self.pip_pkg_pylint]

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

    def get_dependencies(self):
        deps = TPInstallerBasis()
        if self.profile.install_dependencies:
            if self.profile.install_type != "package":
                deps = DebPackageInstaller(deps, self.get_packages(self.profile))
            if self.profile.webapps_enabled:
                deps = LibgdalJavaInstaller(deps, "ubuntu2204")
        return deps
