import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { EntityManager, Repository } from 'typeorm';
import { UserEntity } from './entities/user.entity';
import { UserRepository } from './user.repository';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import * as bcrypt from 'bcrypt';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(UserEntity)
    private readonly user: Repository<UserEntity>,
    private readonly userRepository: UserRepository,
  ) {}

  async create(
    createUserDto: CreateUserDto,
    manager: EntityManager,
  ): Promise<UserEntity> {
    const createUser = new UserEntity();

    Object.assign(createUser, createUserDto);

    const returnData = await manager.save(createUser);

    return returnData;
  }

  async update(id: string, updateUserDto: UpdateUserDto) {
    const updateUser = await this.user.findOneBy({ id });

    if (updateUserDto.password) {
      const hashedPassword = await bcrypt.hash(updateUserDto.password, 10);
      updateUserDto.password = hashedPassword;
    }

    Object.assign(updateUser, updateUserDto);

    return await this.user.update(id, updateUser);
  }

  // While deleting user or any data using api then use softDelete instead of delete when there is separate column named deleted_at
  remove(id: string) {
    return this.user.softDelete(id);
  }

  findAll() {
    return this.userRepository.findAll();
  }

  findOne(id: string) {
    return this.userRepository.findOne(id);
  }
}
