"""
Seed database with default admin user and dummy fleet data.
Usage: python manage.py seed
"""
from decimal import Decimal

from django.contrib.auth import get_user_model
from django.core.files.base import ContentFile
from django.core.management.base import BaseCommand
from django.utils import timezone

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

User = get_user_model()

ADMIN_EMAIL = 'admin@gmail.com'
ADMIN_PASSWORD = 'password'
FLEET_OWNER_EMAIL = 'fleet@example.com'
FLEET_OWNER_PASSWORD = 'password'

DUMMY_VEHICLES = [
    {
        'registration_number': 'DUMMY-KHI-001',
        'vehicle_type': 'Flatbed',
        'load_capacity': Decimal('12000.00'),
        'is_active': True,
        'is_verified': True,
        'documents': [
            ('NOC', VehicleDocument.ReviewStatus.APPROVED),
            ('INSURANCE', VehicleDocument.ReviewStatus.APPROVED),
            ('FITNESS', VehicleDocument.ReviewStatus.PENDING),
        ],
    },
    {
        'registration_number': 'DUMMY-LHR-002',
        'vehicle_type': 'Box truck',
        'load_capacity': Decimal('8000.00'),
        'is_active': True,
        'is_verified': False,
        'documents': [
            ('NOC', VehicleDocument.ReviewStatus.PENDING),
            ('INSURANCE', VehicleDocument.ReviewStatus.PENDING),
        ],
    },
    {
        'registration_number': 'DUMMY-ISB-003',
        'vehicle_type': 'Refrigerated',
        'load_capacity': Decimal('6000.00'),
        'is_active': False,
        'is_verified': False,
        'documents': [
            ('NOC', VehicleDocument.ReviewStatus.REJECTED),
            ('PERMIT', VehicleDocument.ReviewStatus.PENDING),
        ],
    },
    {
        'registration_number': 'DUMMY-MUL-004',
        'vehicle_type': 'Tipper',
        'load_capacity': Decimal('15000.00'),
        'is_active': True,
        'is_verified': True,
        'documents': [
            ('NOC', VehicleDocument.ReviewStatus.APPROVED),
            ('INSURANCE', VehicleDocument.ReviewStatus.APPROVED),
            ('OTHER', VehicleDocument.ReviewStatus.PENDING),
        ],
    },
]


class Command(BaseCommand):
    help = 'Create default admin user and dummy vehicles / vehicle documents'

    def handle(self, *args, **options):
        admin = self._ensure_admin()
        fleet_owner = self._ensure_fleet_owner()
        vehicle_count, document_count = self._seed_vehicles(fleet_owner, admin)

        self.stdout.write(self.style.SUCCESS(f'Seed complete: {vehicle_count} vehicle(s), {document_count} document(s).'))
        self.stdout.write(f'Admin login: {ADMIN_EMAIL} / {ADMIN_PASSWORD}')
        self.stdout.write(f'Fleet owner: {FLEET_OWNER_EMAIL} / {FLEET_OWNER_PASSWORD}')

    def _ensure_admin(self):
        email = ADMIN_EMAIL.strip().lower()
        if User.objects.filter(username=email).exists():
            user = User.objects.get(username=email)
            user.set_password(ADMIN_PASSWORD)
            user.is_staff = True
            user.is_superuser = True
            user.is_active = True
            user.save()
            role, created = UserRole.objects.get_or_create(user=user, defaults={'role': UserRole.Role.ADMIN})
            if not created and role.role != UserRole.Role.ADMIN:
                role.role = UserRole.Role.ADMIN
                role.save()
            self.stdout.write(self.style.SUCCESS(f'Updated existing user {email} as Admin.'))
            return user

        user = User.objects.create_user(
            username=email,
            email=email,
            password=ADMIN_PASSWORD,
            is_staff=True,
            is_superuser=True,
            is_active=True,
        )
        UserRole.objects.create(user=user, role=UserRole.Role.ADMIN, phone='+920000000001')
        self.stdout.write(self.style.SUCCESS(f'Created admin user: {email}'))
        return user

    def _ensure_fleet_owner(self):
        email = FLEET_OWNER_EMAIL.strip().lower()
        if User.objects.filter(username=email).exists():
            user = User.objects.get(username=email)
            user.set_password(FLEET_OWNER_PASSWORD)
            user.is_active = True
            user.save()
            self.stdout.write(f'Using existing fleet owner: {email}')
        else:
            user = User.objects.create_user(
                username=email,
                email=email,
                password=FLEET_OWNER_PASSWORD,
                first_name='Fast',
                last_name='Fleet',
                is_active=True,
            )
            self.stdout.write(self.style.SUCCESS(f'Created fleet owner: {email}'))

        UserRole.objects.update_or_create(
            user=user,
            defaults={'role': UserRole.Role.TRANSPORTER, 'phone': '+923001234567', 'language': 'en'},
        )
        TransporterProfile.objects.update_or_create(
            user=user,
            defaults={
                'account_type': TransporterProfile.AccountType.FLEET_OWNER,
                'company_name': 'Fast Fleet Logistics',
                'local': True,
                'country_to_country': False,
                'documents_verified': True,
            },
        )
        return user

    def _seed_vehicles(self, owner, admin):
        vehicle_count = 0
        document_count = 0
        now = timezone.now()

        for spec in DUMMY_VEHICLES:
            vehicle, created = Vehicle.objects.get_or_create(
                owner=owner,
                registration_number=spec['registration_number'],
                defaults={
                    'vehicle_type': spec['vehicle_type'],
                    'load_capacity': spec['load_capacity'],
                    'max_length_m': Decimal('12.000'),
                    'max_width_m': Decimal('2.500'),
                    'max_height_m': Decimal('3.000'),
                    'special_features': 'Dummy seed data',
                    'is_active': spec['is_active'],
                    'is_verified': spec['is_verified'],
                    'verified_at': now if spec['is_verified'] else None,
                    'verified_by': admin if spec['is_verified'] else None,
                },
            )
            if created:
                vehicle_count += 1
                self.stdout.write(f'  Created vehicle {vehicle.registration_number}')
            else:
                self.stdout.write(f'  Vehicle already exists: {vehicle.registration_number}')

            for doc_type, review_status in spec['documents']:
                filename = f'{spec["registration_number"].lower()}-{doc_type.lower()}.pdf'
                document, doc_created = VehicleDocument.objects.get_or_create(
                    vehicle=vehicle,
                    document_type=doc_type,
                    defaults={
                        'review_status': review_status,
                        'review_notes': 'Dummy seed document.' if review_status != VehicleDocument.ReviewStatus.PENDING else '',
                        'reviewed_at': now if review_status != VehicleDocument.ReviewStatus.PENDING else None,
                        'reviewed_by': admin if review_status != VehicleDocument.ReviewStatus.PENDING else None,
                    },
                )
                if not document.file:
                    document.file.save(
                        filename,
                        ContentFile(b'%PDF-1.4\n%Dummy vehicle document for local development.\n'),
                        save=True,
                    )
                if doc_created:
                    document_count += 1
                    self.stdout.write(f'    Created document {doc_type} ({review_status})')

        return vehicle_count, document_count
