from django.contrib.auth import get_user_model
from django.test import TestCase
from rest_framework.authtoken.models import Token
from rest_framework.test import APIClient
from unittest.mock import patch

from accounts.models import ShipperProfile, TransporterProfile, UserRole

User = get_user_model()


class ShipperTransporterCurrentLocationTests(TestCase):
    def setUp(self):
        self.shipper = User.objects.create_user('shiploc@test.com', email='shiploc@test.com', password='secret')
        UserRole.objects.create(user=self.shipper, role=UserRole.Role.SHIPPER, phone='', language='en')
        ShipperProfile.objects.create(user=self.shipper, account_type=ShipperProfile.AccountType.INDIVIDUAL)

        self.transporter = User.objects.create_user('driverloc@test.com', email='driverloc@test.com', password='secret')
        UserRole.objects.create(user=self.transporter, role=UserRole.Role.TRANSPORTER, phone='', language='en')
        self.transporter_profile = TransporterProfile.objects.create(
            user=self.transporter,
            account_type=TransporterProfile.AccountType.FLEET_OWNER,
            local=True,
            country_to_country=False,
            documents_verified=True,
            tc_id='111',
        )

        token, _ = Token.objects.get_or_create(user=self.shipper)
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {token.key}')

    @patch('api.views.get_latest_device_position')
    def test_returns_transporter_current_location(self, mock_latest_position):
        mock_latest_position.return_value = {
            'latitude': 24.8610,
            'longitude': 67.0020,
            'raw': {'id': 10, 'deviceId': 111},
        }

        r = self.client.get(f'/api/shipper/transporters/{self.transporter.id}/current-location/')

        self.assertEqual(r.status_code, 200)
        data = r.json()['data']
        self.assertEqual(data['transporter_id'], self.transporter.id)
        self.assertEqual(data['tc_id'], '111')
        self.assertEqual(data['position']['lat'], 24.8610)
        self.assertEqual(data['position']['lon'], 67.0020)

    def test_returns_400_when_transporter_tc_id_missing(self):
        self.transporter_profile.tc_id = ''
        self.transporter_profile.save(update_fields=['tc_id'])

        r = self.client.get(f'/api/shipper/transporters/{self.transporter.id}/current-location/')

        self.assertEqual(r.status_code, 400)
        self.assertEqual(r.json()['error'], 'Missing tc_id on transporter profile.')
