from django.core.files.base import ContentFile
from django.test import TestCase
from django.contrib.auth import get_user_model

from accounts.models import KYCDocument, TransporterProfile, UserRole, Vehicle, VehicleDocument
from accounts.vehicle_docs import (
    copy_kyc_vehicle_registration_to_vehicle,
    sync_missing_kyc_vehicle_registrations,
)

User = get_user_model()


class SyncKycVehicleRegistrationTests(TestCase):
    def setUp(self):
        self.user = User.objects.create_user(
            username='driver-sync@test.com',
            email='driver-sync@test.com',
            password='pass12345',
        )
        UserRole.objects.create(user=self.user, role=UserRole.Role.TRANSPORTER, phone='+10000000001')
        TransporterProfile.objects.create(
            user=self.user,
            account_type=TransporterProfile.AccountType.DRIVER,
        )
        self.vehicle = Vehicle.objects.create(
            owner=self.user,
            vehicle_type='Truck',
            registration_number='ABC-123',
            load_capacity=10,
        )

    def test_copies_kyc_registration_onto_vehicle(self):
        kyc = KYCDocument.objects.create(
            user=self.user,
            document_type=KYCDocument.DocumentType.VEHICLE_REGISTRATION,
            review_status=KYCDocument.ReviewStatus.PENDING,
        )
        kyc.file.save('reg.png', ContentFile(b'fake-image'), save=True)

        doc = copy_kyc_vehicle_registration_to_vehicle(self.vehicle)
        self.assertIsNotNone(doc)
        self.assertEqual(doc.document_type, VehicleDocument.DocumentType.NOC)
        self.assertEqual(doc.vehicle_id, self.vehicle.id)
        self.assertTrue(doc.file)

        # Idempotent — second call does nothing
        self.assertIsNone(copy_kyc_vehicle_registration_to_vehicle(self.vehicle))
        self.assertEqual(
            VehicleDocument.objects.filter(
                vehicle=self.vehicle,
                document_type=VehicleDocument.DocumentType.NOC,
            ).count(),
            1,
        )

    def test_sync_missing_backfills(self):
        kyc = KYCDocument.objects.create(
            user=self.user,
            document_type=KYCDocument.DocumentType.VEHICLE_REGISTRATION,
        )
        kyc.file.save('reg2.png', ContentFile(b'fake-image-2'), save=True)

        created = sync_missing_kyc_vehicle_registrations()
        self.assertEqual(len(created), 1)
        self.assertTrue(
            VehicleDocument.objects.filter(
                vehicle=self.vehicle,
                document_type=VehicleDocument.DocumentType.NOC,
            ).exists()
        )

    def test_missing_kyc_file_on_disk_still_creates_linked_row(self):
        """Admin Vehicle documents must list the row even when media is remote-only."""
        kyc = KYCDocument.objects.create(
            user=self.user,
            document_type=KYCDocument.DocumentType.VEHICLE_REGISTRATION,
        )
        kyc.file.name = 'kyc/missing/does-not-exist.png'
        kyc.save(update_fields=['file'])

        doc = copy_kyc_vehicle_registration_to_vehicle(self.vehicle)
        self.assertIsNotNone(doc)
        self.assertEqual(doc.file.name, 'kyc/missing/does-not-exist.png')
        self.assertEqual(
            VehicleDocument.objects.filter(
                vehicle=self.vehicle,
                document_type=VehicleDocument.DocumentType.NOC,
            ).count(),
            1,
        )
