import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';
import {
  IsNumber,
  IsNotEmpty,
  IsEmail,
  IsStrongPassword,
  IsOptional,
  IsArray,
  IsString,
} from 'class-validator';
import { IsAlphaWithMessage } from 'src/common/errors/custom-validation-message';
import { Transform } from 'class-transformer';

export class UpdateUserDto extends PartialType(CreateUserDto) {
  @IsNotEmpty({ message: 'First name should not be empty.' })
  @IsAlphaWithMessage({ message: 'First Name should be only alphabetic.' })
  @Transform(({ value }) => value.trim().replace(/\s+/g, ' '))
  first_name: string;

  @IsOptional()
  @IsNotEmpty({ message: 'Last name should not be empty.' })
  @Transform(({ value }) => value.trim().replace(/\s+/g, ' '))
  last_name: string;

  @IsOptional()
  @IsNotEmpty({ message: 'Last name should not be empty.' })
  @Transform(({ value }) => value.trim().replace(/\s+/g, ' '))
  middle_name: string;

  @IsNotEmpty({ message: 'Password cannot be empty.' })
  @IsStrongPassword({
    minLength: 8,
    minLowercase: 1,
    minNumbers: 1,
    minSymbols: 1,
    minUppercase: 1,
  })
  password: string;

  @IsEmail({}, { message: 'Invalid email address.' })
  @IsNotEmpty({ message: 'Email should not be empty.' })
  @Transform(({ value }) => value.trim().replace(/\s+/g, ' '))
  email: string;

  @IsNumber({}, { message: 'Contact number must be a number.' })
  @IsNotEmpty({ message: 'Contact number should not be empty.' })
  @Transform(({ value }) =>
    typeof value === 'string' ? parseFloat(value.replace(/\s+/g, '')) : value,
  )
  contact_no: number;

  @IsOptional()
  status: number;

  @IsOptional()
  profile_picture: string;

  @IsOptional()
  batch: any;

  @IsOptional()
  course: string[];

  @IsOptional()
  job_id: string;

  @IsOptional()
  city_id: string;

  @IsOptional()
  date_of_birth: string;

  @IsOptional()
  designation: string;

  @IsOptional()
  company_name: string;

  @IsOptional()
  company_address: string;
}
