/*
    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.wiki.plugin;

import org.apache.wiki.WikiContext;
import org.apache.wiki.api.core.Engine;
import org.apache.wiki.api.exceptions.PluginException;
import org.apache.wiki.api.plugin.WikiPlugin;
import org.apache.wiki.auth.SessionMonitor;
import org.apache.wiki.util.TextUtil;

import java.security.Principal;
import java.util.HashMap;
import java.util.Map;

/**
 *  <p>Displays information about active wiki sessions. The parameter <code>property</code> specifies what information is displayed.
 *  If omitted, the number of sessions is returned.
 *
 *  <p>Parameters : </p>
 *  <ul>
 *  <li><b>property</b> - specify what output to display, valid values are:</li>
 *  <ul>
 *    <li><code>users</code> - returns a comma-separated list of users</li>
 *    <li><code>distinctUsers</code> - will only show distinct users.</li>
 *  </ul>
 *  </ul>
 *  @since 2.3.84
 */
public class SessionsPlugin implements WikiPlugin {

    /** The parameter name for setting the property value. */
    public static final String PARAM_PROP = "property";

    /**
     *  {@inheritDoc}
     */
    @Override
    public String execute( final WikiContext context, final Map<String, String> params ) throws PluginException {
        final Engine engine = context.getEngine();
        final String prop = params.get( PARAM_PROP );

        if( "users".equals( prop ) ) {
            final Principal[] principals = SessionMonitor.getInstance( engine ).userPrincipals();
            final StringBuilder s = new StringBuilder();
            for( final Principal principal : principals ) {
                s.append( principal.getName() ).append( ", " );
            }
            // remove the last comma and blank :
            return TextUtil.replaceEntities( s.substring( 0, s.length() - ( s.length() > 2 ? 2 : 0 ) ) );
        }

        // show each user session only once (with a counter that indicates the number of sessions for each user)
        if( "distinctUsers".equals( prop ) ) {
            final Principal[] principals = SessionMonitor.getInstance( engine ).userPrincipals();
            // we do not assume that the principals are sorted, so first count them :
            final HashMap< String, Integer > distinctPrincipals = new HashMap<>();
            for( final Principal principal : principals ) {
                final String principalName = principal.getName();

                if( distinctPrincipals.containsKey( principalName ) ) {
                    // we already have an entry, increase the counter:
                    int numSessions = distinctPrincipals.get( principalName );
                    // store the new value:
                    distinctPrincipals.put( principalName, ++numSessions );
                } else {
                    // first time we see this entry, add entry to HashMap with value 1
                    distinctPrincipals.put( principalName, 1 );
                }
            }

            final StringBuilder s = new StringBuilder();
            for( final Map.Entry< String, Integer > entry : distinctPrincipals.entrySet() ) {
                s.append( entry.getKey() ).append( "(" ).append( entry.getValue().toString() ).append( "), " );
            }
            // remove the last comma and blank :
            return TextUtil.replaceEntities( s.substring( 0, s.length() - ( s.length() > 2 ? 2 : 0 ) ) );

        }

        return String.valueOf( SessionMonitor.getInstance( engine ).sessions() );
    }
}
