/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.meecrowave.logging.jul;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.simple.SimpleLogger;
import org.apache.logging.log4j.status.StatusLogger;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class Log4j2Logger extends AbstractDelegatingLogger {
    private static final Map<Level, org.apache.logging.log4j.Level> TO_LOG4J = new HashMap<>();

    private final Logger log;

    static {
        //older versions of log4j don't have TRACE, use debug
        org.apache.logging.log4j.Level t = org.apache.logging.log4j.Level.DEBUG;

        TO_LOG4J.put(Level.ALL, org.apache.logging.log4j.Level.ALL);
        TO_LOG4J.put(Level.SEVERE, org.apache.logging.log4j.Level.ERROR);
        TO_LOG4J.put(Level.WARNING, org.apache.logging.log4j.Level.WARN);
        TO_LOG4J.put(Level.INFO, org.apache.logging.log4j.Level.INFO);
        TO_LOG4J.put(Level.CONFIG, org.apache.logging.log4j.Level.DEBUG);
        TO_LOG4J.put(Level.FINE, org.apache.logging.log4j.Level.DEBUG);
        TO_LOG4J.put(Level.FINER, org.apache.logging.log4j.Level.TRACE);
        TO_LOG4J.put(Level.FINEST, org.apache.logging.log4j.Level.TRACE);
        TO_LOG4J.put(Level.OFF, org.apache.logging.log4j.Level.OFF);
    }

    public Log4j2Logger(final String name, final String resourceBundleName) {
        super(name, resourceBundleName);
        log = LogManager.getLogger(name);
    }

    @Override
    public void setLevel(final Level newLevel) throws SecurityException {
        if (org.apache.logging.log4j.core.Logger.class.isInstance(log)) {
            org.apache.logging.log4j.core.Logger.class.cast(log).setLevel(TO_LOG4J.get(newLevel));
        } else if (StatusLogger.class.isInstance(log)) {
            StatusLogger.class.cast(log).setLevel(TO_LOG4J.get(newLevel));
        } else if (SimpleLogger.class.isInstance(log)) {
            SimpleLogger.class.cast(log).setLevel(TO_LOG4J.get(newLevel));
        } // else ExtendedLoggerWrapper: ignore for now. we could do reflection if we need it
    }

    public Level getLevel() {
        final org.apache.logging.log4j.Level l = log.getLevel();
        if (l != null) {
            return fromL4J(l);
        }
        return null;
    }

    protected void internalLogFormatted(final String msg, final LogRecord record) {
        log.log(TO_LOG4J.get(record.getLevel()), msg, record.getThrown());
    }


    private Level fromL4J(final org.apache.logging.log4j.Level l) {
        Level l2 = null;
        switch (l.getStandardLevel()) {
            case ALL:
                l2 = Level.ALL;
                break;
            case FATAL:
                l2 = Level.SEVERE;
                break;
            case ERROR:
                l2 = Level.SEVERE;
                break;
            case WARN:
                l2 = Level.WARNING;
                break;
            case INFO:
                l2 = Level.INFO;
                break;
            case DEBUG:
                l2 = Level.FINE;
                break;
            case OFF:
                l2 = Level.OFF;
                break;
            case TRACE:
                l2 = Level.FINEST;
                break;
            default:
                l2 = Level.FINE;
        }
        return l2;
    }
}
