/*
 * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.jaspic.config.helper;

import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import jakarta.security.auth.message.AuthException;
import jakarta.security.auth.message.AuthStatus;

/**
 *
 * @author Ron Monzillo
 */
public abstract class AuthContextHelper {

    String loggerName;
    private boolean returnNullContexts = false;

    // include this to force subclasses to call constructor with LoggerName
    private AuthContextHelper() {

    }

    protected AuthContextHelper(String loggerName, boolean returnNullContexts) {
        this.loggerName = loggerName;
        this.returnNullContexts = returnNullContexts;
    }

    protected boolean isLoggable(Level level) {
        Logger logger = Logger.getLogger(loggerName);
        return logger.isLoggable(level);
    }

    protected void logIfLevel(Level level, Throwable t, String... msgParts) {
        Logger logger = Logger.getLogger(loggerName);
        if (logger.isLoggable(level)) {
            StringBuffer msgB = new StringBuffer("");
            for (String m : msgParts) {
                msgB.append(m);
            }
            String msg = msgB.toString();
            if ( !msg.isEmpty() && t != null) {
                logger.log(level, msg, t);
            } else if (!msg.isEmpty()) {
                logger.log(level, msg);
            }
        }
    }

    /**
     *
     * @param level
     * @return
     */
    protected Logger getLogger(Level level) {
        Logger rvalue = Logger.getLogger(loggerName);
        if (rvalue.isLoggable(level)) {
            return rvalue;
        }
        return null;
    }

    protected abstract void refresh();

    public boolean returnsNullContexts() {
        return returnNullContexts;
    }

    public <M> boolean isProtected(M[] template, String authContextID) throws AuthException {
        try {
            if (returnNullContexts) {
                return hasModules(template, authContextID);
            } else {
                return true;
            }
        } catch (AuthException ae) {
            throw new RuntimeException(ae);
        }
    }

    /**
     *
     * @param <M>
     * @param template
     * @param authContextID
     * @return
     * @throws AuthException
     */
    public abstract <M> boolean hasModules(M[] template,String authContextID) throws AuthException;

    /**
     *
     * @param <M>
     * @param template
     * @param authContextID
     * @return
     * @throws AuthException
     */
    public abstract <M> M[] getModules(M[] template,String authContextID) throws AuthException;

    /**
     *
     * @param i
     * @param properties
     * @return
     */
    public abstract Map<String, ?> getInitProperties(int i, Map<String, ?> properties);

    /**
     *
     * @param successValue
     * @param i
     * @param moduleStatus
     * @return
     */
    public abstract boolean exitContext(AuthStatus[] successValue,
            int i, AuthStatus moduleStatus);

    /**
     *
     * @param successValue
     * @param defaultFailStatus
     * @param status
     * @param position
     * @return
     */
    public abstract AuthStatus getReturnStatus(AuthStatus[] successValue,
            AuthStatus defaultFailStatus, AuthStatus[] status, int position);
}
