/*
 * Copyright (C) 2012 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 com.android.ide.eclipse.gltrace.state.transforms;

import com.android.ide.eclipse.gltrace.state.GLIntegerProperty;
import com.android.ide.eclipse.gltrace.state.GLStateType;
import com.android.ide.eclipse.gltrace.state.IGLProperty;

/**
 * The {@link TextureUnitPropertyAccessor} provides the ability to access a
 * texture unit property that is indexed based on the run time value of the
 * {@link GLStateType#ACTIVE_TEXTURE_UNIT} property.
 */
public class TextureUnitPropertyAccessor implements IGLPropertyAccessor {
    private final int mContextId;
    private final IGLPropertyAccessor mActiveTextureAccessor;
    private final GLStateType mTargetType;

    public TextureUnitPropertyAccessor(int contextId, GLStateType targetPropertyType) {
        mContextId = contextId;
        mTargetType = targetPropertyType;

        mActiveTextureAccessor = GLPropertyAccessor.makeAccessor(mContextId,
                GLStateType.TEXTURE_STATE,
                GLStateType.ACTIVE_TEXTURE_UNIT);
    }

    @Override
    public IGLProperty getProperty(IGLProperty state) {
        // first extract the current active texture unit
        IGLProperty activeTextureProperty = mActiveTextureAccessor.getProperty(state);
        if (!(activeTextureProperty instanceof GLIntegerProperty)) {
            return null;
        }
        Integer activeTexture = (Integer) activeTextureProperty.getValue();

        // extract the required property for the current texture unit
        IGLPropertyAccessor targetAccessor = GLPropertyAccessor.makeAccessor(mContextId,
                GLStateType.TEXTURE_STATE,
                GLStateType.TEXTURE_UNITS,
                activeTexture,
                mTargetType);
        return targetAccessor.getProperty(state);
    }

    @Override
    public String getPath() {
        return String.format("TEXTURE_STATE/TEXTURE_UNITS/${activeTextureUnit}/%s", mTargetType);
    }
}
