from django.core.management.base import BaseCommand
from billing.models import Client, Dossier, TypeService, Service, LigneDossier, Proforma, Facture, Paiement, Societe
from django.utils import timezone
import random
from decimal import Decimal
import datetime

class Command(BaseCommand):
    help = 'Populates the database with fake data for testing'

    def handle(self, *args, **kwargs):
        self.stdout.write('Creating fake data...')
        
        # 1. Clients
        clients = []
        for i in range(5):
            c, created = Client.objects.get_or_create(
                nom=f"Client Test {i+1}",
                defaults={
                    'adresse': f"{i*10} Avenue de la Paix, Kinshasa",
                    'email': f"client{i+1}@example.com",
                    'telephone': f"+2438100000{i}"
                }
            )
            clients.append(c)
        self.stdout.write(f'Clients created: {len(clients)}')

        # 2. TypeService & Service (Ensure defaults exist)
        ts_frais, _ = TypeService.objects.get_or_create(code='FRAIS', defaults={'designation': 'Frais Administratifs'})
        ts_debours, _ = TypeService.objects.get_or_create(code='DEBOURS', defaults={'designation': 'Débours'})
        
        services = []
        for i in range(3):
            s, _ = Service.objects.get_or_create(
                code=f'F-{i}', 
                type_service=ts_frais,
                defaults={'designation': f'Frais Service {i}'}
            )
            services.append(s)
        for i in range(3):
            s, _ = Service.objects.get_or_create(
                code=f'D-{i}', 
                type_service=ts_debours,
                defaults={'designation': f'Débours Service {i}'}
            )
            services.append(s)

        # 3. Dossiers
        for i in range(10):
            client = random.choice(clients)
            dossier = Dossier.objects.create(
                client=client,
                description=f"Importation Lot {i+1}",
                ref_client=f"REF-{2024}-{i}",
                statut='EN_COURS',
                date_ouverture=timezone.now(),
                valeur_cif_usd=Decimal(random.randint(1000, 50000)),
                taux_change=Decimal('2800.00'),
                taux_douane=Decimal('10.00'),
                nombre_colis=random.randint(1, 100),
                poids=Decimal(random.randint(50, 5000))
            )
            
            # Add Lignes
            for s in services:
                if random.choice([True, False]):
                    LigneDossier.objects.create(
                        dossier=dossier,
                        service=s,
                        montant=Decimal(random.randint(50, 500)),
                        devise='USD'
                    )
            
            # Maybe create Proforma
            if i % 2 == 0:
                import time
                time.sleep(1.1) # Sleep to ensure unique timestamp for Proforma
                prof = Proforma.objects.create(dossier=dossier, statut='VALIDEE')
                
                # Maybe create Facture
                if i % 4 == 0:
                    facture = Facture.objects.create(
                        proforma=prof,
                        dossier=dossier
                    )
                    
                    # Maybe Payment
                    Paiement.objects.create(
                        client=client,
                        facture=facture,
                        montant=Decimal('100.00'),
                        devise='USD',
                        reference=f"PAY-{i}",
                        date_paiement=timezone.now().date()
                    )

        self.stdout.write(self.style.SUCCESS('Successfully populated database with fake data'))
