############################ Copyrights and license ############################
#                                                                              #
# Copyright 2018 Benoit Latinier <benoit@latinier.fr>                          #
# Copyright 2018 Yossarian King <yggy@blackbirdinteractive.com>                #
# Copyright 2019 Benoit Latinier <benoit@latinier.fr>                          #
# Copyright 2019 Steve Kowalik <steven@wedontsleep.org>                        #
# Copyright 2019 TechnicalPirate <35609336+TechnicalPirate@users.noreply.github.com>#
# Copyright 2019 Wan Liuyang <tsfdye@gmail.com>                                #
# Copyright 2020 Jody McIntyre <scjody@modernduck.com>                         #
# Copyright 2020 Steve Kowalik <steven@wedontsleep.org>                        #
# Copyright 2023 Enrico Minack <github@enrico.minack.dev>                      #
# Copyright 2023 Jirka Borovec <6035284+Borda@users.noreply.github.com>        #
#                                                                              #
# This file is part of PyGithub.                                               #
# http://pygithub.readthedocs.io/                                              #
#                                                                              #
# PyGithub is free software: you can redistribute it and/or modify it under    #
# the terms of the GNU Lesser General Public License as published by the Free  #
# Software Foundation, either version 3 of the License, or (at your option)    #
# any later version.                                                           #
#                                                                              #
# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY  #
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS    #
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more #
# details.                                                                     #
#                                                                              #
# You should have received a copy of the GNU Lesser General Public License     #
# along with PyGithub. If not, see <http://www.gnu.org/licenses/>.             #
#                                                                              #
################################################################################

import github

from . import Framework


