import { ApiProperty } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import {
  IsEmail,
  IsNotEmpty,
  IsOptional,
  Validate,
  ValidateIf,
} from 'class-validator';
import { toEnglishDigit } from 'src/utils';
import { IsNotExist } from 'src/utils/validators/is-not-exists.validator';
import { IsIranMobile } from '../../../utils/validators/is-iran-mobile.validator';
import { Gender, RoleIds } from '../entities/user.entity';

export class CreateUserDto {
  @ApiProperty({ example: 'علی', required: false })
  @IsOptional()
  name?: string;

  @ApiProperty({ required: false })
  @IsOptional()
  customerId?: number;

  @ApiProperty({ example: 'رضایی' })
  @IsNotEmpty({ message: 'نام خانوادگی را وارد نمایید' })
  surName: string;

  @ApiProperty({ required: false })
  @IsOptional()
  nationalCode?: string;

  @ApiProperty({ enum: Gender, required: false })
  @IsOptional()
  gender?: Gender;

  @ApiProperty({ required: false })
  @IsOptional()
  birthday?: string;

  @ApiProperty({ example: 'test@example.com', required: false })
  @Transform(({ value }) => toEnglishDigit(value.toLowerCase().trim()))
  @ValidateIf((dto) => dto.email !== '' || dto.roleId !== RoleIds.User)
  @IsNotEmpty({ message: 'ایمیل را وارد نمایید' })
  @IsEmail(
    {},
    {
      message: 'لطفا یک ایمیل معتبر وارد نمایید',
    },
  )
  @Validate(IsNotExist, ['UserEntity'], {
    message: 'با این ایمیل قبلا ثبت نام انجام شده است',
  })
  email: string;

  @ApiProperty({ example: 'Abab@#12' })
  @Transform(({ value }) => value.trim())
  @ValidateIf((dto) => dto.roleId !== RoleIds.User)
  @IsNotEmpty({ message: 'کلمه عبور را وارد نمایید' })
  password: string;

  @ApiProperty({ example: '021', required: false })
  @IsOptional()
  phone?: string;

  @ApiProperty()
  @Transform(({ value }) => toEnglishDigit(value))
  @IsNotEmpty({ message: 'شماره موبایل را وارد نمایید' })
  @Validate(IsNotExist, ['UserEntity'], {
    message: 'با این شماره موبایل قبلا ثبت نام انجام شده است',
  })
  @Validate(IsIranMobile, {
    message: 'لطفا یک شماره موبایل صحیح وارد نمایید، برای مثال 09219874567',
  })
  mobile: string;

  @ApiProperty({ example: true })
  @IsNotEmpty()
  isActive: boolean;

  @ApiProperty({ example: 1, description: '2:مدیر 3: سرویسکار 1: مشتری' })
  @IsNotEmpty()
  roleId: RoleIds;

  @ApiProperty({ required: false })
  @IsOptional()
  isImported?: boolean;

  @ApiProperty({ required: false })
  @IsOptional()
  address?: string;
}
