"""
Générateur de données de test pour l'outil d'analyse de données.
Crée des fichiers CSV et XLSX avec des corrélations et relations polynomiales.
"""

import pandas as pd
import numpy as np
from pathlib import Path

# Configuration
np.random.seed(42)
n_samples = 500
output_dir = Path(__file__).parent.parent / "test_data"
output_dir.mkdir(exist_ok=True)

print(f"📁 Génération des données de test dans: {output_dir}")

# ============================================================================
# 1. Dataset Ventes & Marketing (corrélations multiples, relations linéaires)
# ============================================================================
print("\n📊 Dataset: Ventes & Marketing")

ventes_data = {
    # Budget marketing mensuel (€)
    'budget_marketing': np.random.uniform(1000, 50000, n_samples),

    # Heures de publicité TV
    'tv_ads_hours': np.random.uniform(5, 100, n_samples),

    # Nombre de posts sur réseaux sociaux
    'social_media_posts': np.random.randint(10, 200, n_samples),

    # Prix moyen du produit (€) - légère corrélation négative avec ventes
    'prix_moyen': np.random.uniform(20, 100, n_samples),

    # Temperature moyenne (°C) - effet saisonnier
    'temperature': np.random.normal(20, 8, n_samples),

    # Concurrence (index 1-10)
    'concurrence': np.random.randint(1, 11, n_samples),
}

df_ventes = pd.DataFrame(ventes_data)

# Créer les ventes avec des relations réalistes
# Ventes de base
ventes_base = 5000

# Effet budget marketing (fortement positif)
effet_budget = df_ventes['budget_marketing'] * 0.8

# Effet TV ads (modéré)
effet_tv = df_ventes['tv_ads_hours'] * 25

# Effet social media (faible mais positif)
effet_social = df_ventes['social_media_posts'] * 8

# Effet prix (négatif - prix plus élevé = moins de ventes)
effet_prix = -df_ventes['prix_moyen'] * 15

# Effet température (positif - meilleur temps = plus de ventes)
effet_temp = df_ventes['temperature'] * 30

# Effet concurrence (négatif)
effet_concurrence = -df_ventes['concurrence'] * 200

# Bruit aléatoire
bruit = np.random.normal(0, 500, n_samples)

# Ventes totales
df_ventes['ventes'] = (ventes_base + effet_budget + effet_tv + effet_social +
                      effet_prix + effet_temp + effet_concurrence + bruit)

# Arrondir
df_ventes['ventes'] = df_ventes['ventes'].round(2)

# Sauvegarder
ventes_csv = output_dir / "ventes_marketing.csv"
ventes_excel = output_dir / "ventes_marketing.xlsx"

df_ventes.to_csv(ventes_csv, index=False)
df_ventes.to_excel(ventes_excel, index=False)

print(f"   ✅ {ventes_csv.name}: {n_samples} lignes, {len(df_ventes.columns)} colonnes")
print(f"   ✅ {ventes_excel.name}: {n_samples} lignes, {len(df_ventes.columns)} colonnes")

# ============================================================================
# 2. Dataset Production Industriel (relation polynomiale / quadratique)
# ============================================================================
print("\n🏭 Dataset: Production Industrielle")

production_data = {
    # Température machine (°C)
    'temperature_machine': np.random.uniform(150, 250, n_samples),

    # Pression (bar)
    'pression': np.random.uniform(2, 10, n_samples),

    # Vitesse conveyor (m/min)
    'vitesse_conveyor': np.random.uniform(50, 150, n_samples),

    # Humidité (%)
    'humidite': np.random.uniform(30, 70, n_samples),

    # Qualité matière première (index 1-100)
    'qualite_matiere': np.random.uniform(60, 100, n_samples),
}

df_production = pd.DataFrame(production_data)

# Relation polynomiale: température optimale ~200°C
# Efficacité = a*(T - Toptimal)^2 + b
T_optimal = 200
df_production['efficacite_production'] = (
    -0.08 * (df_production['temperature_machine'] - T_optimal) ** 2
    + 95  # Efficacité maximale
    + df_production['pression'] * 1.5
    + df_production['vitesse_conveyor'] * 0.1
    + df_production['qualite_matiere'] * 0.3
    + np.random.normal(0, 3, n_samples)
)

# Borner entre 0 et 100
df_production['efficacite_production'] = df_production['efficacite_production'].clip(0, 100).round(2)

# Défauts de production (relation inverse avec l'efficacité)
df_production['defauts'] = (
    100 - df_production['efficacite_production']
) * 0.5 + np.random.normal(0, 1, n_samples)
df_production['defauts'] = df_production['defauts'].clip(0, None).round(2)

# Sauvegarder
production_csv = output_dir / "production_industrielle.csv"
production_excel = output_dir / "production_industrielle.xlsx"

df_production.to_csv(production_csv, index=False)
df_production.to_excel(production_excel, index=False)

print(f"   ✅ {production_csv.name}: {n_samples} lignes, {len(df_production.columns)} colonnes")
print(f"   ✅ {production_excel.name}: {n_samples} lignes, {len(df_production.columns)} colonnes")

