# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

import logging as log
import os

from Launcher import Launcher
from LocalLauncher import LocalLauncher
from LsfLauncher import LsfLauncher
from SgeLauncher import SgeLauncher

try:
    from edacloudlauncher.EdaCloudLauncher import EdaCloudLauncher
    EDACLOUD_LAUNCHER_EXISTS = True
except ImportError:
    EDACLOUD_LAUNCHER_EXISTS = False

# The chosen launcher class.
_LAUNCHER_CLS = None


def set_launcher_type(is_local=False):
    '''Sets the launcher type that will be used to launch the jobs.

    The env variable `DVSIM_LAUNCHER` is used to identify what launcher system
    to use. This variable is specific to the user's work site. It is meant to
    be set externally before invoking DVSim. Valid values are [local, lsf,
    edacloud]. If --local arg is supplied then the local launcher takes
    precedence.
    '''

    launcher = os.environ.get("DVSIM_LAUNCHER", "local")
    if is_local:
        launcher = "local"
    Launcher.variant = launcher

    global _LAUNCHER_CLS
    if launcher == "local":
        _LAUNCHER_CLS = LocalLauncher

    elif launcher == "lsf":
        _LAUNCHER_CLS = LsfLauncher

    elif launcher == "sge":
        _LAUNCHER_CLS = SgeLauncher

    # These custom launchers are site specific. They may not be committed to
    # the open source repo.
    elif launcher == "edacloud" and EDACLOUD_LAUNCHER_EXISTS:
        _LAUNCHER_CLS = EdaCloudLauncher

    else:
        log.error("Launcher {} set using DVSIM_LAUNCHER env var does not "
                  "exist. Using local launcher instead.".format(launcher))
        _LAUNCHER_CLS = LocalLauncher


def get_launcher_cls():
    '''Returns the chosen launcher class.'''

    assert _LAUNCHER_CLS is not None
    return _LAUNCHER_CLS


def get_launcher(deploy):
    '''Returns an instance of a launcher.

    'deploy' is an instance of the deploy class to with the launcher is paired.
    '''

    assert _LAUNCHER_CLS is not None
    return _LAUNCHER_CLS(deploy)
