import { IsArray, IsBoolean, IsDateString, IsEnum, IsInt, IsOptional, IsString, IsUUID, MaxLength, Min, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';
import { AttendanceMode, MeetingType } from './meeting.dto';

export enum RecurrencePattern {
  DAILY = 'DAILY',
  WEEKLY = 'WEEKLY',
  MONTHLY = 'MONTHLY',
  YEARLY = 'YEARLY',
}

export class SeriesAttendeeDto {
  @IsString()
  userId!: string;

  @IsOptional()
  @IsString()
  role?: string;
}

export class CreateSeriesDto {
  @IsString()
  title!: string;

  @IsOptional()
  @IsString()
  description?: string;

  @IsEnum(RecurrencePattern)
  pattern!: RecurrencePattern;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  frequency?: number;

  @IsDateString()
  startDate!: string;

  @IsOptional()
  @IsDateString()
  endDate?: string;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  maxOccurrences?: number;

  @IsOptional()
  @IsString()
  location?: string;

  @IsOptional()
  @IsEnum(MeetingType)
  type?: MeetingType;

  @IsOptional()
  @IsString()
  timezone?: string;

  @Type(() => Number)
  @IsInt()
  @Min(1)
  duration!: number;

  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => SeriesAttendeeDto)
  attendees?: SeriesAttendeeDto[];

  @IsOptional()
  @IsString()
  @MaxLength(100)
  city?: string;

  @IsOptional()
  @IsBoolean()
  enforceCheckinMode?: boolean;
}

export class UpdateSeriesDto {
  @IsOptional()
  @IsString()
  title?: string;

  @IsOptional()
  @IsString()
  description?: string;

  @IsOptional()
  @IsString()
  location?: string;

  @IsOptional()
  @IsEnum(RecurrencePattern)
  pattern?: RecurrencePattern;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  frequency?: number;

  @IsOptional()
  @IsDateString()
  endDate?: string;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  maxOccurrences?: number;

  @IsOptional()
  @IsEnum(MeetingType)
  type?: MeetingType;

  @IsOptional()
  @IsString()
  timezone?: string;

  @IsOptional()
  @IsString()
  isActive?: string;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  city?: string;

  @IsOptional()
  @IsBoolean()
  enforceCheckinMode?: boolean;
}

export class UpdateSeriesEnforceCheckinModeDto {
  @IsBoolean()
  enforceCheckinMode!: boolean;
}

export class SeriesAttendeePreferenceUpsertDto {
  @IsUUID()
  userId!: string;

  @IsEnum(AttendanceMode)
  defaultCheckinMode!: AttendanceMode;
}

export class UpsertSeriesAttendeePreferencesDto {
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => SeriesAttendeePreferenceUpsertDto)
  preferences!: SeriesAttendeePreferenceUpsertDto[];
}

export class ListSeriesAttendeePreferencesQueryDto {
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  page?: number;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  pageSize?: number;

  @IsOptional()
  @IsString()
  keyword?: string;
}

export class UpdateSeriesScheduleDto {
  @IsString()
  startTime!: string;

  @Type(() => Number)
  @IsInt()
  @Min(1)
  duration!: number;

  @IsString()
  timezone!: string;
}

export class UpdateSeriesMeetingDto {
  @IsOptional()
  @IsString()
  title?: string;

  @IsOptional()
  @IsString()
  description?: string;

  @IsOptional()
  @IsDateString()
  startTime?: string;

  @IsOptional()
  @IsDateString()
  endTime?: string;

  @IsOptional()
  @IsString()
  location?: string;

  @IsOptional()
  @IsString()
  status?: string;

  @IsOptional()
  @IsString()
  reason?: string;
}

export class UpdateSeriesAttendeeRoleDto {
  @IsString()
  attendeeId!: string;

  @IsString()
  newRole!: string;
}

export class SeriesAttendeesActionDto {
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => SeriesAttendeeDto)
  attendees!: SeriesAttendeeDto[];

  @IsOptional()
  @IsString()
  action?: string;
}

export class SeriesDeleteAttendeeDto {
  @IsString()
  attendeeId!: string;
}
