/**
 * Users Service
 *
 * Replaces: UsersProvider from OracleDM
 * Table: Users
 */
import { Injectable, BadRequestException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import * as bcrypt from 'bcrypt';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';

@Injectable()
export class UsersService {
  constructor(private prisma: PrismaService) {}

  async findAll() {
    return this.prisma.user.findMany({
      select: {
        id: true,
        name: true,
        type: true,
        privileges: true,
        gr: true,
        src: true,
      },
    });
  }

  async findById(id: number) {
    return this.prisma.user.findUnique({
      where: { id },
      select: {
        id: true,
        name: true,
        type: true,
        privileges: true,
        gr: true,
        src: true,
      },
    });
  }

  async create(dto: CreateUserDto) {
    const existing = await this.prisma.user.findFirst({
      where: { name: dto.name },
    });
    if (existing) {
      throw new BadRequestException(`User "${dto.name}" already exists`);
    }
    const hashedPass = await bcrypt.hash(dto.pass, 10);
    const user = await this.prisma.user.create({
      data: {
        name: dto.name,
        pass: hashedPass,
        type: dto.type ?? 0,
        privileges: dto.privileges ?? null,
        src: dto.src ?? 0,
        gr: dto.gr ?? 0,
      },
      select: { id: true, name: true, type: true, privileges: true, gr: true, src: true },
    });
    return user;
  }

  async update(id: number, dto: UpdateUserDto) {
    const data: Record<string, unknown> = {};
    if (dto.name != null) data.name = dto.name;
    if (dto.type != null) data.type = dto.type;
    if (dto.privileges !== undefined) data.privileges = dto.privileges;
    if (dto.src != null) data.src = dto.src;
    if (dto.gr != null) data.gr = dto.gr;
    if (dto.pass != null && dto.pass !== '') {
      data.pass = await bcrypt.hash(dto.pass, 10);
    }
    return this.prisma.user.update({
      where: { id },
      data,
      select: { id: true, name: true, type: true, privileges: true, gr: true, src: true },
    });
  }

  async delete(id: number) {
    await this.prisma.user.delete({
      where: { id },
    });
    return { success: true };
  }
}
