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 SectionFieldOverridesForProgram {
  @ApiProperty({ description: 'Template section ID to apply overrides to', example: 1 })
  @IsInt()
  @IsNotEmpty()
  templateSectionId: 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 from template
 * Note: bindingKey and answerLocation cannot be overridden and will always use template values
 */
export class QuestionFieldOverridesForProgram {
  @ApiProperty({ description: 'Template question ID to apply overrides to', example: 101 })
  @IsInt()
  @IsNotEmpty()
  templateQuestionId: 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 conditional configuration', required: false, type: Object })
  @IsOptional()
  @IsObject()
  conditionalConfig?: Record<string, any>;

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

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

  @ApiProperty({ 
    description: 'Template 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 template.', 
    example: 1,
    required: false 
  })
  @IsOptional()
  @IsInt()
  templateFormSectionId?: 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 templateFormSectionId is provided, filters which descendants to clone. If templateFormSectionId 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 template section ID)', 
    required: false,
    type: [SectionFieldOverridesForProgram],
    example: [{
      templateSectionId: 1,
      name: 'What is your personal information?',
      description: 'Please provide your details'
    }]
  })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => SectionFieldOverridesForProgram)
  sectionOverrides?: SectionFieldOverridesForProgram[];

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

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