'use server'

import { revalidatePath } from 'next/cache'
import prisma from '@/lib/prisma'
import { auth } from '@/auth'
import { sendEmail } from '@/lib/mail'

async function checkAdmin() {
  const session = await auth()
  if (!session?.user?.id || (session.user as any).role !== 'ADMIN') {
    throw new Error('Unauthorized: Admin access required')
  }
  return session
}

export async function testSMTP() {
  const session = await checkAdmin()
  const email = session.user?.email

  if (!email) throw new Error("No admin email found")

  const result = await sendEmail({
    to: email,
    subject: "Memento SMTP Test",
    html: "<p>This is a test email from your Memento instance. <strong>SMTP is working!</strong></p>"
  })

  return result
}

export async function getSystemConfig() {
  await checkAdmin()
  const configs = await prisma.systemConfig.findMany()
  return configs.reduce((acc, conf) => {
    acc[conf.key] = conf.value
    return acc
  }, {} as Record<string, string>)
}

export async function updateSystemConfig(data: Record<string, string>) {
  await checkAdmin()

  try {
    // Filter out empty values but keep 'false' as valid
    const filteredData = Object.fromEntries(
      Object.entries(data).filter(([key, value]) => value !== '' && value !== null && value !== undefined)
    )



    const operations = Object.entries(filteredData).map(([key, value]) =>
      prisma.systemConfig.upsert({
        where: { key },
        update: { value },
        create: { key, value }
      })
    )

    await prisma.$transaction(operations)
    revalidatePath('/admin/settings')
    return { success: true }
  } catch (error) {
    console.error('Failed to update settings:', error)
    return { error: 'Failed to update settings' }
  }
}
