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;
}

