/*
 * 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.felix.systemready;

import java.util.Collection;
import java.util.stream.Stream;

import org.apache.felix.systemready.CheckStatus.State;

public class SystemStatus {
    private Collection<CheckStatus> checkStates;
	private State state;
    
    public SystemStatus(Collection<CheckStatus> checkStates) {
        this.checkStates = checkStates;
        Stream<State> states = checkStates.stream()
        		.map(status -> status.getState());
        this.state = CheckStatus.State.worstOf(states);
    }

    public CheckStatus.State getState() {
        return this.state;
    }
    
    public Collection<CheckStatus> getCheckStates() {
        return checkStates;
    }
}
