import { env } from '../config/env.js'

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

const rank: Record<Level, number> = { debug: 10, info: 20, warn: 30, error: 40 }
const floor: Level = env.NODE_ENV === 'production' ? 'info' : 'debug'

const write = (level: Level, message: string, extra?: unknown) => {
  if (rank[level] < rank[floor]) return
  const line = {
    time: new Date().toISOString(),
    level,
    message,
    ...(extra === undefined ? {} : { extra }),
  }
  const sink = level === 'error' || level === 'warn' ? console.error : console.log
  sink(JSON.stringify(line))
}

export const logger = {
  debug: (message: string, extra?: unknown) => write('debug', message, extra),
  info: (message: string, extra?: unknown) => write('info', message, extra),
  warn: (message: string, extra?: unknown) => write('warn', message, extra),
  error: (message: string, extra?: unknown) => write('error', message, extra),
}
