import { ContactStatus, PrismaClient } from "@prisma/client";

import { encrypt } from "@/shared/infra/crypto/encryption";

const prisma = new PrismaClient();
const env = (key: string, fallback: string) => process.env[key] ?? fallback;

async function main() {
  const user = await prisma.user.findFirst();
  if (!user) {
    throw new Error(
      "Nenhum usuário encontrado. Cadastre um usuário pela aplicação antes de rodar este seed.",
    );
  }

  const name = env("MAIL_SEED_NAME", "Mailpit (Local)");
  const fromEmail = env("MAIL_SEED_FROM", "teste@local.dev");
  const smtpHost = env("MAIL_SEED_HOST", "localhost");
  const smtpPort = Number(env("MAIL_SEED_PORT", "1025"));
  const smtpUser = env("MAIL_SEED_USER", "dev");
  const smtpPass = encrypt(env("MAIL_SEED_PASS", "dev"));

  const existing = await prisma.sender.findFirst({
    where: { userId: user.id, fromEmail },
  });

  const sender = existing
    ? await prisma.sender.update({
        where: { id: existing.id },
        data: { name, smtpHost, smtpPort, smtpUser, smtpPass },
      })
    : await prisma.sender.create({
        data: { name, fromEmail, smtpHost, smtpPort, smtpUser, smtpPass, userId: user.id },
      });

  const contacts = [
    { email: "leitor1@exemplo.dev", name: "Leitor 1" },
    { email: "leitor2@exemplo.dev", name: "Leitor 2" },
    { email: "leitor3@exemplo.dev", name: "Leitor 3" },
  ];

  for (const contact of contacts) {
    await prisma.contact.upsert({
      where: { email: contact.email },
      update: { status: ContactStatus.ACTIVE },
      create: { ...contact, status: ContactStatus.ACTIVE },
    });
  }

  console.log(`OK -> Sender "${sender.name}" (${sender.smtpHost}:${sender.smtpPort})`);
  console.log(`OK -> Contatos ACTIVE: ${contacts.map((c) => c.email).join(", ")}`);
  if (smtpHost === "localhost") {
    console.log("Veja os e-mails capturados em http://localhost:8025");
  }
}

main()
  .catch((error) => {
    console.error(error);
    process.exitCode = 1;
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
