
const isBrowser = typeof window !== 'undefined';

let config = {
  enabled: !isBrowser,
  level: 'info',
  logToConsole: true
};

const LOG_LEVELS = {
  debug: 0,
  info: 1,
  warn: 2,
  error: 3
};

/**
 * 
  * @param options
  */
export function configureLogger(options: Partial<typeof config>) {
  config = { ...config, ...options };
}

/**
 * 
 * @param level 
 * @returns 
 */
function isLevelEnabled(level: keyof typeof LOG_LEVELS): boolean {
  if (!config.enabled) return false;
  return LOG_LEVELS[level] >= LOG_LEVELS[config.level as keyof typeof LOG_LEVELS];
}

/**
 * 
 * @param level 
 * @param args 
 */
function log(level: keyof typeof LOG_LEVELS, ...args: any[]) {
  if (!isLevelEnabled(level)) return;

  if (config.logToConsole) {
    switch (level) {
      case 'debug':
        console.debug(...args);
        break;
      case 'info':
        console.info(...args);
        break;
      case 'warn':
        console.warn(...args);
        break;
      case 'error':
        console.error(...args);
        break;
    }
  }
}

export const logger = {
  debug: (...args: any[]) => log('debug', ...args),
  info: (...args: any[]) => log('info', ...args),
  warn: (...args: any[]) => log('warn', ...args),
  error: (...args: any[]) => log('error', ...args),
  
  /**
   * 
   * @param enabled 
   */
  setEnabled: (enabled: boolean) => {
    config.enabled = enabled;
  },
  
  /**
   * 
   */
  disableBrowserLogs: () => {
    if (isBrowser) {
      config.enabled = false;
    }
  }
};

export default logger; 