package ameba.message.internal;

import ameba.core.Requests;
import org.glassfish.jersey.internal.inject.InjectionManager;
import org.glassfish.jersey.internal.inject.Providers;
import org.glassfish.jersey.message.internal.HeaderUtils;

import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.RuntimeDelegate;

/**
 * <p>MessageHelper class.</p>
 *
 * @author icode
 *
 */
public class MessageHelper {

    /**
     * Constant <code>STREAMING_RANGE_ENABLED="streaming.range.enabled"</code>
     */
    public static final String STREAMING_RANGE_ENABLED = "streaming.range.enabled";

    private MessageHelper() {
    }

    /**
     * <p>disableCurrentStreamingRange.</p>
     */
    public static void disableCurrentStreamingRange() {
        Requests.setProperty(STREAMING_RANGE_ENABLED, false);
    }

    /**
     * <p>enableCurrentStreamingRange.</p>
     */
    public static void enableCurrentStreamingRange() {
        Requests.setProperty(STREAMING_RANGE_ENABLED, true);
    }

    /**
     * <p>getStreamingProcesses.</p>
     *
     * @param manager InjectionManager.
     * @return a {@link java.lang.Iterable} object.
     */
    public static Iterable<StreamingProcess> getStreamingProcesses(InjectionManager manager) {
        return Providers.getAllProviders(manager, StreamingProcess.class);
    }

    /**
     * <p>getStreamingProcess.</p>
     *
     * @param entity a T object.
     * @param manager manager
     * @param <T> a T object.
     * @return a {@link ameba.message.internal.StreamingProcess} object.
     */
    @SuppressWarnings("unchecked")
    public static <T> StreamingProcess<T> getStreamingProcess(T entity, InjectionManager manager) {
        for (StreamingProcess process : getStreamingProcesses(manager)) {
            if (process.isSupported(entity)) {
                return process;
            }
        }
        return null;
    }


    /**
     * <p>getHeaderString.</p>
     *
     * @param headers a {@link javax.ws.rs.core.MultivaluedMap} object.
     * @param name a {@link java.lang.String} object.
     * @return a {@link java.lang.String} object.
     */
    public static String getHeaderString(MultivaluedMap<String, Object> headers, String name) {
        return HeaderUtils.asHeaderString(headers.get(name), RuntimeDelegate.getInstance());
    }
}