import { ApiProperty } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import {
  IsEmail,
  IsNotEmpty,
  IsOptional,
  IsString,
  IsBoolean,
  IsInt,
  Min,
  Max,
  MinLength,
  MaxLength,
  Matches,
  IsDateString,
} from 'class-validator';

export class RegisterAMCompletDto {
  // ============================================
  // ÉTAPE 1 : IDENTITÉ (Obligatoire)
  // ============================================

  @ApiProperty({ example: 'marie.dupont@ptits-pas.fr' })
  @IsEmail({}, { message: 'Email invalide' })
  @IsNotEmpty({ message: "L'email est requis" })
  email: string;

  @ApiProperty({ example: 'Marie' })
  @IsString()
  @IsNotEmpty({ message: 'Le prénom est requis' })
  @MinLength(2, { message: 'Le prénom doit contenir au moins 2 caractères' })
  @MaxLength(100)
  prenom: string;

  @ApiProperty({ example: 'DUPONT' })
  @IsString()
  @IsNotEmpty({ message: 'Le nom est requis' })
  @MinLength(2, { message: 'Le nom doit contenir au moins 2 caractères' })
  @MaxLength(100)
  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 : PHOTO + INFOS PRO
  // ============================================

  @ApiProperty({
    example: 'data:image/jpeg;base64,/9j/4AAQ...',
    required: false,
    description: 'Photo de profil en base64',
  })
  @IsOptional()
  @IsString()
  photo_base64?: string;

  @ApiProperty({
    example: 'photo_profil.jpg',
    required: false,
    description:
      'Nom du fichier photo (optionnel si photo_base64 est fourni ; défaut serveur : photo_am.jpg). L’extension réelle du fichier stocké suit le type MIME du data-URL.',
  })
  @IsOptional()
  @IsString()
  photo_filename?: string;

  @ApiProperty({ example: true, description: 'Consentement utilisation photo' })
  @IsBoolean()
  @IsNotEmpty({ message: 'Le consentement photo est requis' })
  consentement_photo: boolean;

  @ApiProperty({ example: '2024-01-15', required: false, description: 'Date de naissance' })
  @IsOptional()
  @IsDateString()
  date_naissance?: string;

  @ApiProperty({ example: 'Paris', description: 'Ville de naissance (obligatoire)' })
  @Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
  @IsString()
  @IsNotEmpty({ message: 'La ville de naissance est requise' })
  @MinLength(2, { message: 'La ville de naissance doit contenir au moins 2 caractères' })
  @MaxLength(100)
  lieu_naissance_ville: string;

  @ApiProperty({ example: 'France', description: 'Pays de naissance (obligatoire)' })
  @Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
  @IsString()
  @IsNotEmpty({ message: 'Le pays de naissance est requis' })
  @MinLength(2, { message: 'Le pays de naissance doit contenir au moins 2 caractères' })
  @MaxLength(100)
  lieu_naissance_pays: string;

  @ApiProperty({ example: '123456789012345', description: 'NIR 15 caractères (chiffres, ou 2A/2B pour la Corse)' })
  @IsString()
  @IsNotEmpty({ message: 'Le NIR est requis' })
  @Matches(/^[1-3]\d{4}(?:2A|2B|\d{2})\d{6}\d{2}$/, {
    message: 'Le NIR doit contenir 15 caractères (chiffres, ou 2A/2B pour la Corse)',
  })
  nir: string;

  @ApiProperty({ example: 'AGR-2024-12345', description: "Numéro d'agrément" })
  @IsString()
  @IsNotEmpty({ message: "Le numéro d'agrément est requis" })
  @MaxLength(50)
  numero_agrement: string;

  @ApiProperty({ example: '2024-06-01', required: false, description: "Date d'obtention de l'agrément" })
  @IsOptional()
  @IsDateString()
  date_agrement?: string;

  @ApiProperty({ example: 4, description: 'Capacité d\'accueil (nombre d\'enfants)', minimum: 1, maximum: 10 })
  @IsInt()
  @Min(1, { message: 'La capacité doit être au moins 1' })
  @Max(10, { message: 'La capacité ne peut pas dépasser 10' })
  capacite_accueil: number;

  @ApiProperty({
    example: 2,
    description: 'Nombre de places libres actuellement (≤ capacité d\'accueil)',
    minimum: 0,
    maximum: 10,
  })
  @IsInt()
  @Min(0, { message: 'Les places disponibles ne peuvent pas être négatives' })
  @Max(10, { message: 'Les places disponibles ne peuvent pas dépasser 10' })
  places_disponibles: number;

  // ============================================
  // ÉTAPE 3 : PRÉSENTATION (Optionnel)
  // ============================================

  @ApiProperty({
    example: 'Assistante maternelle expérimentée, accueil bienveillant...',
    required: false,
    description: 'Présentation / biographie (max 2000 caractères)',
  })
  @IsOptional()
  @IsString()
  @MaxLength(2000, { message: 'La présentation ne peut pas dépasser 2000 caractères' })
  biographie?: string;

  // ============================================
  // ÉTAPE 4 : ACCEPTATION CGU (Obligatoire)
  // ============================================

  @ApiProperty({ example: true, description: "Acceptation des CGU" })
  @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;
}
