import { ApiProperty } from '@nestjs/swagger';
import { IsInt, IsNotEmpty, IsOptional, IsArray, IsBoolean, IsString, IsObject, ValidateNested, IsEnum } from 'class-validator';
import { Type } from 'class-transformer';
import { QuestionType } from 'src/common/enum/question-type.enum';
import { AnswerType } from 'src/common/enum/answer-type.enum';

export class SectionFieldOverrides {
  @ApiProperty({ description: 'Master section ID to apply overrides to', example: 1 })
  @IsInt()
  @IsNotEmpty()
  masterSectionId: number;

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

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

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

  @ApiProperty({ description: 'Override parent section ID (use null to make it a root section)', required: false })
  @IsOptional()
  @IsInt()
  parentSectionId?: number | null;

  @ApiProperty({ description: 'Override conditional configuration', required: false })
  @IsOptional()
  @IsObject()
  conditionalConfig?: any;
}

/**
 * Question field overrides for cloning
 * Note: bindingKey and answerLocation cannot be overridden and will always use master values
 */
export class QuestionFieldOverrides {
  @ApiProperty({ description: 'Master question ID to apply overrides to', example: 101 })
  @IsInt()
  @IsNotEmpty()
  masterQuestionId: number;

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

  @ApiProperty({ description: 'Override question type', required: false, enum: QuestionType })
  @IsOptional()
  @IsEnum(QuestionType)
  questionType?: QuestionType;

  @ApiProperty({ description: 'Override answer type', required: false, enum: AnswerType })
  @IsOptional()
  @IsEnum(AnswerType)
  answerType?: AnswerType;

  @ApiProperty({ 
    description: 'Override option configuration (for dropdown, radio, checkbox questions)', 
    required: false, 
    type: [Object],
    example: [{ id: 1, value: 'Option 1' }, { id: 2, value: 'Option 2' }]
  })
  @IsOptional()
  @IsObject({ each: true })
  optionConfig?: Record<string, any>[];

  @ApiProperty({ description: 'Override question configuration', required: false, type: Object })
  @IsOptional()
  @IsObject()
  config?: Record<string, any>;

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

export class CloneFromMasterDto {
  @ApiProperty({ 
    description: 'Program template ID to clone into (can be provided in request body or route parameter)', 
    example: 1,
    required: false
  })
  @IsOptional()
  @IsInt()
  programTemplateId?: number;

  @ApiProperty({ 
    description: 'Master form section ID to clone (root section). If not provided but specificSectionIds is provided, clones those specific sections as independent roots. If neither provided, clones all root sections from master.', 
    example: 1,
    required: false 
  })
  @IsOptional()
  @IsInt()
  masterFormSectionId?: number;

  @ApiProperty({ 
    description: 'Whether to deep clone (include all child sections). Set to false to clone only the specified sections without their children. Set to true to include full hierarchies.', 
    default: true,
    required: false 
  })
  @IsOptional()
  @IsBoolean()
  deepClone?: boolean = true;

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

  @ApiProperty({ 
    description: 'Specific section IDs to clone. If masterFormSectionId is provided, filters which descendants to clone. If masterFormSectionId is NOT provided, clones these sections as independent roots. Use deepClone to control whether to include their children.', 
    required: false,
    type: [Number],
    example: [8, 7, 383]
  })
  @IsOptional()
  @IsArray()
  @IsInt({ each: true })
  specificSectionIds?: number[];

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

  @ApiProperty({ 
    description: 'Whether to override existing cloned sections (delete and re-clone). This is separate from field overrides - you can customize fields without setting override=true.', 
    default: false,
    required: false 
  })
  @IsOptional()
  @IsBoolean()
  override?: boolean = false;

  // Field Overrides - can specify overrides for any section in the hierarchy
  @ApiProperty({ 
    description: 'Array of field overrides for specific sections (by master section ID)', 
    required: false,
    type: [SectionFieldOverrides],
    example: [{
      masterSectionId: 1,
      name: 'What is your personal information?',
      description: 'Please provide your details'
    }]
  })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => SectionFieldOverrides)
  sectionOverrides?: SectionFieldOverrides[];

  // Question Overrides - can specify overrides for any question in the hierarchy
  @ApiProperty({ 
    description: 'Array of field overrides for specific questions (by master question ID)', 
    required: false,
    type: [QuestionFieldOverrides],
    example: [{
      masterQuestionId: 101,
      questionText: 'What is your complete legal name?',
      config: { required: true, minLength: 2 }
    }]
  })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => QuestionFieldOverrides)
  questionOverrides?: QuestionFieldOverrides[];

  @ApiProperty({ description: 'User ID performing the clone operation', required: false })
  @IsOptional()
  @IsInt()
  createdBy?: number;
}
