import { Transform, type TransformFnParams } from 'class-transformer';
import { IsNotEmpty, IsOptional, IsString, MaxLength } from 'class-validator';

function trimRequiredString({ value }: TransformFnParams): unknown {
  if (typeof value !== 'string') {
    return value as unknown;
  }

  return value.trim();
}

function trimOptionalString({ value }: TransformFnParams): unknown {
  if (typeof value !== 'string') {
    return value as unknown;
  }

  const cleaned = value.trim();

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

export class CreateIndicatorDto {
  @Transform(trimRequiredString)
  @IsString({
    message: 'Indicator name must be a string',
  })
  @IsNotEmpty({
    message: 'Indicator name is required',
  })
  @MaxLength(100, {
    message: 'Indicator name must not exceed 100 characters',
  })
  name!: string;

  @Transform(trimOptionalString)
  @IsOptional()
  @IsString({
    message: 'Description must be a string',
  })
  description?: string;
}
