import { ApiProperty } from '@nestjs/swagger';
import { IsInt, IsNotEmpty, IsOptional, IsBoolean, IsArray, ValidateNested, IsString } from 'class-validator';
import { Type } from 'class-transformer';

/**
 * DTO for overriding specific section properties during cloning
 */
export class SectionOverrideDto {
  @ApiProperty({ 
    description: 'Template form section ID to override', 
    example: 10 
  })
  @IsInt()
  @IsNotEmpty()
  templateSectionId: number;

  @ApiProperty({ 
    description: 'Override section name', 
    example: 'Personal Details',
    required: false 
  })
  @IsOptional()
  @IsString()
  name?: string;

  @ApiProperty({ 
    description: 'Override section description', 
    example: 'Please provide your personal information',
    required: false 
  })
  @IsOptional()
  @IsString()
  description?: string;

  @ApiProperty({ 
    description: 'Override display order', 
    example: 1,
    required: false 
  })
  @IsOptional()
  @IsInt()
  displayOrder?: number;

  @ApiProperty({ 
    description: 'Override conditional config', 
    example: { showIf: { questionId: 5, value: 'yes' } },
    required: false 
  })
  @IsOptional()
  conditionalConfig?: Record<string, any>;
}

/**
 * DTO for overriding specific question properties during cloning
 */
export class QuestionOverrideDto {
  @ApiProperty({ 
    description: 'Template question ID to override', 
    example: 101 
  })
  @IsInt()
  @IsNotEmpty()
  templateQuestionId: number;

  @ApiProperty({ 
    description: 'Override question label/text', 
    example: 'What is your full name?',
    required: false 
  })
  @IsOptional()
  @IsString()
  label?: string;

  @ApiProperty({ 
    description: 'Override question type', 
    example: 'text',
    required: false 
  })
  @IsOptional()
  @IsString()
  type?: string;

  @ApiProperty({ 
    description: 'Override question config (validation, visibility, etc.)', 
    example: { required: true, minLength: 2 },
    required: false 
  })
  @IsOptional()
  config?: Record<string, any>;

  @ApiProperty({ 
    description: 'Override option config for dropdown/radio questions', 
    example: [{ value: 'yes', label: 'Yes' }, { value: 'no', label: 'No' }],
    required: false 
  })
  @IsOptional()
  optionConfig?: Record<string, any>[];

  @ApiProperty({ 
    description: 'Override display order', 
    example: 1,
    required: false 
  })
  @IsOptional()
  @IsInt()
  displayOrder?: number;

  @ApiProperty({ 
    description: 'Override question status', 
    example: 'active',
    required: false 
  })
  @IsOptional()
  @IsString()
  status?: string;
}

/**
 * DTO for cloning template sections and questions to program level
 */
export class CloneFromTemplateDto {
  @ApiProperty({ 
    description: 'Program ID to clone template into', 
    example: 1 
  })
  @IsInt()
  @IsNotEmpty()
  programId: number;

  @ApiProperty({ 
    description: 'Program template ID to clone from', 
    example: 5 
  })
  @IsInt()
  @IsNotEmpty()
  programTemplateId: number;

  @ApiProperty({ 
    description: 'Whether to deep clone (include all child sections in hierarchy)', 
    default: true,
    required: false 
  })
  @IsOptional()
  @IsBoolean()
  deepClone?: boolean = true;

  @ApiProperty({ 
    description: 'Whether to clone questions within sections', 
    default: true,
    required: false 
  })
  @IsOptional()
  @IsBoolean()
  cloneQuestions?: boolean = true;

  @ApiProperty({ 
    description: 'Whether to override existing cloned data (delete and re-clone)', 
    default: false,
    required: false 
  })
  @IsOptional()
  @IsBoolean()
  override?: boolean = false;

  @ApiProperty({ 
    description: 'User ID performing the cloning operation (optional - set by controller from auth)', 
    example: 9533,
    required: false
  })
  @IsOptional()
  @IsInt()
  createdBy?: number;

  @ApiProperty({ 
    description: 'Optional overrides for specific sections during cloning', 
    type: [SectionOverrideDto],
    required: false 
  })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => SectionOverrideDto)
  sectionOverrides?: SectionOverrideDto[];

  @ApiProperty({ 
    description: 'Optional overrides for specific questions during cloning', 
    type: [QuestionOverrideDto],
    required: false 
  })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => QuestionOverrideDto)
  questionOverrides?: QuestionOverrideDto[];

  @ApiProperty({ 
    description: 'Specific template section IDs to clone (if not cloning all)', 
    type: [Number],
    required: false 
  })
  @IsOptional()
  @IsArray()
  @IsInt({ each: true })
  specificSectionIds?: number[];

  @ApiProperty({ 
    description: 'Specific template question IDs to clone (if not cloning all)', 
    type: [Number],
    required: false 
  })
  @IsOptional()
  @IsArray()
  @IsInt({ each: true })
  specificQuestionIds?: number[];
}
