import {
  IsArray,
  IsInt,
  IsNotEmpty,
  IsOptional,
  IsString,
  MaxLength,
} from 'class-validator';
import { Transform, Type } from 'class-transformer';

function parseJsonArray(value: string): unknown {
  try {
    return JSON.parse(value) as unknown;
  } catch {
    return null;
  }
}

function toNumberArray(value: unknown): number[] | undefined {
  if (value === undefined || value === null || value === '') {
    return undefined;
  }

  if (Array.isArray(value)) {
    const numbers = value
      .map((item) => Number(item))
      .filter((item) => Number.isFinite(item));

    return numbers.length > 0 ? numbers : undefined;
  }

  if (typeof value === 'string') {
    const parsedValue = parseJsonArray(value);

    if (Array.isArray(parsedValue)) {
      const numbers = parsedValue
        .map((item) => Number(item))
        .filter((item) => Number.isFinite(item));

      return numbers.length > 0 ? numbers : undefined;
    }

    const numbers = value
      .split(',')
      .map((item) => Number(item.trim()))
      .filter((item) => Number.isFinite(item));

    return numbers.length > 0 ? numbers : undefined;
  }

  const numberValue = Number(value);

  return Number.isFinite(numberValue) ? [numberValue] : undefined;
}

export class CreateMeetingRequestDto {
  @IsString()
  @IsNotEmpty()
  @MaxLength(100)
  title!: string;

  @IsString()
  @IsNotEmpty()
  description!: string;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  userId?: number;

  @IsOptional()
  @Transform(({ value }) => toNumberArray(value))
  @IsArray()
  @IsInt({ each: true })
  stakeholderIds?: number[];

  @IsOptional()
  @Transform(({ value }) => toNumberArray(value))
  @IsArray()
  @IsInt({ each: true })
  issueIds?: number[];
}
