import asyncio
import json
import unittest
from unittest.mock import AsyncMock, patch

from gerrit_mcp_server import main


class TestPostDraftComment(unittest.TestCase):
    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_post_draft_comment_success(self, mock_run_curl):
        async def run_test():
            mock_run_curl.return_value = json.dumps({"id": "draft-abc123"})

            result = await main.post_draft_comment(
                change_id="456",
                file_path="src/main.py",
                line_number=10,
                message="This needs a fix.",
                gerrit_base_url="https://gerrit-review.googlesource.com",
            )

            self.assertIn("Draft comment created on CL 456", result[0]["text"])
            self.assertIn("src/main.py", result[0]["text"])

            mock_run_curl.assert_called_once()
            args, kwargs = mock_run_curl.call_args
            curl_args = args[0]
            payload = json.loads(curl_args[curl_args.index("--data") + 1])
            self.assertEqual(payload["path"], "src/main.py")
            self.assertEqual(payload["line"], 10)
            self.assertEqual(payload["message"], "This needs a fix.")
            self.assertTrue(payload["unresolved"])

        asyncio.run(run_test())

    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_post_draft_comment_with_suggestion(self, mock_run_curl):
        async def run_test():
            mock_run_curl.return_value = json.dumps({"id": "draft-abc123"})

            result = await main.post_draft_comment(
                change_id="456",
                file_path="src/main.py",
                line_number=10,
                message="Consider this instead:",
                suggestion="new_code_here()",
                gerrit_base_url="https://gerrit-review.googlesource.com",
            )

            self.assertIn("Draft comment created", result[0]["text"])

            args, _ = mock_run_curl.call_args
            curl_args = args[0]
            payload = json.loads(curl_args[curl_args.index("--data") + 1])
            self.assertIn("```suggestion", payload["message"])
            self.assertIn("new_code_here()", payload["message"])

        asyncio.run(run_test())

    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_post_draft_comment_with_range(self, mock_run_curl):
        async def run_test():
            mock_run_curl.return_value = json.dumps({"id": "draft-abc123"})

            result = await main.post_draft_comment(
                change_id="456",
                file_path="src/main.py",
                line_number=10,
                message="Multi-line comment",
                start_line=8,
                start_character=0,
                end_line=12,
                end_character=5,
                gerrit_base_url="https://gerrit-review.googlesource.com",
            )

            self.assertIn("Draft comment created", result[0]["text"])

            args, _ = mock_run_curl.call_args
            curl_args = args[0]
            payload = json.loads(curl_args[curl_args.index("--data") + 1])
            self.assertEqual(payload["range"]["start_line"], 8)
            self.assertEqual(payload["range"]["end_line"], 12)
            # line should equal end_line when range is provided
            self.assertEqual(payload["line"], 12)

        asyncio.run(run_test())

    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_post_draft_comment_with_in_reply_to(self, mock_run_curl):
        async def run_test():
            mock_run_curl.return_value = json.dumps({"id": "draft-reply-1"})

            result = await main.post_draft_comment(
                change_id="456",
                file_path="src/main.py",
                line_number=10,
                message="Good point, fixed.",
                in_reply_to="comment-abc123",
                gerrit_base_url="https://gerrit-review.googlesource.com",
            )

            self.assertIn("Draft comment created", result[0]["text"])

            args, _ = mock_run_curl.call_args
            curl_args = args[0]
            payload = json.loads(curl_args[curl_args.index("--data") + 1])
            self.assertEqual(payload["in_reply_to"], "comment-abc123")

        asyncio.run(run_test())

    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_post_draft_comment_no_id_in_response(self, mock_run_curl):
        async def run_test():
            mock_run_curl.return_value = json.dumps({"error": "something"})

            result = await main.post_draft_comment(
                change_id="456",
                file_path="src/main.py",
                line_number=10,
                message="test",
                gerrit_base_url="https://gerrit-review.googlesource.com",
            )

            self.assertIn("Failed to create draft comment", result[0]["text"])

        asyncio.run(run_test())

    @patch("gerrit_mcp_server.main.run_curl", new_callable=AsyncMock)
    def test_post_draft_comment_exception(self, mock_run_curl):
        async def run_test():
            mock_run_curl.side_effect = Exception("Network error")

            with self.assertRaises(Exception):
                await main.post_draft_comment(
                    change_id="456",
                    file_path="src/main.py",
                    line_number=10,
                    message="test",
                    gerrit_base_url="https://gerrit-review.googlesource.com",
                )

        asyncio.run(run_test())


if __name__ == "__main__":
    unittest.main()
