import { ContactExportJob } from "@prisma/client";
import { exportContactsSchema } from "../dtos/export-contacts-schema";
import { buildContactsExportCsv } from "../entities/build-contacts-export-csv";
import { ContactsRepository } from "../repositories/contacts-repository";
import { ContactExportJobsRepository } from "../repositories/contact-export-jobs-repository";

// Teto de segurança para o export não-paginado — mesmo espírito do EXPORT_ROW_CAP já usado no
// histórico de e-mails do contato.
const EXPORT_ROW_CAP = 20_000;

interface ExportContactsUseCaseRequest {
  body: unknown;
  createdById: string;
}

interface ExportContactsUseCaseResponse {
  exportJob: ContactExportJob;
}

export class ExportContactsUseCase {
  constructor(
    private contactsRepository: ContactsRepository,
    private contactExportJobsRepository: ContactExportJobsRepository
  ) {}

  async execute({ body, createdById }: ExportContactsUseCaseRequest): Promise<ExportContactsUseCaseResponse> {
    const { columns, ...filters } = exportContactsSchema.parse(body);

    const contacts = await this.contactsRepository.findPaginated({ skip: 0, take: EXPORT_ROW_CAP, ...filters });
    const csvContent = buildContactsExportCsv(contacts, columns ?? []);

    const exportJob = await this.contactExportJobsRepository.create({
      filters,
      columns: columns ?? [],
      totalRows: contacts.length,
      csvContent,
      createdById,
    });

    return { exportJob };
  }
}