class Project(Framework.TestCase):
    def setUp(self):
        super().setUp()
        self.repo = self.g.get_user().get_repo("PyGithub")

    def testGetProject(self):
        pid = 1682941
        proj = self.g.get_project(pid)
        self.assertEqual(proj.id, pid)
        self.assertEqual(proj.name, "TestProject")
        self.assertEqual(repr(proj), 'Project(name="TestProject")')

    def testGetOrganizationProjects(self):
        expectedProjects = ["Project1", "Project2", "Project3"]
        org = self.g.get_organization("PyGithubTestOrg")
        projects = []
        for proj in org.get_projects("open"):
            projects.append(proj.name)
        self.assertEqual(projects, expectedProjects)

    def testGetRepositoryProjects(self):
        expectedProjects = ["TestProject", "TestProjectClosed"]
        projects = []
        for proj in self.repo.get_projects("all"):
            projects.append(proj.name)
        self.assertEqual(projects, expectedProjects)

    # See https://developer.github.com/v3/projects/#get-a-project
    def testProjectAttributes(self):
        pid = 1682941
        proj = self.g.get_project(pid)
        self.assertEqual(proj.owner_url, "https://api.github.com/repos/bbi-yggy/PyGithub")
        self.assertEqual(proj.url, "https://api.github.com/projects/1682941")
        self.assertEqual(proj.html_url, "https://github.com/bbi-yggy/PyGithub/projects/1")
        self.assertEqual(proj.columns_url, "https://api.github.com/projects/1682941/columns")
        self.assertEqual(proj.id, pid)
        self.assertEqual(proj.node_id, "MDc6UHJvamVjdDE2ODI5NDE=")
        self.assertEqual(proj.name, "TestProject")
        self.assertEqual(proj.body, "To be used for testing project access API for PyGithub.")
        self.assertEqual(proj.number, 1)
        self.assertEqual(proj.state, "open")
        self.assertEqual(proj.creator, self.repo.owner)
        self.assertEqual(proj.created_at.year, 2018)
        self.assertTrue(proj.updated_at > proj.created_at)

    # See https://developer.github.com/v3/projects/columns/#get-a-project-column
    def testProjectColumnAttributes(self):
        proj = self.g.get_project(1682941)
        col = proj.get_columns()[0]
        self.assertEqual(col.id, 3138830)
        self.assertEqual(col.node_id, "MDEzOlByb2plY3RDb2x1bW4zMTM4ODMw")
        self.assertEqual(col.name, "To Do")
        self.assertEqual(col.url, "https://api.github.com/projects/columns/3138830")
        self.assertEqual(col.project_url, "https://api.github.com/projects/1682941")
        self.assertEqual(col.cards_url, "https://api.github.com/projects/columns/3138830/cards")
        self.assertEqual(col.created_at.year, 2018)
        self.assertTrue(col.updated_at >= col.created_at)
        self.assertEqual(repr(col), 'ProjectColumn(name="To Do")')

    # See https://developer.github.com/v3/projects/cards/#get-a-project-card
    def testProjectCardAttributes(self):
        proj = self.g.get_project(1682941)
        col = proj.get_columns()[1]
        card = col.get_cards()[0]
        self.assertEqual(card.url, "https://api.github.com/projects/columns/cards/11780055")
        self.assertEqual(card.column_url, "https://api.github.com/projects/columns/3138831")
        self.assertEqual(card.content_url, "https://api.github.com/repos/bbi-yggy/PyGithub/issues/1")
        self.assertEqual(card.id, 11780055)
        self.assertEqual(card.node_id, "MDExOlByb2plY3RDYXJkMTE3ODAwNTU=")
        self.assertEqual(card.note, None)  # No notes for cards with content.
        self.assertEqual(card.creator, self.repo.owner)
        self.assertEqual(card.created_at.year, 2018)
        self.assertTrue(card.updated_at >= card.created_at)
        self.assertFalse(card.archived)
        self.assertEqual(repr(card), "ProjectCard(id=11780055)")

    def testGetProjectCardContent(self):
        proj = self.g.get_project(1682941)
        col = proj.get_columns()[1]
        cards = col.get_cards()

        pull_card = cards[0]
        pull = pull_card.get_content("PullRequest")
        self.assertIsInstance(pull, github.PullRequest.PullRequest)
        self.assertEqual(pull.title, "Work in progress on support for GitHub projects API.")
        self.assertRaises(ValueError, pull_card.get_content, "foo")

        issue_card = cards[1]
        issue = issue_card.get_content()
        self.assertIsInstance(issue, github.Issue.Issue)
        self.assertEqual(issue.title, "Test issue")

        note_card = cards[2]
        note_content = note_card.get_content()
        self.assertEqual(note_content, None)

    def testProjectCardMove(self):
        proj = self.g.get_project(1682941)
        cols = proj.get_columns()
        card = cols[1].get_cards()[0]
        self.assertTrue(card.move("top", cols[2].id))
        self.assertTrue(card.move("bottom", cols[1]))

    def testProjectCardDelete(self):
        proj = self.g.get_project(1682941)
        cols = proj.get_columns()
        card = cols[1].get_cards()[0]
        self.assertTrue(card.delete())

    def testGetAllProjectCards(self):
        expectedProjects = ["TestProject"]
        expectedCards = 5
        projects = []
        cards = 0
        for proj in self.repo.get_projects():
            projects.append(proj.name)
            for col in proj.get_columns():
                for card in col.get_cards("all"):
                    cards += 1
        self.assertEqual(projects, expectedProjects)
        self.assertEqual(cards, expectedCards)

    def testCreateColumn(self):
        project = self.repo.create_project("Project created by PyGithub", "Project Body")
        column = project.create_column(
            "Project Column created by PyGithub",
        )
        self.assertEqual(column.id, 3999333)

    def testCreateCardWithNote(self):
        project = self.repo.create_project("Project created by PyGithub", "Project Body")
        column = project.create_column(
            "Project Column created by PyGithub",
        )
        card1 = column.create_card(note="Project Card")
        self.assertEqual(card1.id, 16039019)

    def testCreateCardFromIssue(self):
        project = self.repo.create_project("Project created by PyGithub", "Project Body")
        column = project.create_column(
            "Project Column created by PyGithub",
        )
        issue = self.repo.create_issue(title="Issue created by PyGithub")
        card2 = column.create_card(content_id=issue.id, content_type="Issue")
        self.assertEqual(card2.id, 16039106)

    def testEditCardWithoutParameters(self):
        proj = self.g.get_project(4015343)
        col = proj.get_columns()[0]
        card = col.create_card(note="Project Card")
        card.edit()

    def testEditCardNote(self):
        proj = self.g.get_project(4015343)
        col = proj.get_columns()[0]
        card = col.create_card(note="Project Card")
        card.edit(note="Edited Card")
        self.assertEqual(card.note, "Edited Card")

    def testEditCardArchived(self):
        proj = self.g.get_project(4015343)
        col = proj.get_columns()[0]
        card = col.create_card(note="Project Card")
        card.edit(archived=True)
        self.assertEqual(card.archived, True)
