from django.contrib.auth import get_user_model
from django.test import Client, TestCase
from django.urls import reverse

from accounts.models import ShipperProfile, TransporterProfile, TransporterDriverLink, UserRole

User = get_user_model()


class DashboardDataTests(TestCase):
    def setUp(self):
        self.admin = User.objects.create_user(
            'admin-dash@test.com',
            email='admin-dash@test.com',
            password='secret',
            is_staff=True,
        )
        UserRole.objects.create(user=self.admin, role=UserRole.Role.ADMIN, phone='', language='en')
        self.client = Client()
        self.client.force_login(self.admin)

    def test_dashboard_data_returns_live_payload(self):
        response = self.client.get(
            reverse('core:dashboard_data'),
            HTTP_X_REQUESTED_WITH='XMLHttpRequest',
        )
        self.assertEqual(response.status_code, 200)
        data = response.json()
        self.assertIn('updated_at', data)
        self.assertIn('active_trips', data)
        self.assertIsInstance(data['active_trips'], list)
        counts = data['counts']
        self.assertIn('verified', counts['shippers'])
        self.assertIn('unverified', counts['shippers'])
        self.assertIn('verified', counts['transporters'])
        self.assertIn('individual_driver', counts['drivers'])
        self.assertIn('fleet_driver', counts['drivers'])
        self.assertIn('verified', counts['vehicles'])
        self.assertIn('unverified', counts['vehicles'])


class AdminDriversPageTests(TestCase):
    def setUp(self):
        self.admin = User.objects.create_user(
            'admin-drivers@test.com',
            email='admin-drivers@test.com',
            password='secret',
            is_staff=True,
        )
        UserRole.objects.create(user=self.admin, role=UserRole.Role.ADMIN, phone='', language='en')
        self.client = Client()
        self.client.force_login(self.admin)

        self.individual = User.objects.create_user(
            'individual-driver@test.com',
            email='individual-driver@test.com',
            password='secret',
            first_name='Ind',
            last_name='Driver',
        )
        UserRole.objects.create(user=self.individual, role=UserRole.Role.TRANSPORTER, phone='', language='en')
        TransporterProfile.objects.create(
            user=self.individual,
            account_type=TransporterProfile.AccountType.DRIVER,
            company_name='Solo Hauling Co',
        )

        self.fleet_owner = User.objects.create_user(
            'fleet-owner-drivers@test.com',
            email='fleet-owner-drivers@test.com',
            password='secret',
            first_name='Big',
            last_name='Fleet',
        )
        UserRole.objects.create(user=self.fleet_owner, role=UserRole.Role.TRANSPORTER, phone='', language='en')
        TransporterProfile.objects.create(
            user=self.fleet_owner,
            account_type=TransporterProfile.AccountType.FLEET_OWNER,
        )

        self.fleet_driver = User.objects.create_user(
            'fleet-driver@test.com',
            email='fleet-driver@test.com',
            password='secret',
            first_name='Fleet',
            last_name='Driver',
        )
        UserRole.objects.create(user=self.fleet_driver, role=UserRole.Role.TRANSPORTER, phone='', language='en')
        TransporterProfile.objects.create(
            user=self.fleet_driver,
            account_type=TransporterProfile.AccountType.TRANSPORTER_DRIVER,
        )
        TransporterDriverLink.objects.create(
            transporter=self.fleet_owner,
            driver=self.fleet_driver,
            is_active=True,
        )

    def test_drivers_page_lists_individual_and_fleet_drivers(self):
        response = self.client.get(reverse('core:drivers'))
        self.assertEqual(response.status_code, 200)
        content = response.content.decode()
        self.assertIn('individual-driver@test.com', content)
        self.assertIn('fleet-driver@test.com', content)
        self.assertNotIn('fleet-owner-drivers@test.com', content)

    def test_drivers_page_company_or_transporter_column(self):
        response = self.client.get(reverse('core:drivers'))
        self.assertEqual(response.status_code, 200)
        content = response.content.decode()
        self.assertIn('Company/Transporter', content)
        self.assertIn('Company: Solo Hauling Co', content)
        self.assertIn('Transporter: Big Fleet', content)
        self.assertIn('Fleet driver', content)
        self.assertNotIn('Fleet driver (created by fleet owner)', content)

