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

export const RGC_DECISION_STATUS_VALUES = [
  'NOT_ADDRESSED',
  'IN_PROGRESS',
  'SOLVED',
] as const;

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

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

  if (
    normalized === 'not addressed' ||
    normalized === 'not_addressed' ||
    normalized === 'not-addressed' ||
    normalized === 'notaddressed'
  ) {
    return 'NOT_ADDRESSED';
  }

  if (
    normalized === 'in progress' ||
    normalized === 'in_progress' ||
    normalized === 'in-progress' ||
    normalized === 'inprogress'
  ) {
    return 'IN_PROGRESS';
  }

  if (normalized === 'solved') {
    return 'SOLVED';
  }

  return value;
}

export class CreateRgcDecisionDto {
  @Type(() => Number)
  @IsInt()
  @Min(1)
  plenaryId!: number;

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

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

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

  @IsOptional()
  @IsString()
  @IsNotEmpty()
  @MaxLength(100)
  category?: string;

  @IsOptional()
  @IsString()
  @IsNotEmpty()
  meetingDate?: string;

  @IsOptional()
  @Transform(({ value }: { value: unknown }) =>
    normalizeRgcDecisionStatus(value),
  )
  @IsIn(RGC_DECISION_STATUS_VALUES)
  status?: string;

  @IsOptional()
  @IsString()
  @IsNotEmpty()
  @MaxLength(255)
  focalPerson?: string;

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

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

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

  @IsOptional()
  @IsArray()
  @Type(() => Number)
  @IsInt({ each: true })
  issueIds?: number[];
}
