import { Resend } from "resend" const resend = process.env.RESEND_API_KEY ? new Resend(process.env.RESEND_API_KEY) : null interface EmailUser { name: string email: string username: string memberId: string department: string } interface WelcomeEmailData extends EmailUser { password: string loginUrl: string } interface StatusChangeEmailData extends EmailUser { status: "verified" | "rejected" | "pending" loginUrl: string } interface VotingReminderEmailData extends EmailUser { eventTitle: string eventEndDate: string votingUrl: string } export class EmailService { private isDevelopment = process.env.NODE_ENV === "development" private fromEmail = process.env.RESEND_FROM_EMAIL || "onboarding@resend.dev" private baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000" async sendWelcomeEmail(data: WelcomeEmailData): Promise { try { // Only attempt to send email if RESEND_API_KEY is configured if (!process.env.RESEND_API_KEY || !resend) { console.log("RESEND_API_KEY not configured, skipping email send") return true // Return success to not block user creation } const { data: result, error } = await resend.emails.send({ from: this.fromEmail, to: [data.email], subject: "Selamat Datang di Platform E-Voting METI", html: this.getWelcomeEmailTemplate(data), }) if (error) { console.error("Error sending welcome email:", error) // Don't block user creation if email fails return true } console.log("Welcome email sent successfully:", result?.id) return true } catch (error) { console.error("Failed to send welcome email:", error) // Return true to not block user creation in development return true } } async sendStatusChangeEmail(data: StatusChangeEmailData): Promise { try { // Only attempt to send email if RESEND_API_KEY is configured if (!process.env.RESEND_API_KEY || !resend) { console.log("RESEND_API_KEY not configured, skipping email send") return true // Return success to not block user creation } const subject = this.getStatusEmailSubject(data.status) const { data: result, error } = await resend.emails.send({ from: this.fromEmail, to: [data.email], subject, html: this.getStatusChangeEmailTemplate(data), }) if (error) { console.error("Error sending status change email:", error) // Don't block user creation if email fails return true } console.log("Status change email sent successfully:", result?.id) return true } catch (error) { console.error("Failed to send status change email:", error) // Return true to not block user creation in development return true } } async sendVotingReminderEmail(data: VotingReminderEmailData): Promise { try { // Only attempt to send email if RESEND_API_KEY is configured if (!process.env.RESEND_API_KEY || !resend) { console.log("RESEND_API_KEY not configured, skipping email send") return true // Return success to not block user creation } const { data: result, error } = await resend.emails.send({ from: this.fromEmail, to: [data.email], subject: `Reminder: Voting ${data.eventTitle} - METI`, html: this.getVotingReminderEmailTemplate(data), }) if (error) { console.error("Error sending voting reminder email:", error) // Don't block user creation if email fails return true } console.log("Voting reminder email sent successfully:", result?.id) return true } catch (error) { console.error("Failed to send voting reminder email:", error) // Return true to not block user creation in development return true } } private getStatusEmailSubject(status: string): string { switch (status) { case "verified": return "Akun Anda Telah Diverifikasi - METI E-Voting" case "rejected": return "Status Verifikasi Akun - METI E-Voting" case "pending": return "Status Akun Ditangguhkan - METI E-Voting" default: return "Update Status Akun - METI E-Voting" } } private getWelcomeEmailTemplate(data: WelcomeEmailData): string { return ` Selamat Datang di METI E-Voting

Sistem Pemilihan Elektronik METI (New & Renewable Energy)

Selamat Datang, ${data.name}!

Akun Anda telah berhasil dibuat di Platform E-Voting METI. Berikut adalah informasi akun Anda:

📋 Informasi Akun

Nama Lengkap: ${data.name}
ID Anggota: ${data.memberId}
Departemen: ${data.department}
Email: ${data.email}

🔐 Kredensial Login

Username: ${data.username}
Password: ${data.password}
⚠️ Penting:
  • Akun Anda saat ini berstatus PENDING dan menunggu verifikasi admin
  • Anda belum dapat login hingga akun diverifikasi
  • Simpan kredensial login ini dengan aman
  • Jangan bagikan informasi login kepada orang lain
🚀 Login ke Platform

📝 Langkah Selanjutnya:

  1. Tunggu email konfirmasi verifikasi dari admin
  2. Setelah diverifikasi, login menggunakan kredensial di atas
  3. Ikuti event voting yang tersedia
  4. Berikan suara Anda untuk kandidat pilihan

Jika Anda memiliki pertanyaan, silakan hubungi administrator METI.

` } private getStatusChangeEmailTemplate(data: StatusChangeEmailData): string { const statusInfo = this.getStatusInfo(data.status) return ` Update Status Akun - METI E-Voting

Update Status Keanggotaan

Halo, ${data.name}!

${statusInfo.icon}
${statusInfo.title}

${statusInfo.description}

📋 Informasi Akun

Nama: ${data.name}

ID Anggota: ${data.memberId}

Departemen: ${data.department}

Status Saat Ini: ${statusInfo.statusText}

${statusInfo.actionText} ${ data.status === "verified" ? `
🚀 Login & Mulai Voting
` : "" }

Jika Anda memiliki pertanyaan tentang status akun ini, silakan hubungi administrator METI.

` } private getVotingReminderEmailTemplate(data: VotingReminderEmailData): string { return ` Reminder Voting - METI E-Voting

Reminder Voting

Halo, ${data.name}!

🚨 Jangan Lupa Voting!

Ini adalah pengingat bahwa Anda belum memberikan suara untuk event voting yang sedang berlangsung.

📊 Informasi Event

Event: ${data.eventTitle}

Batas Waktu: ${new Date(data.eventEndDate).toLocaleDateString("id-ID", { weekday: "long", year: "numeric", month: "long", day: "numeric", hour: "2-digit", minute: "2-digit", })}

Status: Belum Voting

🗳️ Voting Sekarang

💡 Mengapa Suara Anda Penting?

  • Setiap suara menentukan masa depan METI
  • Partisipasi Anda sangat berharga
  • Proses demokratis membutuhkan keterlibatan semua anggota

Catatan: Pastikan Anda voting sebelum batas waktu berakhir. Setelah event ditutup, Anda tidak dapat lagi memberikan suara.

` } private getStatusInfo(status: string) { switch (status) { case "verified": return { icon: "✅", title: "Akun Terverifikasi!", description: "Selamat! Akun Anda telah diverifikasi dan dapat digunakan untuk voting.", statusText: "TERVERIFIKASI", headerColor: "linear-gradient(135deg, #059669 0%, #10b981 100%)", borderColor: "#10b981", textColor: "#059669", buttonColor: "#059669", bgColor: "#ecfdf5", actionText: "

✨ Apa yang bisa Anda lakukan sekarang:

  • Login ke platform e-voting
  • Ikuti event voting yang tersedia
  • Berikan suara untuk kandidat pilihan Anda
  • Lihat hasil voting real-time
", } case "rejected": return { icon: "❌", title: "Verifikasi Ditolak", description: "Maaf, verifikasi akun Anda ditolak. Silakan hubungi administrator untuk informasi lebih lanjut.", statusText: "DITOLAK", headerColor: "linear-gradient(135deg, #dc2626 0%, #ef4444 100%)", borderColor: "#ef4444", textColor: "#dc2626", buttonColor: "#dc2626", bgColor: "#fef2f2", actionText: "

📞 Langkah selanjutnya:

  • Hubungi administrator METI
  • Tanyakan alasan penolakan
  • Perbaiki dokumen atau informasi yang diperlukan
  • Ajukan ulang jika memungkinkan
", } case "pending": return { icon: "⏳", title: "Status Ditangguhkan", description: "Akun Anda sementara ditangguhkan dan sedang dalam review ulang.", statusText: "DITANGGUHKAN", headerColor: "linear-gradient(135deg, #d97706 0%, #f59e0b 100%)", borderColor: "#f59e0b", textColor: "#d97706", buttonColor: "#d97706", bgColor: "#fffbeb", actionText: "

⏰ Yang perlu Anda ketahui:

  • Akun Anda sedang dalam review
  • Anda tidak dapat login sementara waktu
  • Tunggu email konfirmasi lebih lanjut
  • Hubungi admin jika ada pertanyaan
", } default: return { icon: "❓", title: "Status Tidak Dikenal", description: "Status akun Anda tidak dapat diidentifikasi.", statusText: "TIDAK DIKENAL", headerColor: "linear-gradient(135deg, #6b7280 0%, #9ca3af 100%)", borderColor: "#9ca3af", textColor: "#6b7280", buttonColor: "#6b7280", bgColor: "#f9fafb", actionText: "

Silakan hubungi administrator untuk klarifikasi status akun Anda.

", } } } } export const emailService = new EmailService()