import { Injectable } from '@nestjs/common';
import { AppUser } from './entity/user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(AppUser) private userRepository: Repository<AppUser>,
  ) {}

  findUserByEmail(email: string) {
    return this.userRepository.findOne({
      where: {
        email,
      },
    });
  }

  save(user: Partial<AppUser>) {
    return this.userRepository.save(new AppUser(user));
  }

  updateById(id: number, user: Partial<AppUser>) {
    return this.userRepository.update(id, new AppUser(user));
  }

  findById(id: number) {
    return this.userRepository.findOneBy({
      id,
    });
  }

  async addRole(id: number, roleName: string, user?: AppUser) {
    if (!user) {
      user = await this.findById(id);
    }
    this.updateById(id, {
      roles: user.roles ? `${user.roles},${roleName}` : roleName,
    });
  }

  async removeRole(id: number, roleName: string, user?: AppUser) {
    if (!user) {
      user = await this.findById(id);
    }
    const roles = user.roles || '';
    const formatRoles = roles + ',';
    const formatRoleName = roleName + ',';
    if (formatRoles.indexOf(formatRoleName) > -1) {
      formatRoles.replaceAll(formatRoleName, '');
    }
    this.updateById(id, {
      roles: formatRoles.slice(0, formatRoles.length - 1),
    });
  }
}
