/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed 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 android.filterfw.core;

import android.annotation.UnsupportedAppUsage;
import android.filterfw.core.Filter;
import android.filterfw.core.Frame;
import android.filterfw.core.FrameManager;
import android.filterfw.core.GLEnvironment;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

/**
 * @hide
 */
public class FilterContext {

    private FrameManager mFrameManager;
    private GLEnvironment mGLEnvironment;
    private HashMap<String, Frame> mStoredFrames = new HashMap<String, Frame>();
    private Set<FilterGraph> mGraphs = new HashSet<FilterGraph>();

    @UnsupportedAppUsage
    public FrameManager getFrameManager() {
        return mFrameManager;
    }

    public void setFrameManager(FrameManager manager) {
        if (manager == null) {
            throw new NullPointerException("Attempting to set null FrameManager!");
        } else if (manager.getContext() != null) {
            throw new IllegalArgumentException("Attempting to set FrameManager which is already "
                + "bound to another FilterContext!");
        } else {
            mFrameManager = manager;
            mFrameManager.setContext(this);
        }
    }

    @UnsupportedAppUsage
    public GLEnvironment getGLEnvironment() {
        return mGLEnvironment;
    }

    public void initGLEnvironment(GLEnvironment environment) {
        if (mGLEnvironment == null) {
            mGLEnvironment = environment;
        } else {
            throw new RuntimeException("Attempting to re-initialize GL Environment for " +
                "FilterContext!");
        }
    }

    public interface OnFrameReceivedListener {
        public void onFrameReceived(Filter filter, Frame frame, Object userData);
    }

    public synchronized void storeFrame(String key, Frame frame) {
        Frame storedFrame = fetchFrame(key);
        if (storedFrame != null) {
            storedFrame.release();
        }
        frame.onFrameStore();
        mStoredFrames.put(key, frame.retain());
    }

    public synchronized Frame fetchFrame(String key) {
        Frame frame = mStoredFrames.get(key);
        if (frame != null) {
            frame.onFrameFetch();
        }
        return frame;
    }

    public synchronized void removeFrame(String key) {
        Frame frame = mStoredFrames.get(key);
        if (frame != null) {
            mStoredFrames.remove(key);
            frame.release();
        }
    }

    public synchronized void tearDown() {
        // Release stored frames
        for (Frame frame : mStoredFrames.values()) {
            frame.release();
        }
        mStoredFrames.clear();

        // Release graphs
        for (FilterGraph graph : mGraphs) {
            graph.tearDown(this);
        }
        mGraphs.clear();

        // Release frame manager
        if (mFrameManager != null) {
            mFrameManager.tearDown();
            mFrameManager = null;
        }

        // Release GL context
        if (mGLEnvironment != null) {
            mGLEnvironment.tearDown();
            mGLEnvironment = null;
        }
    }

    final void addGraph(FilterGraph graph) {
        mGraphs.add(graph);
    }
}
