import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { LotType } from '@prisma/client';
import { IsEnum, IsInt, IsOptional, IsString, Max, Min, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';

/**
 * Layout generator for a complex — builds Buildings × Floors × Units + parkings + storages
 * in one shot. UX_RECOMMANDATIONS §3.3 P0-6.
 */
export class GenerateBuildingDto {
  @ApiProperty({ example: 'A' }) @IsString() code!: string;
  @ApiPropertyOptional({ example: 'Bâtiment A' }) @IsOptional() @IsString() label?: string;
  @ApiProperty({ example: 5, minimum: 1, maximum: 60 }) @IsInt() @Min(1) @Max(60) floors!: number;
  @ApiProperty({ example: 4, minimum: 1, maximum: 40 }) @IsInt() @Min(1) @Max(40) unitsPerFloor!: number;
  @ApiPropertyOptional({ enum: LotType, default: LotType.APPARTEMENT })
  @IsOptional() @IsEnum(LotType) unitType?: LotType;
  @ApiPropertyOptional({ example: 65, description: 'Default surface m² per unit' })
  @IsOptional() @IsInt() @Min(1) defaultSurfaceM2?: number;
}

export class GenerateLayoutDto {
  @ApiProperty({ type: [GenerateBuildingDto] })
  @ValidateNested({ each: true })
  @Type(() => GenerateBuildingDto)
  buildings!: GenerateBuildingDto[];

  @ApiPropertyOptional({ example: 50, minimum: 0, maximum: 2000 })
  @IsOptional() @IsInt() @Min(0) @Max(2000) parkingCount?: number;

  @ApiPropertyOptional({ example: 20, minimum: 0, maximum: 2000 })
  @IsOptional() @IsInt() @Min(0) @Max(2000) caveCount?: number;
}
