import { prisma } from '@/lib/db'
import { getSession } from '@/lib/auth'

export type LogCategory = 
  | 'AUTHENTICATION' 
  | 'USER_MANAGEMENT' 
  | 'ROLE_MANAGEMENT'
  | 'SETTINGS'
  | 'JOB_PANEL'
  | 'JOB_PANEL_EMPLOYEE'
  | 'JOB_PANEL_VEHICLE'
  | 'JOB_PANEL_RECORD'
  | 'JOB_PANEL_INVOICE'
  | 'JOB_PANEL_ANNOUNCEMENT'
  | 'JOB_PANEL_RANK'
  | 'JOB_PANEL_STORAGE'
  | 'SYSTEM'

export interface LogDetails {
  [key: string]: unknown
}

interface LogEntry {
  category: LogCategory
  action: string
  userId?: string
  username?: string
  details?: LogDetails
}

/**
 * Create an admin log entry
 * This function is fire-and-forget - it will never throw or block the main operation
 */
export async function createAdminLog(entry: LogEntry): Promise<void> {
  // Fire and forget - don't await this
  (async () => {
    try {
      // Get current session if userId not provided
      let userId = entry.userId
      let username = entry.username

      if (!userId) {
        try {
          const session = await getSession()
          if (session) {
            userId = session.userId
            username = session.username
          }
        } catch {
          // Session fetch failed, continue without user info
        }
      }

      await prisma.adminLog.create({
        data: {
          category: entry.category,
          action: entry.action,
          userId: userId || null,
          username: username || 'System',
          details: entry.details ? JSON.stringify(entry.details) : null,
        },
      })
    } catch {
      // Silently fail - logging should never break main operations
      // The admin_logs table may not exist yet
    }
  })()
}

/**
 * Log authentication events
 */
export async function logAuth(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'AUTHENTICATION',
    action,
    details,
  })
}

/**
 * Log user management events
 */
export async function logUserManagement(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'USER_MANAGEMENT',
    action,
    details,
  })
}

/**
 * Log role management events
 */
export async function logRoleManagement(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'ROLE_MANAGEMENT',
    action,
    details,
  })
}

/**
 * Log settings changes
 */
export async function logSettings(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'SETTINGS',
    action,
    details,
  })
}

/**
 * Log job panel events
 */
export async function logJobPanel(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'JOB_PANEL',
    action,
    details,
  })
}

/**
 * Log job panel employee events
 */
export async function logJobPanelEmployee(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'JOB_PANEL_EMPLOYEE',
    action,
    details,
  })
}

/**
 * Log job panel vehicle events
 */
export async function logJobPanelVehicle(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'JOB_PANEL_VEHICLE',
    action,
    details,
  })
}

/**
 * Log job panel record events
 */
export async function logJobPanelRecord(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'JOB_PANEL_RECORD',
    action,
    details,
  })
}

/**
 * Log job panel invoice events
 */
export async function logJobPanelInvoice(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'JOB_PANEL_INVOICE',
    action,
    details,
  })
}

/**
 * Log job panel announcement events
 */
export async function logJobPanelAnnouncement(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'JOB_PANEL_ANNOUNCEMENT',
    action,
    details,
  })
}

/**
 * Log job panel rank events
 */
export async function logJobPanelRank(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'JOB_PANEL_RANK',
    action,
    details,
  })
}

/**
 * Log job panel storage events
 */
export async function logJobPanelStorage(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'JOB_PANEL_STORAGE',
    action,
    details,
  })
}

/**
 * Log system events
 */
export async function logSystem(action: string, details?: LogDetails): Promise<void> {
  await createAdminLog({
    category: 'SYSTEM',
    action,
    details,
  })
}
