import pytest
from unittest.mock import MagicMock, patch
from pathlib import Path

from aider_gitea import push_changes


class TestIssueCommentOnFailure:
    def setup_method(self):
        self.cwd = Path('/tmp/test-repo')
        self.branch_name = 'issue-123-test-branch'
        self.issue_number = '123'
        self.issue_title = 'Test Issue'
        self.base_branch = 'main'
        self.gitea_client = MagicMock()
        self.owner = 'test-owner'
        self.repo = 'test-repo'
        
    @patch('aider_gitea.has_commits_on_branch', return_value=True)
    @patch('aider_gitea.get_commit_messages', return_value=['Test commit'])
    @patch('aider_gitea.run_cmd')
    def test_comment_on_push_failure(self, mock_run_cmd, mock_get_commit_messages, mock_has_commits):
        # Setup run_cmd to fail on git push
        mock_run_cmd.return_value = False
        
        # Call push_changes
        result = push_changes(
            self.cwd,
            self.branch_name,
            self.issue_number,
            self.issue_title,
            self.base_branch,
            self.gitea_client,
            self.owner,
            self.repo
        )
        
        # Verify result is False
        assert result is False
        
        # Verify create_issue_comment was called with appropriate message
        self.gitea_client.create_issue_comment.assert_called_once()
        args, _ = self.gitea_client.create_issue_comment.call_args
        assert args[0] == self.owner
        assert args[1] == self.repo
        assert args[2] == self.issue_number
        assert "Failed to push branch" in args[3]
        assert "❌ **Automated Solution Failed**" in args[3]
        
    @patch('aider_gitea.has_commits_on_branch', return_value=True)
    @patch('aider_gitea.get_commit_messages', return_value=['Test commit'])
    @patch('aider_gitea.run_cmd')
    def test_comment_on_pr_creation_failure(self, mock_run_cmd, mock_get_commit_messages, mock_has_commits):
        # Setup run_cmd to succeed on git push
        mock_run_cmd.return_value = True
        
        # Setup create_pull_request to fail
        self.gitea_client.create_pull_request.side_effect = Exception("PR creation failed")
        
        # Call push_changes
        result = push_changes(
            self.cwd,
            self.branch_name,
            self.issue_number,
            self.issue_title,
            self.base_branch,
            self.gitea_client,
            self.owner,
            self.repo
        )
        
        # Verify result is False
        assert result is False
        
        # Verify create_issue_comment was called with appropriate message
        self.gitea_client.create_issue_comment.assert_called_once()
        args, _ = self.gitea_client.create_issue_comment.call_args
        assert args[0] == self.owner
        assert args[1] == self.repo
        assert args[2] == self.issue_number
        assert "Failed to create pull request" in args[3]
        assert "⚠️ **Partial Automation Success**" in args[3]
        assert self.branch_name in args[3]