import getopt
from os.path import exists

from colorama import Fore

from common import exec_command, exit_message, get_env_variable_required, print_message
from go import BaseGolangCi


class GolangLibsCI(BaseGolangCi):
    def _parse_opts(self, argv):
        self._opts, self._args = getopt.getopt(argv, "vr:px")

    def exec_ci(self):
        for opt, arg in self._opts:
            if opt == "-v":
                self._validation()
            elif opt == "-r":
                self._release(arg)
            elif opt == "-p":
                self.publish()
            elif opt == "-x":
                self._run_sonar()
            else:
                exit_message("É preciso informar a opção referente a ação escolhida")

    def _validation(self):
        super()._validation()
        if not exists("go.sum"):
            exit_message("O arquivo go.sum não foi encontrado")

    def publish(self):
        module_name = self._get_module_name()
        version = self.get_version()

        print_message(f"Publicando versão {version}")

        exec_command(
            f"JFROG_CLI_LOG_LEVEL=DEBUG jfrog rt gp {version}",
            error_message="Falha ao publicar pacote.",
        )

        print(" ")
        print_message(
            f"Publicação da versão {version} realizada com sucesso. go get {module_name}@{version}",
            Fore.GREEN,
        )

    @staticmethod
    def _get_module_name():
        """Extracts the module name from CI_PROJECT_URL env"""

        ci_project_url = get_env_variable_required("CI_PROJECT_URL")

        return ci_project_url.replace("https://", "").strip()
