/**
 * Structured Logger Utility
 *
 * Provides tagged, level-aware logging for consistent output across the application.
 * Respects LOG_LEVEL environment variable and NODE_ENV for default levels.
 *
 * Usage:
 *   import { logger } from '@/lib/logger'
 *   logger.info('AI Assignment', 'Processing batch', { batchSize: 15 })
 *   logger.error('Storage', 'Upload failed', error)
 */

type LogLevel = 'debug' | 'info' | 'warn' | 'error'

const LOG_LEVELS: Record<LogLevel, number> = {
  debug: 0,
  info: 1,
  warn: 2,
  error: 3,
}

function getConfiguredLevel(): LogLevel {
  const envLevel = process.env.LOG_LEVEL?.toLowerCase()
  if (envLevel && envLevel in LOG_LEVELS) {
    return envLevel as LogLevel
  }
  return process.env.NODE_ENV === 'production' ? 'warn' : 'debug'
}

function shouldLog(level: LogLevel): boolean {
  return LOG_LEVELS[level] >= LOG_LEVELS[getConfiguredLevel()]
}

function formatTimestamp(): string {
  return new Date().toISOString()
}

export const logger = {
  debug: (tag: string, message: string, data?: unknown): void => {
    if (shouldLog('debug')) {
      console.debug(`${formatTimestamp()} [DEBUG] [${tag}]`, message, data ?? '')
    }
  },
  info: (tag: string, message: string, data?: unknown): void => {
    if (shouldLog('info')) {
      console.info(`${formatTimestamp()} [INFO] [${tag}]`, message, data ?? '')
    }
  },
  warn: (tag: string, message: string, data?: unknown): void => {
    if (shouldLog('warn')) {
      console.warn(`${formatTimestamp()} [WARN] [${tag}]`, message, data ?? '')
    }
  },
  error: (tag: string, message: string, data?: unknown): void => {
    if (shouldLog('error')) {
      console.error(`${formatTimestamp()} [ERROR] [${tag}]`, message, data ?? '')
    }
  },
}
