import os
import tempfile

from aider_gitea.seen_issues_db import SeenIssuesDB


class TestSeenIssuesDBPRInfo:
    def setup_method(self):
        # Create a temporary database file
        self.db_fd, self.db_path = tempfile.mkstemp()
        self.db = SeenIssuesDB(self.db_path)

        # Test data
        self.issue_text = 'Test issue title\nTest issue description'
        self.issue_number = '123'
        self.pr_number = '456'
        self.pr_url = 'https://gitea.example.com/owner/repo/pulls/456'

    def teardown_method(self):
        # Close and remove the temporary database
        self.db.conn.close()
        os.close(self.db_fd)
        os.unlink(self.db_path)

    def test_mark_as_seen_with_pr_info(self):
        # Mark an issue as seen with PR info
        self.db.mark_as_seen(
            self.issue_text,
            issue_number=self.issue_number,
            pr_number=self.pr_number,
            pr_url=self.pr_url,
        )

        # Verify the issue is marked as seen
        assert self.db.has_seen(self.issue_text)

        # Verify PR info is stored correctly
        pr_info = self.db.get_pr_info(self.issue_text)
        assert pr_info is not None
        assert pr_info[0] == self.pr_number
        assert pr_info[1] == self.pr_url

    def test_update_pr_info(self):
        # First mark the issue as seen without PR info
        self.db.mark_as_seen(self.issue_text, issue_number=self.issue_number)

        # Verify no PR info is available
        assert self.db.get_pr_info(self.issue_text) == (None, None)

        # Update with PR info
        updated = self.db.update_pr_info(self.issue_text, self.pr_number, self.pr_url)

        # Verify update was successful
        assert updated

        # Verify PR info is now available
        pr_info = self.db.get_pr_info(self.issue_text)
        assert pr_info[0] == self.pr_number
        assert pr_info[1] == self.pr_url

    def test_update_nonexistent_issue(self):
        # Try to update PR info for an issue that doesn't exist
        updated = self.db.update_pr_info(
            'Nonexistent issue',
            self.pr_number,
            self.pr_url,
        )

        # Verify update failed
        assert not updated

    def test_get_pr_info_nonexistent(self):
        # Try to get PR info for an issue that doesn't exist
        pr_info = self.db.get_pr_info('Nonexistent issue')

        # Verify no PR info is available
        assert pr_info is None