import { prisma } from './db'
import { sendDiscordLog, type LogCategory } from './discord-webhook'
import type { AuditCategory } from '@prisma/client'

interface AuditLogOptions {
  userId?: string
  action: string
  category: AuditCategory
  details?: Record<string, unknown>
  ipAddress?: string
  userAgent?: string
  discordLog?: {
    title: string
    description: string
    fields?: { name: string; value: string; inline?: boolean }[]
  }
}

export async function createAuditLog(options: AuditLogOptions): Promise<void> {
  const { userId, action, category, details, ipAddress, userAgent, discordLog } = options

  try {
    // Create database audit log
    await prisma.auditEvent.create({
      data: {
        userId,
        action,
        category,
        details: details ? JSON.parse(JSON.stringify(details)) : undefined,
        ipAddress,
        userAgent,
      },
    })

    // Send Discord webhook log if configured
    if (discordLog) {
      const categoryMap: Record<AuditCategory, LogCategory> = {
        AUTH: 'auth',
        SETTINGS: 'settings',
        ADMIN: 'admin',
        MAINTENANCE: 'maintenance',
        UPDATE: 'update',
        PANEL_BUILDER: 'panelBuilder',
        DEMO_MODE: 'demo',
        INSTALLATION: 'installation',
        SECURITY: 'admin',
      }

      await sendDiscordLog(
        categoryMap[category],
        discordLog.title,
        discordLog.description,
        discordLog.fields
      )
    }
  } catch (error) {
    console.error('[Audit] Failed to create audit log:', error)
  }
}

// Alias for simpler usage
export const auditLog = createAuditLog

export async function getAuditLogs(options?: {
  userId?: string
  category?: AuditCategory
  limit?: number
  offset?: number
}) {
  const { userId, category, limit = 50, offset = 0 } = options || {}

  return prisma.auditEvent.findMany({
    where: {
      ...(userId && { userId }),
      ...(category && { category }),
    },
    include: {
      user: {
        select: {
          id: true,
          username: true,
          discordId: true,
          avatar: true,
        },
      },
    },
    orderBy: { createdAt: 'desc' },
    take: limit,
    skip: offset,
  })
}
