import { ApiPropertyOptional, OmitType, PartialType } from '@nestjs/swagger';
import { Transform, Type } from 'class-transformer';
import { IsArray, IsIn, IsOptional, ValidateNested } from 'class-validator';

import {
  CreateMeetingSummaryDto,
  toIssueResolveDtoArray,
} from './create-meeting-summary.dto';
import { IssueResolveInputDto } from './issue-resolve-input.dto';
import { MEETING_SUMMARY_STATUS_CODES } from './meeting-summary-status-code';
import type { MeetingSummaryStatusCode } from './meeting-summary-status-code';

/**
 * Payload for updating a meeting summary. Every field is optional. Passing
 * `issueResolves` re-applies (upserts) those issue resolutions.
 *
 * `issueResolves` is omitted from PartialType and re-declared here so nested
 * `@Transform()` / `@Type()` metadata is not duplicated (which causes
 * forbidNonWhitelisted errors on every nested property).
 */
export class UpdateMeetingSummaryDto extends PartialType(
  OmitType(CreateMeetingSummaryDto, ['issueResolves', 'status'] as const),
) {
  @ApiPropertyOptional({
    enum: MEETING_SUMMARY_STATUS_CODES,
    description: 'Set the summary status by code.',
  })
  @IsOptional()
  @IsIn(MEETING_SUMMARY_STATUS_CODES)
  declare status?: MeetingSummaryStatusCode;

  @ApiPropertyOptional({
    type: [IssueResolveInputDto],
    description: 'Per-issue resolutions for the meeting-request issues.',
  })
  @IsOptional()
  @Transform(({ value }) => toIssueResolveDtoArray(value))
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => IssueResolveInputDto)
  issueResolves?: IssueResolveInputDto[];
}