# ============================================================================
# 3. Dataset Santé & Fitness (relations mixtes)
# ============================================================================
print("\n🏃 Dataset: Santé & Fitness")

sante_data = {
    # Âge (années)
    'age': np.random.randint(18, 80, n_samples),

    # Poids (kg)
    'poids': np.random.normal(75, 15, n_samples),

    # Taille (cm)
    'taille': np.random.normal(170, 10, n_samples),

    # Heures d'exercice par semaine
    'heures_exercice': np.random.uniform(0, 15, n_samples),

    # Calories consommées par jour
    'calories_jour': np.random.normal(2200, 400, n_samples),

    # Heures de sommeil
    'heures_sommeil': np.random.normal(7, 1.5, n_samples),

    # Niveau de stress (1-10)
    'stress': np.random.randint(1, 11, n_samples),
}

df_sante = pd.DataFrame(sante_data)

# IMC (BMI)
df_sante['imc'] = (df_sante['poids'] / (df_sante['taille'] / 100) ** 2).round(2)

# Métabolisme de base (formule de Harris-Benedict simplifiée)
# Hommes: BMR = 88.362 + (13.397 × kg) + (4.799 × cm) - (5.677 × age)
df_sante['metabolisme_base'] = (
    88.362
    + 13.397 * df_sante['poids']
    + 4.799 * df_sante['taille']
    - 5.677 * df_sante['age']
    + np.random.normal(0, 50, n_samples)
).round(2)

# Niveau d'énergie (subjectif 1-10)
df_sante['niveau_energie'] = (
    5
    + 0.3 * df_sante['heures_exercice']
    - 0.2 * df_sante['stress']
    + 0.15 * df_sante['heures_sommeil']
    - 0.01 * (df_sante['age'] - 30)
    + np.random.normal(0, 1, n_samples)
).clip(1, 10).round(2)

# Sauvegarder
sante_csv = output_dir / "sante_fitness.csv"
sante_excel = output_dir / "sante_fitness.xlsx"

df_sante.to_csv(sante_csv, index=False)
df_sante.to_excel(sante_excel, index=False)

print(f"   ✅ {sante_csv.name}: {n_samples} lignes, {len(df_sante.columns)} colonnes")
print(f"   ✅ {sante_excel.name}: {n_samples} lignes, {len(df_sante.columns)} colonnes")

# ============================================================================
# 4. Dataset Finance (relation exponentielle)
# ============================================================================
print("\n💰 Dataset: Finance & Investissement")

finance_data = {
    # Montant investi (€)
    'montant_investi': np.random.uniform(1000, 100000, n_samples),

    # Durée investissement (années)
    'duree_annees': np.random.uniform(1, 30, n_samples),

    # Taux de rendement annuel (%)
    'taux_rendement': np.random.uniform(2, 15, n_samples),

    # Risque (1-10)
    'niveau_risque': np.random.randint(1, 11, n_samples),
}

df_finance = pd.DataFrame(finance_data)

# Valeur finale avec intérêts composés: A = P(1 + r)^t
df_finance['valeur_finale'] = (
    df_finance['montant_investi'] *
    (1 + df_finance['taux_rendement'] / 100) ** df_finance['duree_annees']
    * (1 - 0.02 * df_finance['niveau_risque'])  # Pénalité de risque
    + np.random.normal(0, df_finance['montant_investi'] * 0.01, n_samples)
).round(2)

# Profit
df_finance['profit'] = (df_finance['valeur_finale'] - df_finance['montant_investi']).round(2)

# Rendement total (%)
df_finance['rendement_total'] = (df_finance['profit'] / df_finance['montant_investi'] * 100).round(2)

# Sauvegarder
finance_csv = output_dir / "finance_investissement.csv"
finance_excel = output_dir / "finance_investissement.xlsx"

df_finance.to_csv(finance_csv, index=False)
df_finance.to_excel(finance_excel, index=False)

print(f"   ✅ {finance_csv.name}: {n_samples} lignes, {len(df_finance.columns)} colonnes")
print(f"   ✅ {finance_excel.name}: {n_samples} lignes, {len(df_finance.columns)} colonnes")

# ============================================================================
# Résumé
# ============================================================================
print("\n" + "="*60)
print("✅ Tous les fichiers de test ont été générés avec succès !")
print("="*60)
print(f"\n📂 Répertoire: {output_dir}")
print("\n📋 Fichiers créés:")
print("   1. ventes_marketing.csv/xlsx    - Corrélations multiples linéaires")
print("   2. production_industrielle.csv/xlsx - Relation polynomiale (quadratique)")
print("   3. sante_fitness.csv/xlsx       - Relations mixtes + IMC calculé")
print("   4. finance_investissement.csv/xlsx - Relation exponentielle")
print("\n💡 Utilisez ces fichiers pour tester:")
print("   • Analyse de corrélation")
print("   • Régression linéaire, polynomiale, exponentielle")
print("   • Import CSV et Excel")
print("="*60)
