from typing import Any, Dict, Union

from jira import JIRA
from jira.resources import Issue, IssueLinkType
from requests import Response

from common import get_env_variable_required


class JiraManager:
    def __init__(self):
        user = get_env_variable_required("SCI_JIRA_USER")
        password = get_env_variable_required("SCI_JIRA_PASSWORD")

        self.jira = JIRA("https://jira.senior.com.br", basic_auth=(user, password))

    def create_issue(self, fields: Dict[str, Any] or None) -> Issue:
        return self.jira.create_issue(fields)

    def update_issue_summary(self, key: str, summary: str) -> Issue:
        issue = self.get_issue(key)
        return issue.update(summary=summary)

    def create_link(
        self,
        link_type: Union[str, IssueLinkType],
        inward_issue: Issue,
        outward_issue: Issue,
    ) -> bool:
        remote_link: Response = self.jira.create_issue_link(
            link_type, inward_issue, outward_issue
        )

        return remote_link.ok

    def get_issue(self, key: str) -> Issue:
        return self.jira.issue(key)

    def add_description(self, key: str, description: str):
        issue = self.get_issue(key)
        return issue.update(description=description)

    @staticmethod
    def get_issue_url(key: str) -> str:
        return f"https://jira.senior.com.br/browse/{key}"
