# Copyright (c) 2023 Peace-Maker
from gql import gql, Client
from gql.transport.aiohttp import AIOHTTPTransport


class GithubGQL:

    def __init__(self, token):
        transport = AIOHTTPTransport(
            url="https://api.github.com/graphql",
            headers={"Authorization": f"Bearer {token}"})
        self.client = Client(transport=transport)

    def get_project(self, orga, project_number):
        query = gql("""
        query getProjectId($login: String!, $projectNumber: Int!){
            organization(login: $login) {
                projectV2(number: $projectNumber) {
                    id
                    fields(first: 100) {
                        nodes {
                            ... on ProjectV2Field {
                                id
                                name
                            }
                            ... on ProjectV2SingleSelectField {
                                id
                                name
                                options {
                                    id
                                    name
                                }
                            }
                            ... on ProjectV2SingleSelectField {
                                id
                                name
                                options {
                                    id
                                    name
                                }
                            }
                        }
                    }
                    items(first: 100) {
                        nodes {
                            id
                            fieldValues(first: 100) {
                                nodes {
                                    ... on ProjectV2ItemFieldTextValue {
                                        text
                                        field {
                                            ... on ProjectV2FieldCommon {
                                                name
                                            }
                                        }
                                    }
                                    ... on ProjectV2ItemFieldSingleSelectValue {
                                        name
                                        field {
                                            ... on ProjectV2FieldCommon {
                                                name
                                            }
                                        }
                                    }
                                }
                            }
                            content {              
                                ... on DraftIssue {
                                    id
                                    title
                                }
                            }
                        }
                    }
                }
            }
        }
        """)
        variables = {"login": orga, "projectNumber": project_number}
        result = self.client.execute(query, variable_values=variables)
        # TODO: Handle pagination
        return result["organization"]["projectV2"]

    def add_draft_issue(self, project_id, title, body):
        query = gql("""
        mutation addDraftIssue($projectId: ID!, $title: String!, $body: String!){
            addProjectV2DraftIssue(
                input: {
                    projectId: $projectId,
                    title: $title,
                    body: $body
                }
            ) {
                projectItem {
                    id
                    content {              
                        ... on DraftIssue {
                            id
                        }
                    }
                }
            }
        }
        """)
        variables = {"projectId": project_id, "title": title, "body": body}
        result = self.client.execute(query, variable_values=variables)
        return result["addProjectV2DraftIssue"]["projectItem"]

    def update_draft_issue(self, issue_id, title, body):
        query = gql("""
        mutation updateDraftIssue($issueId: ID!, $title: String!, $body: String!){
            updateProjectV2DraftIssue(
                input: {
                    draftIssueId: $issueId,
                    title: $title,
                    body: $body
                }
            ) {
                draftIssue {
                    id
                }
            }
        }
        """)
        variables = {"issueId": issue_id, "title": title, "body": body}
        result = self.client.execute(query, variable_values=variables)
        return result["updateProjectV2DraftIssue"]["draftIssue"]["id"]

    def update_item_field_value_option(self, project_id, item_id, field_id,
                                       option_id):
        query = gql("""
        mutation updateDraftIssueStatus($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!){
            updateProjectV2ItemFieldValue(
                input: {
                    projectId: $projectId,
                    itemId: $itemId,
                    fieldId: $fieldId,
                    value: {
                        singleSelectOptionId: $optionId
                    }
                }
            ) {
                projectV2Item {
                    id
                }
            }
        }
        """)
        variables = {
            "projectId": project_id,
            "itemId": item_id,
            "fieldId": field_id,
            "optionId": option_id
        }
        result = self.client.execute(query, variable_values=variables)
        return result["updateProjectV2ItemFieldValue"]["projectV2Item"]["id"]