import 'dart:math'; class DataGenerator { static final Random _random = Random(); static final List _firstNames = [ 'Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Félix', 'Gabrielle', 'Hugo', 'Inès', 'Jules', 'Léa', 'Manon', 'Nathan', 'Oscar', 'Pauline', 'Quentin', 'Raphaël', 'Sophie', 'Théo', 'Victoire' ]; static final List _lastNames = [ 'Martin', 'Bernard', 'Dubois', 'Thomas', 'Robert', 'Richard', 'Petit', 'Durand', 'Leroy', 'Moreau', 'Simon', 'Laurent', 'Lefebvre', 'Michel', 'Garcia', 'David', 'Bertrand', 'Roux', 'Vincent', 'Fournier' ]; static final List _addressSuffixes = [ 'Rue de la Paix', 'Boulevard des Rêves', 'Avenue du Soleil', 'Place des Étoiles', 'Chemin des Champs' ]; static final List _motivationSnippets = [ 'Nous cherchons une personne de confiance.', 'Nos horaires sont atypiques.', 'Notre enfant est plein de vie.', 'Nous souhaitons une garde à temps plein.', 'Une adaptation en douceur est primordiale pour nous.', 'Nous avons hâte de vous rencontrer.', 'La pédagogie Montessori nous intéresse.' ]; static final List _frenchCities = [ 'Paris', 'Lyon', 'Marseille', 'Toulouse', 'Nice', 'Nantes', 'Montpellier', 'Strasbourg', 'Bordeaux', 'Lille', 'Rennes', 'Reims', 'Saint-Étienne', 'Toulon', 'Le Havre', 'Grenoble', 'Dijon', 'Angers', 'Nîmes', 'Villeurbanne', 'Clermont-Ferrand', 'Le Mans', 'Aix-en-Provence', 'Brest', 'Tours', 'Amiens', 'Limoges', 'Annecy', 'Boulogne-Billancourt', 'Perpignan' ]; static final List _countries = [ 'France', 'Belgique', 'Suisse', 'Canada', 'Maroc', 'Algérie', 'Tunisie', 'Sénégal', 'Côte d\'Ivoire', 'Madagascar', 'Espagne', 'Italie', 'Portugal', 'Allemagne', 'Royaume-Uni' ]; static final List _childminderPresentations = [ 'Bonjour,\n\nJe suis assistante maternelle agréée depuis plusieurs années et je souhaite rejoindre votre plateforme. J\'ai de l\'expérience avec les enfants de tous âges et je privilégie un accompagnement bienveillant.\n\nCordialement', 'Madame, Monsieur,\n\nTitulaire d\'un agrément d\'assistante maternelle, je propose un accueil personnalisé dans un environnement sécurisé et stimulant. Je suis disponible pour discuter de vos besoins.\n\nBien à vous', 'Bonjour,\n\nAssistante maternelle passionnée, je propose un accueil de qualité dans ma maison adaptée aux enfants. J\'ai suivi plusieurs formations et je suis disponible à temps plein.\n\nÀ bientôt', 'Cher gestionnaire,\n\nJe suis une professionnelle expérimentée dans la garde d\'enfants. Mon domicile est aménagé pour accueillir les petits dans les meilleures conditions. Je serais ravie de faire partie de votre réseau.\n\nCordialement', 'Bonjour,\n\nDepuis 5 ans, j\'exerce comme assistante maternelle avec passion. Je propose des activités d\'éveil adaptées et un suivi personnalisé de chaque enfant. Mon agrément me permet d\'accueillir jusqu\'à 4 enfants.\n\nBien cordialement' ]; static String firstName() => _firstNames[_random.nextInt(_firstNames.length)]; static String lastName() => _lastNames[_random.nextInt(_lastNames.length)]; static String address() => "${_random.nextInt(100) + 1} ${_addressSuffixes[_random.nextInt(_addressSuffixes.length)]}"; static String postalCode() => "750${_random.nextInt(10)}${_random.nextInt(10)}"; static String city() => "Paris"; static String phone() => "06${_random.nextInt(10)}${_random.nextInt(10)}${_random.nextInt(10)}${_random.nextInt(10)}${_random.nextInt(10)}${_random.nextInt(10)}${_random.nextInt(10)}${_random.nextInt(10)}"; static String email(String firstName, String lastName) => "${firstName.toLowerCase()}.${lastName.toLowerCase()}@example.com"; static String password() => "password123"; // Simple pour le test static String dob({bool isUnborn = false}) { final now = DateTime.now(); if (isUnborn) { final provisionalDate = now.add(Duration(days: _random.nextInt(180) + 30)); // Entre 1 et 7 mois dans le futur return "${provisionalDate.day.toString().padLeft(2, '0')}/${provisionalDate.month.toString().padLeft(2, '0')}/${provisionalDate.year}"; } else { final birthYear = now.year - _random.nextInt(3); // Enfants de 0 à 2 ans final birthMonth = _random.nextInt(12) + 1; final birthDay = _random.nextInt(28) + 1; // Simple, évite les pbs de jours/mois return "${birthDay.toString().padLeft(2, '0')}/${birthMonth.toString().padLeft(2, '0')}/${birthYear}"; } } static bool boolean() => _random.nextBool(); static String motivation() { int count = _random.nextInt(3) + 2; // 2 à 4 phrases List chosenSnippets = []; while(chosenSnippets.length < count) { String snippet = _motivationSnippets[_random.nextInt(_motivationSnippets.length)]; if (!chosenSnippets.contains(snippet)) { chosenSnippets.add(snippet); } } return chosenSnippets.join(' '); } static String birthDate() { final now = DateTime.now(); final age = _random.nextInt(31) + 25; // Entre 25 et 55 ans final birthYear = now.year - age; final birthMonth = _random.nextInt(12) + 1; final birthDay = _random.nextInt(28) + 1; return "${birthDay.toString().padLeft(2, '0')}/${birthMonth.toString().padLeft(2, '0')}/${birthYear}"; } /// Génère une ville de naissance française static String birthCity() => _frenchCities[_random.nextInt(_frenchCities.length)]; /// Génère un pays de naissance static String birthCountry() => _countries[_random.nextInt(_countries.length)]; /// Génère un numéro de sécurité sociale français (NIR) static String socialSecurityNumber() { // Format NIR français : 1 YYMM DD CCC KK // 1 = sexe (1 homme, 2 femme) final sex = _random.nextBool() ? '1' : '2'; // YY = année de naissance (2 derniers chiffres) final currentYear = DateTime.now().year; final birthYear = currentYear - (_random.nextInt(31) + 25); // 25-55 ans final yy = (birthYear % 100).toString().padLeft(2, '0'); // MM = mois de naissance final mm = (_random.nextInt(12) + 1).toString().padLeft(2, '0'); // DD = département de naissance (01-95) final dd = (_random.nextInt(95) + 1).toString().padLeft(2, '0'); // CCC = numéro d'ordre (001-999) final ccc = (_random.nextInt(999) + 1).toString().padLeft(3, '0'); // KK = clé de contrôle (simulation) final kk = _random.nextInt(100).toString().padLeft(2, '0'); return '$sex$yy$mm$dd$ccc$kk'; } /// Génère un numéro d'agrément pour assistante maternelle static String agreementNumber() { final year = DateTime.now().year; final dept = _random.nextInt(95) + 1; // Département 01-95 final sequence = _random.nextInt(9999) + 1; // Numéro de séquence return 'AM${dept.toString().padLeft(2, '0')}$year${sequence.toString().padLeft(4, '0')}'; } /// Génère un nombre d'enfants maximum pour l'agrément (1-4) static int maxChildren() => _random.nextInt(4) + 1; /// Génère un message de présentation pour assistante maternelle static String childminderPresentation() => _childminderPresentations[_random.nextInt(_childminderPresentations.length)]; /// Génère un âge d'enfant en mois (0-36 mois) static int childAgeInMonths() => _random.nextInt(37); /// Génère une durée d'expérience en années (1-15 ans) static int experienceYears() => _random.nextInt(15) + 1; /// Génère un tarif horaire (entre 3.50€ et 6.00€) static double hourlyRate() { final rate = 3.50 + (_random.nextDouble() * 2.50); return double.parse(rate.toStringAsFixed(2)); } /// Génère des disponibilités (jours de la semaine) static List availability() { final days = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche']; final availableDays = []; // Au moins 3 jours de disponibilité final minDays = 3; final maxDays = days.length; final numDays = _random.nextInt(maxDays - minDays + 1) + minDays; final selectedIndices = []; while (selectedIndices.length < numDays) { final index = _random.nextInt(days.length); if (!selectedIndices.contains(index)) { selectedIndices.add(index); availableDays.add(days[index]); } } return availableDays; } /// Génère des horaires (format "08h30-17h30") static String workingHours() { final startHours = [7, 8, 9]; final endHours = [16, 17, 18, 19]; final startHour = startHours[_random.nextInt(startHours.length)]; final endHour = endHours[_random.nextInt(endHours.length)]; final startMinutes = _random.nextBool() ? '00' : '30'; final endMinutes = _random.nextBool() ? '00' : '30'; return '${startHour}h$startMinutes-${endHour}h$endMinutes'; } }