import sys

from gitlab import Gitlab, GitlabGetError, GitlabSearchError

sys.path.append("./senior-ci")

from common import get_env_variable_required


class GitlabHelper(object):
    """Creates a helper to call Gitlab"""

    def __init__(self, project_id=None) -> None:
        gitlab_protocol = get_env_variable_required("CI_SERVER_PROTOCOL")
        gitlab_host = get_env_variable_required("CI_SERVER_HOST")

        self.gitlab_manager = Gitlab(
            url=f"{gitlab_protocol}://{gitlab_host}",
            private_token=get_env_variable_required("SCI_ARGOCD_TOKEN"),
            per_page=100,
        )

        self.gitlab_project = None

        if project_id:
            self.get_project(project_id)

    def get_project(self, project_id):
        try:
            self.gitlab_project = self.gitlab_manager.projects.get(project_id)
        except GitlabGetError:
            pass

    def get_raw_project(self, project_id):
        try:
            return self.gitlab_manager.projects.get(project_id)
        except GitlabGetError:
            pass

    def search_through_projects(self, project_name):
        try:
            return self.gitlab_manager.search(scope="projects", search=project_name)
        except GitlabSearchError:
            pass

    def get_current_project_variable(
        self, variable_name: str, default_value: str = None
    ):
        if not self.gitlab_project:
            return default_value

        try:
            return self.gitlab_project.variables.get(variable_name).value
        except GitlabGetError:
            return default_value

    def get_recent_merged_mr_labels(self, default_value="", limit=5):
        result = default_value

        if self.gitlab_project:
            try:
                mrs = self.gitlab_project.mergerequests.list(
                    state="merged", order_by="updated_at", sort="desc", per_page=limit
                )
                result = next(
                    (",".join(mr.labels) for mr in mrs if mr.labels), default_value
                )
            except GitlabGetError:
                pass

        return result
