import { AppRole, Role } from '@/entities/role.entity';
import { User } from '@/entities/user.entity';
import { SystemLang } from '@/system/lang/system.lang';
import { IsExistInDatabase } from '@/system/validators/decorators/is-exist-in-database';
import { IsUniqueInDatabase } from '@/system/validators/decorators/is-unique-in-database.decorator';
import { IsValidBase64Image } from '@/system/validators/decorators/is-valid-base64-image';
import {
  IsArray,
  IsBoolean,
  IsEmail,
  IsNumber,
  IsOptional,
  IsPhoneNumber,
  IsString,
  MinLength,
  ValidateIf,
} from 'class-validator';

export class UpdateUserDto {
  @IsString({
    message: SystemLang.getCustomText({
      vi: 'Tên không được để trống',
      en: 'First name cannot be empty',
    }),
  })
  @IsOptional()
  first_name: string;

  @IsString({
    message: SystemLang.getCustomText({
      vi: 'Họ không được để trống',
      en: 'Last name cannot be empty',
    }),
  })
  @IsOptional()
  last_name: string;

  // @ValidateIf((o) => o.is_login_enabled === true)
  @IsString({
    message: SystemLang.getCustomText({
      vi: 'Mật khẩu không được để trống',
      en: 'Password cannot be empty',
    }),
  })
  @MinLength(6, {
    message: SystemLang.getCustomText({
      en: 'Password must be at least 6 characters',
      vi: 'Mật khẩu phải có ít nhất 6 ký tự',
    }),
  })
  @IsOptional()
  password: string;

  @IsPhoneNumber('VN', {
    message: SystemLang.getCustomText({
      en: 'Phone must be a valid Vietnamese phone number',
      vi: 'Số điện thoại phải là số hợp lệ tại Việt Nam',
    }),
  })
  @IsUniqueInDatabase(
    User,
    'phone',
    {
      allowNull: true,
      ignoreIdField: 'id',
    },
    {
      message: SystemLang.getCustomText({
        en: 'Phone number already exists in the system',
        vi: 'Số điện thoại đã tồn tại trong hệ thống',
      }),
    },
  )
  @IsOptional()
  phone: string | null;

  @IsValidBase64Image(
    {
      mimeTypes: ['image/jpeg', 'image/png'],
      maxSizeInBytes: 2 * 1024 * 1024, // 2MB
      maxWidth: 1024,
      maxHeight: 1024,
      allowNull: true,
    },
    {
      message: SystemLang.getCustomText({
        en: 'Avatar must be an image (JPG, PNG), size < 2MB, max dimensions 1024x1024',
        vi: 'Avatar phải là ảnh (JPG, PNG), dung lượng < 2MB, kích thước tối đa 1024x1024',
      }),
    },
  )
  @IsOptional()
  avatar: string | null;

  @IsBoolean({
    message: SystemLang.getCustomText({
      en: 'is_login_enabled must be a boolean value',
      vi: 'is_login_enabled phải là kiểu boolean',
    }),
  })
  @IsOptional()
  is_login_enabled: boolean;

  @IsBoolean({
    message: SystemLang.getCustomText({
      en: 'Active must be a boolean value',
      vi: 'Trạng thái hoạt động phải là kiểu boolean',
    }),
  })
  @IsOptional()
  active: boolean;

  @IsExistInDatabase(
    Role,
    'id',
    {},
    {
      each: true,
      message: SystemLang.getCustomText({
        en: 'One or more roles do not exist or are not allowed to be modified (e.g. ROOT role).',
        vi: 'Một hoặc nhiều vai trò không tồn tại hoặc không được phép chỉnh sửa (ví dụ: vai trò ROOT).',
      }),
    },
  )
  @IsOptional()
  @IsArray()
  roles: Role['id'][] = [];

  @IsNumber(
    {},
    {
      message: SystemLang.getCustomText({
        en: 'ID must be a number',
        vi: 'ID phải là một số',
      }),
    },
  )
  id: User['id'];
}
