// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab

package org.mariadb.jdbc.util.log;

import java.util.HashMap;

/** Loggers factory */
public final class Loggers {

  /** defined if using JDK if sfl4j is not present. possible values: JDK/CONSOLE */
  public static final String FALLBACK_PROPERTY = "mariadb.logging.fallback";

  /** set if console must log debug level */
  public static final String CONSOLE_DEBUG_PROPERTY = "mariadb.logging.fallback.console.debug";

  /** !! testing only !! permit to disable SLF4J implementation even if SLF4j is present */
  public static final String TEST_ENABLE_SLF4J = "mariadb.logging.slf4j.enable";

  /** disable logging */
  public static final String NO_LOGGER_PROPERTY = "mariadb.logging.disable";

  /** factory */
  private static LoggerFactory LOGGER_FACTORY;

  static {
    init();
  }

  /**
   * Return default logger implementation
   *
   * @param name logger name
   * @return logger implementation
   */
  public static Logger getLogger(String name) {
    return LOGGER_FACTORY.getLogger(name);
  }

  /**
   * Return default logger implementation
   *
   * @param cls class
   * @return logger implementation
   */
  public static Logger getLogger(Class<?> cls) {
    return LOGGER_FACTORY.getLogger(cls.getName());
  }

  private interface LoggerFactory {
    Logger getLogger(String name);
  }

  private static class NoLoggerFactory implements LoggerFactory {
    @Override
    public Logger getLogger(String name) {
      return new NoLogger();
    }
  }

  private static class Slf4JLoggerFactory implements LoggerFactory {
    @Override
    public Logger getLogger(String name) {
      return new Slf4JLogger(org.slf4j.LoggerFactory.getLogger(name));
    }
  }

  /** JDK wrapper */
  private static class JdkLoggerFactory implements LoggerFactory {
    @Override
    public Logger getLogger(String name) {
      return new JdkLogger(java.util.logging.Logger.getLogger(name));
    }
  }

  private static final class ConsoleLoggerFactory implements LoggerFactory {

    private static final HashMap<String, Logger> consoleLoggers = new HashMap<>();

    @Override
    public Logger getLogger(String name) {
      return consoleLoggers.computeIfAbsent(
          name, n -> new ConsoleLogger(n, System.getProperty(CONSOLE_DEBUG_PROPERTY) != null));
    }
  }

  /** Initialize factory */
  public static void init() {
    String name = LoggerFactory.class.getName();
    LoggerFactory loggerFactory = null;
    if (Boolean.parseBoolean(System.getProperty(NO_LOGGER_PROPERTY, "false"))) {
      loggerFactory = new NoLoggerFactory();
    } else {

      try {
        if (Boolean.parseBoolean(System.getProperty(TEST_ENABLE_SLF4J, "true"))) {
          Class.forName("org.slf4j.LoggerFactory");
          loggerFactory = new Slf4JLoggerFactory();
        }
      } catch (ClassNotFoundException cle) {
        // slf4j not in the classpath
      }
      if (loggerFactory == null) {
        // default to console or use JDK logger if explicitly set by System property
        if ("JDK".equalsIgnoreCase(System.getProperty(FALLBACK_PROPERTY))) {
          loggerFactory = new JdkLoggerFactory();
        } else {
          loggerFactory = new ConsoleLoggerFactory();
        }
      }
      try {
        loggerFactory.getLogger(name);
      } catch (Throwable e) {
        // eat
      }
    }
    LOGGER_FACTORY = loggerFactory;
  }
}
