import unittest
from unittest.mock import MagicMock
from core.trigger_processing import process_trigger_event
from database.models import TriggerEvent, Region

class TestTriggerProcessing(unittest.TestCase):

    def test_trigger_event_within_region(self):
        # Mock database session
        mock_db = MagicMock()

        # Mock a region that contains the event
        region = Region(id=1, name='Test Region', polygon_data='34.0, -118.3;34.1, -118.3;34.1, -118.2;34.0, -118.2') #Simple rectangle
        mock_db.query.return_value.all.return_value = [region]

        # Event data within the region
        event_data = {
            'event_type': 'test_event',
            'timestamp': '2024-10-27T12:00:00',
            'latitude': 34.05,  # Within the region
            'longitude': -118.25  # Within the region
        }

        # Process the trigger event
        trigger_event = process_trigger_event(event_data, mock_db)

        # Assert that the trigger event has the correct region_id
        self.assertEqual(trigger_event.region_id, 1)

        # Verify that db.add and db.commit were called
        mock_db.add.assert_called_once()
        mock_db.commit.assert_called_once()

    def test_trigger_event_outside_region(self):
        # Mock database session
        mock_db = MagicMock()

        # Mock a region
        region = Region(id=1, name='Test Region', polygon_data='34.0, -118.3;34.1, -118.3;34.1, -118.2;34.0, -118.2') #Simple rectangle
        mock_db.query.return_value.all.return_value = [region]

        # Event data outside the region
        event_data = {
            'event_type': 'test_event',
            'timestamp': '2024-10-27T12:00:00',
            'latitude': 35.0,  # Outside the region
            'longitude': -119.0  # Outside the region
        }

        # Process the trigger event
        trigger_event = process_trigger_event(event_data, mock_db)

        # Assert that the trigger event has no region_id
        self.assertIsNone(trigger_event.region_id)

        # Verify that db.add and db.commit were called
        mock_db.add.assert_called_once()
        mock_db.commit.assert_called_once()

    def test_trigger_event_no_regions(self):
        # Mock database session
        mock_db = MagicMock()

        # Mock no regions in the database
        mock_db.query.return_value.all.return_value = []

        # Event data
        event_data = {
            'event_type': 'test_event',
            'timestamp': '2024-10-27T12:00:00',
            'latitude': 34.05,
            'longitude': -118.25
        }

        # Process the trigger event
        trigger_event = process_trigger_event(event_data, mock_db)

        # Assert that the trigger event has no region_id
        self.assertIsNone(trigger_event.region_id)

        # Verify that db.add and db.commit were called
        mock_db.add.assert_called_once()
        mock_db.commit.assert_called_once()


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