from django.db import models
from django.conf import settings

class BusinessPlan(models.Model):
    """
    Le conteneur principal du Business Plan.
    Lié à un utilisateur, il ne peut être créé que si l'étude de marché est validée.
    Ordre des champs = BP_complet.md (modèle officiel Sénégal).
    """
    entrepreneur = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='business_plan')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    # --- EN-TÊTE (page de garde) ---
    project_title = models.CharField(max_length=300, blank=True, verbose_name="Titre du projet")
    elaboration_month = models.PositiveSmallIntegerField(null=True, blank=True, verbose_name="Mois d'élaboration (1-12)")
    elaboration_year = models.PositiveSmallIntegerField(null=True, blank=True, verbose_name="Année d'élaboration")

    # --- I. PRÉSENTATION DU PROMOTEUR ---
    promoter_name = models.CharField(max_length=255, blank=True, verbose_name="Nom du promoteur")
    company_name = models.CharField(max_length=200, verbose_name="Raison sociale")
    legal_status = models.CharField(max_length=100, verbose_name="Statut juridique")
    creation_date = models.DateField(null=True, blank=True, verbose_name="Date de création")
    receipt_number = models.CharField(max_length=100, blank=True, verbose_name="Numéro récépissé (association)")
    rc_number = models.CharField(max_length=100, blank=True, verbose_name="Numéro Registre de Commerce")
    ninea = models.CharField(max_length=50, blank=True, verbose_name="NINEA")
    address = models.CharField(max_length=255, verbose_name="Adresse")

    contact_name = models.CharField(max_length=255, blank=True, verbose_name="Personne à contacter (Nom complet)")
    contact_phone = models.CharField(max_length=50, blank=True, verbose_name="Téléphone contact")
    contact_email = models.EmailField(blank=True, verbose_name="Email contact")
    contact_address = models.CharField(max_length=255, blank=True, verbose_name="Adresse contact")
    
    # I.2 Capacité et compétences du promoteur (blank pour sauvegarde étape par étape)
    capacity_reasons = models.TextField(blank=True, verbose_name="Raisons des capacités à mener le projet")
    experience_text = models.TextField(blank=True, default="", verbose_name="Votre expérience")
    training_text = models.TextField(blank=True, default="", verbose_name="Votre formation")
    skills_text = models.TextField(blank=True, default="", verbose_name="Vos compétences")

    # --- II. PRÉSENTATION PROJET ---
    project_object = models.TextField(blank=True, default="", verbose_name="Objet du projet")
    project_objectives = models.TextField(blank=True, default="", verbose_name="Objectifs du projet")
    location_reason = models.TextField(blank=True, default="", verbose_name="Justification de la localisation")

    # --- III. ÉTUDE DE MARCHÉ & MARKETING ---
    product_description = models.TextField(verbose_name="Présentation du produit / service", blank=True)
    competition_analysis = models.TextField(verbose_name="Étude de la concurrence", blank=True)
    customer_analysis = models.TextField(verbose_name="Étude de la clientèle", blank=True)
    marketing_strategy = models.TextField(blank=True, default="", verbose_name="Stratégie Marketing Globale")

    # --- IV. ÉTUDE TECHNIQUE ---
    process_description = models.TextField(verbose_name="Processus de production / prestation", blank=True)

    # --- V. DONNÉES FINANCIÈRES (Financement) - default pour sauvegarde étape par étape ---
    personal_contribution = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name="Apport Personnel")
    other_funding = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name="Autres financements")
    
    # Paramètres de l'emprunt
    loan_interest_rate = models.DecimalField(max_digits=5, decimal_places=2, default=0, verbose_name="Taux d'intérêt (%)")
    loan_duration_months = models.IntegerField(default=0, verbose_name="Durée du remboursement (mois)")
    loan_deferral_months = models.IntegerField(default=0, verbose_name="Différé (mois)")
    LOAN_PERIODICITY_CHOICES = (
        ('MENSUEL', 'Mensuel'),
        ('TRIMESTRIEL', 'Trimestriel'),
        ('ANNUEL', 'Annuel'),
    )
    loan_repayment_periodicity = models.CharField(
        max_length=20,
        choices=LOAN_PERIODICITY_CHOICES,
        default='MENSUEL',
        verbose_name="Périodicité du remboursement"
    )

    def __str__(self):
        return f"Business Plan - {self.company_name}"

# --- TABLES DÉTAILLÉES (Listes) ---

class MarketingActivity(models.Model):
    """Stratégie marketing déclinée en activités (tableau ACTIVITÉS / DESCRIPTION)."""
    plan = models.ForeignKey(BusinessPlan, on_delete=models.CASCADE, related_name='marketing_activities')
    activity_name = models.CharField(max_length=200, blank=True, default="", verbose_name="Activité")
    description = models.TextField(blank=True, verbose_name="Description")

    class Meta:
        ordering = ['id']


class Investment(models.Model):
    TYPE_CHOICES = (
        ('INCORPOREL', 'Incorporel (Frais, Logiciels...)'),
        ('CORPOREL', 'Corporel (Matériel, Travaux...)'),
    )
    plan = models.ForeignKey(BusinessPlan, on_delete=models.CASCADE, related_name='investments')
    name = models.CharField(max_length=200, blank=True, default="", verbose_name="Désignation")
    invest_type = models.CharField(max_length=20, choices=TYPE_CHOICES, default="CORPOREL")
    quantity = models.IntegerField(default=1)
    unit_price = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    duration_years = models.IntegerField(default=5, verbose_name="Durée d'amortissement (années)")
    description = models.TextField(blank=True, verbose_name="Description")

    @property
    def total_cost(self):
        return self.quantity * self.unit_price

    @property
    def annual_amortization(self):
        if self.duration_years > 0:
            return self.total_cost / self.duration_years
        return 0

class HumanResource(models.Model):
    plan = models.ForeignKey(BusinessPlan, on_delete=models.CASCADE, related_name='human_resources')
    position = models.CharField(max_length=100, blank=True, default="", verbose_name="Poste")
    count = models.IntegerField(default=1, verbose_name="Nombre")
    monthly_salary = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="Salaire Mensuel (Chargé)")
    description = models.TextField(blank=True)

class StartupCost(models.Model):
    CATEGORY_CHOICES = (
        ('LABOR', 'Main d\'œuvre'),
        ('MATERIAL', 'Matières premières'),
        ('FIXED', 'Charges fixes'),
    )
    plan = models.ForeignKey(BusinessPlan, on_delete=models.CASCADE, related_name='startup_costs')
    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES)
    designation = models.CharField(max_length=200, blank=True, default="")
    monthly_amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    months_needed = models.IntegerField(default=3, verbose_name="Mois à couvrir (BFR)")

    @property
    def total_bfr(self):
        return self.monthly_amount * self.months_needed

class RevenueForecast(models.Model):
    plan = models.ForeignKey(BusinessPlan, on_delete=models.CASCADE, related_name='revenues')
    product_name = models.CharField(max_length=200, blank=True, default="", verbose_name="Produit/Service")
    year_1 = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    year_2 = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    year_3 = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    year_4 = models.DecimalField(max_digits=12, decimal_places=2, default=0)

class ExpenseForecast(models.Model):
    plan = models.ForeignKey(BusinessPlan, on_delete=models.CASCADE, related_name='expenses')
    designation = models.CharField(max_length=200, blank=True, default="", verbose_name="Désignation Dépense")
    year_1 = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    year_2 = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    year_3 = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    year_4 = models.DecimalField(max_digits=12, decimal_places=2, default=0)