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,
  IsNotEmpty,
  IsOptional,
  IsPhoneNumber,
  IsString,
  MinLength,
  ValidateIf,
} from 'class-validator';

export class CreateUserDto {
  @IsNotEmpty({
    message: SystemLang.getCustomText({
      en: 'First name should not be empty',
      vi: 'Họ không được để trống',
    }),
  })
  first_name: string;

  @IsNotEmpty({
    message: SystemLang.getCustomText({
      en: 'Last name should not be empty',
      vi: 'Tên không được để trống',
    }),
  })
  last_name: string;

  @IsEmail(
    {},
    {
      message: SystemLang.getCustomText({
        en: 'Email must be a valid email address',
        vi: 'Email phải là địa chỉ email hợp lệ',
      }),
    },
  )
  @IsUniqueInDatabase(
    User,
    'email',
    {},
    {
      message: SystemLang.getCustomText({
        en: 'Email already exists in the system',
        vi: 'Email đã tồn tại trong hệ thống',
      }),
    },
  )
  email: string;

  @IsString({
    message: SystemLang.getCustomText({
      en: 'Username must be a valid string',
      vi: 'Tên đăng nhập phải là chuỗi hợp lệ',
    }),
  })
  @IsUniqueInDatabase(
    User,
    'username',
    {},
    {
      message: SystemLang.getCustomText({
        en: 'Username already exists in the system',
        vi: 'Tên đăng nhập đã tồn tại trong hệ thống',
      }),
    },
  )
  username: string;

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

  @ValidateIf((o) => o.is_login_enabled === true)
  @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ự',
    }),
  })
  password: string;

  @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',
    }),
  })
  active: boolean;

  @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 },
    {
      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;

  @IsExistInDatabase(
    Role,
    'id',
    {
      except: (currentRow: Role) => {
        if (!currentRow) return false;

        return currentRow.role_key === AppRole.ROOT;
      },
    },
    {
      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).',
      }),
    },
  )
  @IsArray()
  roles: Role['id'][];

  @IsValidBase64Image(
    {
      mimeTypes: ['image/jpeg', 'image/png'],
      maxSizeInBytes: 2 * 1024 * 1024, // 2MB
      maxWidth: 1024,
      maxHeight: 1024,
    },
    {
      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;
}
