import { Contact } from "@prisma/client";
import { AppError } from "@/core/errors/app-error";
import { createContactSchema } from "../dtos/create-contact-schema";
import { ContactsRepository } from "../repositories/contacts-repository";
import { ContactListsRepository } from "../repositories/contact-lists-repository";

interface CreateContactUseCaseRequest {
  body: unknown;
}

interface CreateContactUseCaseResponse {
  contact: Contact;
}

export class CreateContactUseCase {
  constructor(
    private contactsRepository: ContactsRepository,
    private contactListsRepository: ContactListsRepository
  ) {}

  async execute({ body }: CreateContactUseCaseRequest): Promise<CreateContactUseCaseResponse> {
    const data = createContactSchema.parse(body);

    const existing = await this.contactsRepository.findManyByEmails([data.email]);
    if (existing.length > 0) {
      throw AppError.badRequest("Já existe um contato com esse e-mail");
    }

    const contact = await this.contactsRepository.create({
      email: data.email,
      name: data.name ?? null,
      phone: data.phone ?? null,
      tags: data.tags ?? [],
      source: "MANUAL",
    });

    if (data.listIds?.length) {
      await this.contactListsRepository.addContactsToLists([contact.id], data.listIds);
    }

    return { contact };
  }
}
