import { Campaign } from "@prisma/client";
import { sanitizeHtml } from "../entities/sanitize-html";
import { AppError } from "@/core/errors/app-error";
import { createCampaignSchema } from "../dtos/create-campaign-schema";
import { CampaignsRepository } from "../repositories/campaigns-repository";
import { SendersRepository } from "@/modules/senders/repositories/senders-repository";

interface CreateCampaignUseCaseRequest {
  userId: string;
  body: unknown;
}

interface CreateCampaignUseCaseResponse {
  campaign: Campaign;
}

export class CreateCampaignUseCase {
  constructor(
    private campaignsRepository: CampaignsRepository,
    private sendersRepository: SendersRepository
  ) {}

  async execute({
    userId,
    body,
  }: CreateCampaignUseCaseRequest): Promise<CreateCampaignUseCaseResponse> {
    const rawBody = (body && typeof body === "object" ? body : {}) as Record<string, unknown>;
    let senderId = rawBody.senderId;

    if (!senderId || typeof senderId !== "string" || !senderId.startsWith("c")) {
      const existingSender = await this.sendersRepository.findFirstByUserId(userId);
      if (!existingSender) {
        throw AppError.badRequest(
          "Nenhum remetente configurado. Por favor, cadastre uma conta de e-mail remetente antes de salvar a campanha."
        );
      }
      senderId = existingSender.id;
    }

    const data = createCampaignSchema.parse({ ...rawBody, senderId });

    const campaign = await this.campaignsRepository.create({
      title: data.title,
      subject: data.subject,
      htmlBody: sanitizeHtml(data.htmlBody),
      senderId: data.senderId,
      contactListId: data.contactListId ?? undefined,
      createdById: userId,
    });

    return { campaign };
  }
}
