import {
  IsString,
  IsOptional,
  IsInt,
  IsDateString,
  IsNotEmpty,
  MaxLength,
  ValidateIf,
} from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';

export class CreateQuestionnaireFormDataDto {
  @ApiProperty({ description: 'First name of the patient', maxLength: 100 })
  @IsString()
  @IsNotEmpty()
  @MaxLength(100)
  first_name: string;

  @ApiPropertyOptional({ description: 'Phone number', maxLength: 50 })
  @IsString()
  @IsOptional()
  @MaxLength(50)
  phone_number?: string;

  @ApiPropertyOptional({ description: 'Ophthalmologist name', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  ophthalmologist_name?: string;

  @ApiPropertyOptional({ description: 'Age of the patient' })
  @IsInt()
  @IsOptional()
  age?: number;

  @ApiPropertyOptional({ description: 'Gender', maxLength: 20 })
  @IsString()
  @IsOptional()
  @MaxLength(20)
  gender?: string;

  @ApiPropertyOptional({ description: 'Next injection date' })
  @ValidateIf((o) => o.next_injection_date !== undefined && o.next_injection_date !== null && o.next_injection_date !== '')
  @IsDateString()
  @IsOptional()
  next_injection_date?: string;

  @ApiPropertyOptional({ description: 'Medication', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  medication?: string;

  @ApiPropertyOptional({ description: 'Injection duration', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  injection_duration?: string;

  @ApiPropertyOptional({ description: 'Injection frequency', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  injection_frequency?: string;

  @ApiPropertyOptional({ description: 'Injection eyes', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  injection_eyes?: string;

  @ApiPropertyOptional({ description: 'Missed appointment', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  missed_appointment?: string;

  @ApiPropertyOptional({ description: 'DMLA threat', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  dmla_threat?: string;

  @ApiPropertyOptional({ description: 'DMLA interference', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  dmla_interference?: string;

  @ApiPropertyOptional({ description: 'DMLA limitation', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  dmla_limitation?: string;

  @ApiPropertyOptional({ description: 'Vision loss fear', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  vision_loss_fear?: string;

  @ApiPropertyOptional({ description: 'Treatment need', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  treatment_need?: string;

  @ApiPropertyOptional({ description: 'Close follow up need', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  close_follow_up_need?: string;

  @ApiPropertyOptional({ description: 'Injection pain', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  injection_pain?: string;

  @ApiPropertyOptional({ description: 'Clinic experience', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  clinic_experience?: string;

  @ApiPropertyOptional({
    description: 'Daily activity interference',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  daily_activity_interference?: string;

  @ApiPropertyOptional({
    description: 'Financial affordability',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  financial_affordability?: string;

  @ApiPropertyOptional({ description: 'Appointment memory', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  appointment_memory?: string;

  @ApiPropertyOptional({ description: 'Injection problems', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  injection_problems?: string;

  @ApiPropertyOptional({
    description: 'Injection frequency practical',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  injection_frequency_practical?: string;

  @ApiPropertyOptional({
    description: 'General health limitation',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  general_health_limitation?: string;

  @ApiPropertyOptional({ description: 'Transport problem', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  transport_problem?: string;

  @ApiPropertyOptional({ description: 'Injection stress', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  injection_stress?: string;

  @ApiPropertyOptional({ description: 'Vision stabilization', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  vision_stabilization?: string;

  @ApiPropertyOptional({ description: 'Lesion minimization', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  lesion_minimization?: string;

  @ApiPropertyOptional({ description: 'Daily activity effect', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  daily_activity_effect?: string;

  @ApiPropertyOptional({ description: 'Follow up usefulness', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  follow_up_usefulness?: string;

  @ApiPropertyOptional({
    description: 'Close person vision loss',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  close_person_vision_loss?: string;

  @ApiPropertyOptional({
    description: 'Close person injection',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  close_person_injection?: string;

  @ApiPropertyOptional({
    description: 'Ophthalmologist encouragement',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  ophthalmologist_encouragement?: string;

  @ApiPropertyOptional({ description: 'Media information', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  media_information?: string;

  @ApiPropertyOptional({ description: 'Recent vision loss', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  recent_vision_loss?: string;

  @ApiPropertyOptional({ description: 'Education', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  education?: string;

  @ApiPropertyOptional({ description: 'Travel time', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  travel_time?: string;

  @ApiPropertyOptional({ description: 'Insurance coverage', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  insurance_coverage?: string;

  @ApiPropertyOptional({ description: 'Daily medications', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  daily_medications?: string;

  @ApiPropertyOptional({ description: 'Vision impact', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  vision_impact?: string;

  @ApiPropertyOptional({
    description: 'Ophthalmologist satisfaction',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  ophthalmologist_satisfaction?: string;

  @ApiPropertyOptional({
    description: 'Clinic contact difficulty',
    maxLength: 255,
  })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  clinic_contact_difficulty?: string;

  @ApiPropertyOptional({ description: 'Accompaniment support', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  accompaniment_support?: string;

  @ApiPropertyOptional({ description: 'Mood impact', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  mood_impact?: string;

  @ApiPropertyOptional({ description: 'Age related', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  age_related?: string;

  @ApiPropertyOptional({ description: 'Continuous follow up', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  continuous_follow_up?: string;

  @ApiPropertyOptional({ description: 'Abnormal vessels', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  abnormal_vessels?: string;

  @ApiPropertyOptional({ description: 'Irreversible loss', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  irreversible_loss?: string;

  @ApiPropertyOptional({ description: 'All patients need', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  all_patients_need?: string;

  @ApiPropertyOptional({ description: 'Edema thickness exam', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  edema_thickness_exam?: string;

  @ApiPropertyOptional({ description: 'Glasses correction', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  glasses_correction?: string;

  @ApiPropertyOptional({ description: 'Injection timing', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  injection_timing?: string;

  @ApiPropertyOptional({ description: 'Total vision recovery', maxLength: 255 })
  @IsString()
  @IsOptional()
  @MaxLength(255)
  total_vision_recovery?: string;

  @ApiPropertyOptional({ description: 'Additional comments' })
  @IsString()
  @IsOptional()
  additional_comments?: string;

  @ApiPropertyOptional({ description: 'Center name', maxLength: 150 })
  @IsString()
  @IsOptional()
  @MaxLength(150)
  center?: string;
}
