import { Domain, DomainVerificationStatus } from "@prisma/client";
import { env } from "@/config/env";
import { AppError } from "@/core/errors/app-error";
import { DomainsRepository } from "../repositories/domains-repository";
import { SesIdentityProvider } from "../providers/ses-identity-provider";
import { buildDnsRecords } from "../entities/build-dns-records";

interface VerifyDomainUseCaseRequest {
  id: string;
  userId: string;
}

interface VerifyDomainUseCaseResponse {
  domain: Domain;
}

export class VerifyDomainUseCase {
  constructor(
    private domainsRepository: DomainsRepository,
    private sesIdentityProvider: SesIdentityProvider
  ) {}

  async execute({ id, userId }: VerifyDomainUseCaseRequest): Promise<VerifyDomainUseCaseResponse> {
    const existing = await this.domainsRepository.findById(id);

    if (!existing || existing.userId !== userId) {
      throw AppError.notFound("Domínio não encontrado");
    }

    const identity = await this.sesIdentityProvider.getIdentity(existing.domain);

    await this.domainsRepository.updateVerificationStatus(
      id,
      identity.verificationStatus as DomainVerificationStatus
    );

    const mailFromDomain = existing.mailFromDomain || `mail.${existing.domain}`;
    const dkimRecords = buildDnsRecords({
      domain: existing.domain,
      dkimTokens: identity.dkimTokens,
      mailFromDomain,
    });

    const region = env.awsRegion || "us-east-1";

    const domain = await this.domainsRepository.updateSesIdentity(id, {
      dkimRecords,
      mailFromDomain,
      mailFromMxRecord: `10 feedback-smtp.${region}.amazonses.com`,
      sesIdentityArn: existing.sesIdentityArn,
    });

    return { domain };
  }
}

