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

interface AuthenticateUserUseCaseRequest {
  body: unknown;
}

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

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

  async execute({ body }: AuthenticateUserUseCaseRequest): Promise<AuthenticateUserUseCaseResponse> {
    const parsed = loginSchema.safeParse(body);
    if (!parsed.success) {
      throw AppError.unauthorized();
    }

    const { email, password } = parsed.data;

    const user = await this.usersRepository.findByEmail(email);
    if (!user) {
      throw AppError.unauthorized();
    }

    const isValid = await bcrypt.compare(password, user.passwordHash);
    if (!isValid) {
      throw AppError.unauthorized();
    }

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