from decimal import Decimal

from django.contrib.auth import get_user_model
from rest_framework.authtoken.models import Token
from rest_framework.test import APIClient, APITestCase

from accounts.models import TransporterProfile, UserRole, Vehicle, VehicleDocument

User = get_user_model()

_TINY_PNG = (
    'data:image/png;base64,'
    'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8'
    '/x8AAwMCAO+ip1sAAAAASUVORK5CYII='
)


class VehicleOptionalNocApiTests(APITestCase):
    def setUp(self):
        self.driver = User.objects.create_user(
            'noc-vehicle-driver@test.com',
            email='noc-vehicle-driver@test.com',
            password='secret',
        )
        UserRole.objects.create(
            user=self.driver, role=UserRole.Role.TRANSPORTER, phone='', language='en',
        )
        TransporterProfile.objects.create(
            user=self.driver,
            account_type=TransporterProfile.AccountType.DRIVER,
            local=True,
            country_to_country=False,
        )
        token, _ = Token.objects.get_or_create(user=self.driver)
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {token.key}')

    def test_create_vehicle_without_noc_succeeds(self):
        response = self.client.post(
            '/api/transporter/vehicles/',
            {
                'vehicle_type': 'Truck',
                'registration_number': 'NOC-FREE-1',
                'load_capacity': '5000.00',
            },
            format='json',
        )
        self.assertEqual(response.status_code, 201, response.content)
        vehicle = Vehicle.objects.get(registration_number='NOC-FREE-1')
        self.assertFalse(
            VehicleDocument.objects.filter(
                vehicle=vehicle,
                document_type=VehicleDocument.DocumentType.NOC,
            ).exists()
        )

    def test_create_vehicle_with_optional_noc(self):
        response = self.client.post(
            '/api/transporter/vehicles/',
            {
                'vehicle_type': 'Truck',
                'registration_number': 'NOC-WITH-1',
                'load_capacity': Decimal('5000.00'),
                'noc_file': _TINY_PNG,
                'noc_expiry_date': '2028-06-01',
            },
            format='json',
        )
        self.assertEqual(response.status_code, 201, response.content)
        vehicle = Vehicle.objects.get(registration_number='NOC-WITH-1')
        doc = VehicleDocument.objects.get(
            vehicle=vehicle,
            document_type=VehicleDocument.DocumentType.NOC,
        )
        self.assertTrue(doc.file)
        self.assertEqual(str(doc.expiry_date), '2028-06-01')

    def test_create_rejects_noc_expiry_without_file(self):
        response = self.client.post(
            '/api/transporter/vehicles/',
            {
                'vehicle_type': 'Truck',
                'registration_number': 'NOC-BAD-1',
                'load_capacity': '5000.00',
                'noc_expiry_date': '2028-06-01',
            },
            format='json',
        )
        self.assertEqual(response.status_code, 400)
        self.assertIn('noc_file', response.json()['error'])
