'use server'

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

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 testEmail(provider: 'resend' | 'smtp' = 'smtp') {
  const session = await checkAdmin()
  const email = session.user?.email

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

  const subject = provider === 'resend'
    ? "Memento Resend Test"
    : "Memento SMTP Test"

  const html = provider === 'resend'
    ? "<p>This is a test email from your Memento instance. <strong>Resend is working!</strong></p>"
    : "<p>This is a test email from your Memento instance. <strong>SMTP is working!</strong></p>"

  const result = await sendEmail({
    to: email,
    subject,
    html,
  }, provider)

  return result
}

export async function getSystemConfig() {
  await checkAdmin()
  // Reuse the cached version from lib/config
  const { getSystemConfig: getCachedConfig } = await import('@/lib/config')
  return getCachedConfig()
}

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)

    // Invalidate cache after update
    updateTag('system-config')

    return { success: true }
  } catch (error) {
    console.error('Failed to update settings:', error)
    return { error: 'Failed to update settings' }
  }
}
