import { ApiProperty } from '@nestjs/swagger'; import { IsEmail, IsNotEmpty, IsOptional, IsString, IsDateString, IsEnum, IsBoolean, IsArray, ValidateNested, MinLength, MaxLength, Matches, } from 'class-validator'; import { Type } from 'class-transformer'; import { SituationFamilialeType } from 'src/entities/users.entity'; import { EnfantInscriptionDto } from './enfant-inscription.dto'; export class RegisterParentCompletDto { // ============================================ // ÉTAPE 1 : PARENT 1 (Obligatoire) // ============================================ @ApiProperty({ example: 'claire.martin@ptits-pas.fr' }) @IsEmail({}, { message: 'Email invalide' }) @IsNotEmpty({ message: 'L\'email est requis' }) email: string; @ApiProperty({ example: 'Claire' }) @IsString() @IsNotEmpty({ message: 'Le prénom est requis' }) @MinLength(2, { message: 'Le prénom doit contenir au moins 2 caractères' }) @MaxLength(100, { message: 'Le prénom ne peut pas dépasser 100 caractères' }) prenom: string; @ApiProperty({ example: 'MARTIN' }) @IsString() @IsNotEmpty({ message: 'Le nom est requis' }) @MinLength(2, { message: 'Le nom doit contenir au moins 2 caractères' }) @MaxLength(100, { message: 'Le nom ne peut pas dépasser 100 caractères' }) nom: string; @ApiProperty({ example: '0689567890' }) @IsString() @IsNotEmpty({ message: 'Le téléphone est requis' }) @Matches(/^(\+33|0)[1-9](\d{2}){4}$/, { message: 'Le numéro de téléphone doit être valide (ex: 0689567890 ou +33689567890)', }) telephone: string; @ApiProperty({ example: '5 Avenue du Général de Gaulle', required: false }) @IsOptional() @IsString() adresse?: string; @ApiProperty({ example: '95870', required: false }) @IsOptional() @IsString() @MaxLength(10) code_postal?: string; @ApiProperty({ example: 'Bezons', required: false }) @IsOptional() @IsString() @MaxLength(150) ville?: string; // ============================================ // ÉTAPE 2 : PARENT 2 / CO-PARENT (Optionnel) // ============================================ @ApiProperty({ example: 'thomas.martin@ptits-pas.fr', required: false }) @IsOptional() @IsEmail({}, { message: 'Email du co-parent invalide' }) co_parent_email?: string; @ApiProperty({ example: 'Thomas', required: false }) @IsOptional() @IsString() co_parent_prenom?: string; @ApiProperty({ example: 'MARTIN', required: false }) @IsOptional() @IsString() co_parent_nom?: string; @ApiProperty({ example: '0678456789', required: false }) @IsOptional() @IsString() @Matches(/^(\+33|0)[1-9](\d{2}){4}$/, { message: 'Le numéro de téléphone du co-parent doit être valide', }) co_parent_telephone?: string; @ApiProperty({ example: true, description: 'Le co-parent habite à la même adresse', required: false }) @IsOptional() @IsBoolean() co_parent_meme_adresse?: boolean; @ApiProperty({ required: false }) @IsOptional() @IsString() co_parent_adresse?: string; @ApiProperty({ required: false }) @IsOptional() @IsString() co_parent_code_postal?: string; @ApiProperty({ required: false }) @IsOptional() @IsString() co_parent_ville?: string; // ============================================ // ÉTAPE 3 : ENFANT(S) (Au moins 1 requis) // ============================================ @ApiProperty({ type: [EnfantInscriptionDto], description: 'Liste des enfants (au moins 1 requis)', example: [{ prenom: 'Emma', nom: 'MARTIN', date_naissance: '2023-02-15', genre: 'F', photo_base64: 'data:image/jpeg;base64,...', photo_filename: 'emma_martin.jpg' }] }) @IsArray({ message: 'La liste des enfants doit être un tableau' }) @IsNotEmpty({ message: 'Au moins un enfant est requis' }) @ValidateNested({ each: true }) @Type(() => EnfantInscriptionDto) enfants: EnfantInscriptionDto[]; // ============================================ // ÉTAPE 4 : PRÉSENTATION DU DOSSIER (Optionnel) // ============================================ @ApiProperty({ example: 'Nous recherchons une assistante maternelle bienveillante pour nos triplés...', required: false, description: 'Présentation du dossier (max 2000 caractères)' }) @IsOptional() @IsString() @MaxLength(2000, { message: 'La présentation ne peut pas dépasser 2000 caractères' }) presentation_dossier?: string; // ============================================ // ÉTAPE 5 : ACCEPTATION CGU (Obligatoire) // ============================================ @ApiProperty({ example: true, description: 'Acceptation des Conditions Générales d\'Utilisation' }) @IsBoolean() @IsNotEmpty({ message: 'L\'acceptation des CGU est requise' }) acceptation_cgu: boolean; @ApiProperty({ example: true, description: 'Acceptation de la Politique de confidentialité' }) @IsBoolean() @IsNotEmpty({ message: 'L\'acceptation de la politique de confidentialité est requise' }) acceptation_privacy: boolean; }