import { Transform, Type } from 'class-transformer';
import { IsArray, IsInt, IsOptional, IsString, MaxLength, Min, ValidateIf, ValidateNested } from 'class-validator';
import { ReportKeywordRankInputDto } from './create-report.dto';

const toReportNumber = ({ value }: { value: unknown }) => {
  if (value === undefined || value === null) {
    return value;
  }

  if (typeof value === 'string' && value.trim() === '') {
    return value;
  }

  return typeof value === 'string' ? Number(value) : value;
};

export class UpdateReportDto {
  @ValidateIf((_object, value) => value !== undefined)
  @Transform(toReportNumber)
  @IsInt()
  @Min(0)
  businessMetricValue?: number;

  @ValidateIf((_object, value) => value !== undefined)
  @Transform(toReportNumber)
  @IsInt()
  businessMetricGrowth?: number;

  @ValidateIf((_object, value) => value !== undefined)
  @Transform(toReportNumber)
  @IsInt()
  @Min(0)
  traffic?: number;

  @ValidateIf((_object, value) => value !== undefined)
  @Transform(toReportNumber)
  @IsInt()
  trafficGrowth?: number;

  @ValidateIf((_object, value) => value !== undefined)
  @Transform(toReportNumber)
  @IsInt()
  @Min(0)
  backlinks?: number;

  @ValidateIf((_object, value) => value !== undefined)
  @Transform(toReportNumber)
  @IsInt()
  @Min(0)
  newBacklinks?: number;

  @ValidateIf((_object, value) => value !== undefined)
  @IsString()
  @MaxLength(2000)
  notes?: string;

  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => ReportKeywordRankInputDto)
  keywordRanks?: ReportKeywordRankInputDto[];
}
