import { User } from "@prisma/client";
import bcrypt from "bcrypt";
import { AppError } from "@/core/errors/app-error";
import { registerSchema } from "../dtos/register-schema";
import { UsersRepository } from "../repositories/users-repository";

interface RegisterUserUseCaseRequest {
  body: unknown;
}

interface RegisterUserUseCaseResponse {
  user: Pick<User, "id" | "name" | "email">;
}

export class RegisterUserUseCase {
  constructor(private usersRepository: UsersRepository) {}

  async execute({ body }: RegisterUserUseCaseRequest): Promise<RegisterUserUseCaseResponse> {
    const parsed = registerSchema.safeParse(body);
    if (!parsed.success) {
      const firstIssue = parsed.error.issues[0];
      throw AppError.badRequest(firstIssue?.message ?? "Dados inválidos");
    }

    const { name, email, password } = parsed.data;

    const userWithSameEmail = await this.usersRepository.findByEmail(email);
    if (userWithSameEmail) {
      throw AppError.badRequest("Já existe um usuário cadastrado com este e-mail");
    }

    const passwordHash = await bcrypt.hash(password, 10);

    const user = await this.usersRepository.create({
      name,
      email,
      passwordHash,
    });

    return {
      user: {
        id: user.id,
        name: user.name,
        email: user.email,
      },
    };
  }
}
