import { DomainVerificationStatus } from "@prisma/client";
import { DomainsRepository } from "../repositories/domains-repository";
import { SesIdentityProvider } from "../providers/ses-identity-provider";

interface PollPendingDomainsUseCaseResponse {
  checked: number;
  verified: number;
}

/** Reconsulta no SES cada domínio ainda "Pendente" e atualiza o status local.
 * Pensado para ser chamado periodicamente por um cron externo, já que a
 * aplicação não tem um scheduler/worker embutido. */
export class PollPendingDomainsUseCase {
  constructor(
    private domainsRepository: DomainsRepository,
    private sesIdentityProvider: SesIdentityProvider
  ) {}

  async execute(): Promise<PollPendingDomainsUseCaseResponse> {
    const pending = await this.domainsRepository.findAllPending();
    let verified = 0;

    for (const domain of pending) {
      const identity = await this.sesIdentityProvider.getIdentity(domain.domain);
      await this.domainsRepository.updateVerificationStatus(
        domain.id,
        identity.verificationStatus as DomainVerificationStatus
      );

      if (identity.verificationStatus === "VERIFIED") {
        verified += 1;
      }
    }

    return { checked: pending.length, verified };
  }
}
