import { Transform } from 'class-transformer';
import {
  ArrayUnique,
  IsArray,
  IsDateString,
  IsIn,
  IsInt,
  IsNotEmpty,
  IsOptional,
  IsString,
  MaxLength,
  Min,
} from 'class-validator';

export function normalizePlenaryStatus(value: unknown): unknown {
  if (typeof value !== 'string') {
    return value;
  }

  const normalized = value.trim().toLowerCase();

  if (normalized === 'draft') {
    return 'DRAFT';
  }

  if (normalized === 'sent') {
    return 'SENT';
  }

  return value;
}

function normalizeMinistryIds(value: unknown): unknown {
  if (Array.isArray(value)) {
    return value.map((item) => Number(item));
  }

  if (typeof value !== 'string') {
    return value;
  }

  const normalized = value.trim();

  if (!normalized) {
    return [];
  }

  /*
   * Supports form-data values such as:
   * [1,10]
   * 1,10
   *
   * This avoids JSON.parse(), so ESLint does not report
   * @typescript-eslint/no-unsafe-assignment.
   */
  return normalized
    .replace(/^\[/, '')
    .replace(/\]$/, '')
    .split(',')
    .map((item) => Number(item.trim()))
    .filter((item) => Number.isInteger(item) && item > 0);
}

export class CreatePlenaryDto {
  @IsString()
  @IsNotEmpty()
  @MaxLength(255)
  name!: string;

  @IsDateString()
  meetingDate!: string;

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

  @IsOptional()
  @IsString()
  @MaxLength(1000)
  documentReference?: string;

  @IsOptional()
  @Transform(({ value }: { value: unknown }) => normalizePlenaryStatus(value))
  @IsIn(['DRAFT', 'SENT'])
  status?: string;

  @IsOptional()
  @Transform(({ value }: { value: unknown }) => normalizeMinistryIds(value))
  @IsArray()
  @ArrayUnique()
  @IsInt({ each: true })
  @Min(1, { each: true })
  ministryIds?: number[];
}
