from django.test import TestCase
from django.contrib.auth import get_user_model
from django.utils import timezone
from unittest.mock import patch

from helpdesk.models import Ticket

from chat.services.message_service import MessageService
from helpdesk.services.ticket_service import ticket_service as global_ticket_service

UserModel = get_user_model()

class MessageTicketIntegrationTest(TestCase):

    def setUp(self):
        # ผู้ใช้ Agent (ต้องใส่ email ให้ไม่ซ้ำ)
        self.user = UserModel.objects.create_user(
            username='tester',
            email='tester@example.com',
            password='testpassword',
            is_staff=True
        )

        # Ticket เริ่มต้น (เก็บเวลาไว้เพื่อใช้เปรียบเทียบ)
        self.ticket = Ticket.objects.create(
            creator=self.user,
            title="Ticket for Chat Integration Test",
            last_message_at=timezone.now()
        )

        # เก็บค่า datetime เดิมไว้ (ก่อนมีข้อความใหม่)
        self.original_last_message_at = self.ticket.last_message_at

        self.message_service = MessageService()
        self.message_service.ticket_service = global_ticket_service

    # ปิด Realtime ด้วย mock (เพื่อตัด websocket ออกจาก test)
    @patch('chat.services.message_service.MessageService._send_realtime_update')
    def test_message_creation_updates_ticket_data(self, mock_send_realtime):
        """
        GIVEN: มี Ticket อยู่ก่อนแล้ว
        WHEN:  Agent ส่งข้อความใหม่ผ่าน MessageService
        THEN:  last_message_content, last_message_at, is_read ต้องถูกอัปเดตถูกต้อง
        """
        new_content = "This is the newest message content from Agent."

        # ACT
        new_message = self.message_service.create_and_send_message(
            ticket_id=self.ticket.id,
            sender=self.user,
            content=new_content,
            message_type='T'
        )

        # ASSERT 1 Message ถูกสร้างในฐานข้อมูล
        self.assertIsNotNone(new_message.id)

        # ดึง Ticket ใหม่จาก DB
        self.ticket.refresh_from_db()

        # ASSERT 2 เนื้อหาข้อความล่าสุดถูกอัปเดต
        self.assertEqual(self.ticket.last_message_content, new_content)

        # ASSERT 3 Agent ส่ง → is_read ต้องเป็น True
        self.assertEqual(self.ticket.is_read, True)

        # ASSERT 4 เวลา last_message_at ต้องใหม่กว่าเวลาของ ticket เดิม
        self.assertGreater(self.ticket.last_message_at, self.original_last_message_at)

        # ASSERT 5 realtime broadcast ถูกเรียก (เพราะ mock)
        mock_send_realtime.assert_called_once()


    @patch('chat.services.message_service.MessageService._send_realtime_update')
    def test_message_creation_handles_non_agent_message_correctly(self, mock_send_realtime):
        """
        GIVEN: ผู้ส่งเป็น customer (is_staff=False)
        WHEN: ส่งข้อความใหม่เข้ามา
        THEN: Ticket.is_read ต้องเป็น False (รอ Agent อ่าน)
        """
        customer = UserModel.objects.create_user(
            username='customer',
            email='customer@example.com',   # ต้องใส่ email เพื่อไม่ให้ซ้ำ
            password='p',
            is_staff=False
        )

        new_content = "Customer: I need help."

        # ACT
        self.message_service.create_and_send_message(
            ticket_id=self.ticket.id,
            sender=customer,
            content=new_content,
            message_type='T'
        )

        # ASSERT: ดึงข้อมูลล่าสุดจาก DB
        self.ticket.refresh_from_db()

        # เนื้อหาต้องตรงกับข้อความใหม่
        self.assertEqual(self.ticket.last_message_content, new_content)

        # ลูกค้าส่ง → Agent ยังไม่ได้อ่าน → is_read = False
        self.assertEqual(self.ticket.is_read, False)
