//
//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package org.eclipse.jetty.monitor.triggers;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.jetty.monitor.jmx.EventState;
import org.eclipse.jetty.monitor.jmx.EventTrigger;


/* ------------------------------------------------------------ */
/**
 * AggregateEventTrigger
 * 
 * EventTrigger aggregation that executes every aggregated event
 * triggers in left to right order, and returns match if any one
 * of them have returned match.   
 */
public class AggregateEventTrigger extends EventTrigger
{
    protected final List<EventTrigger> _triggers;

    /* ------------------------------------------------------------ */
    /**
     * Construct an event trigger
     */
    public AggregateEventTrigger()
    {
        _triggers = new ArrayList<EventTrigger>();
    }
    
    /* ------------------------------------------------------------ */
    /**
     * Construct an event trigger and associate the list 
     * of event triggers to be aggregated by this trigger
     * 
     * @param triggers list of event triggers to add
     */
    public AggregateEventTrigger(List<EventTrigger> triggers)
    {
        _triggers = new ArrayList<EventTrigger>(triggers);
    }

    /* ------------------------------------------------------------ */
    /**
     * Construct an event trigger and associate the array 
     * of event triggers to be aggregated by this trigger
     * 
     * @param triggers list of event triggers to add
     */
    public AggregateEventTrigger(EventTrigger... triggers)
    {
        _triggers = Arrays.asList(triggers);
    }
    
    /* ------------------------------------------------------------ */
    /**
     * @param trigger
     */
    public void add(EventTrigger trigger)
    {
        _triggers.add(trigger);
    }
    
    /* ------------------------------------------------------------ */
    /**
     * @param triggers
     */
    public void addAll(List<EventTrigger> triggers)
    {
        _triggers.addAll(triggers);
    }
        
    /* ------------------------------------------------------------ */
    /**
     * @param triggers
     */
    public void addAll(EventTrigger... triggers)
    {
        _triggers.addAll(Arrays.asList(triggers));
    }
    
    /* ------------------------------------------------------------ */
    /**
     * Retrieve the event state associated with specified invocation
     * of the event trigger match method. This event trigger retrieves
     * the combined event state of all aggregated event triggers.
     * 
     * @param timestamp time stamp associated with invocation
     * @return event state or null if not found
     *
     * @see org.eclipse.jetty.monitor.jmx.EventTrigger#getState(long)
     */
    @Override
    public EventState getState(long timestamp)
    {
        EventState state = new EventState();
        
        for (EventTrigger trigger : _triggers)
        {
            EventState subState = trigger.getState(timestamp);
            if (subState != null)
            {
                state.addAll(subState.values());
            }
        }
        
        return state;
    }

    /* ------------------------------------------------------------ */
    /**
     * @see org.eclipse.jetty.monitor.jmx.EventTrigger#match(long)
     */
    @Override
    public boolean match(long timestamp) throws Exception
    {
        boolean result = false;
        for(EventTrigger trigger : _triggers)
        {
            result = trigger.match(timestamp) ? true : result;
        }
        return true;
    }

    /* ------------------------------------------------------------ */
    /**
     * Returns the string representation of this event trigger
     * in the format "AND(triger1,trigger2,...)". 
     * 
     * @return string representation of the event trigger
     * 
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        int cnt = 0;
        StringBuilder result = new StringBuilder();
        
        result.append("ANY(");
        for (EventTrigger trigger : _triggers)
        {
            result.append(cnt++ > 0 ? "," : "");
            result.append(trigger);
        }
        result.append(')');
        
        return result.toString();
    }
}
