/*
 * Copyright (C) 2013 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.gallery3d.filtershow.filters;


import android.util.Log;

import com.android.gallery3d.filtershow.controller.Control;
import com.android.gallery3d.filtershow.controller.FilterView;
import com.android.gallery3d.filtershow.controller.Parameter;
import com.android.gallery3d.filtershow.controller.ParameterInteger;

public class FilterBasicRepresentation extends FilterRepresentation implements ParameterInteger {
    private static final String LOGTAG = "FilterBasicRep";
    private int mMinimum;
    private int mValue;
    private int mMaximum;
    private int mDefaultValue;
    private int mPreviewValue;
    private boolean mLogVerbose = Log.isLoggable(LOGTAG, Log.VERBOSE);

    public FilterBasicRepresentation(String name, int minimum, int value, int maximum) {
        super(name);
        mMinimum = minimum;
        mMaximum = maximum;
        setValue(value);
    }

    @Override
    public String toString() {
        return getName() + " : " + mMinimum + " < " + mValue + " < " + mMaximum;
    }

    @Override
    public FilterRepresentation clone() throws CloneNotSupportedException {
        FilterBasicRepresentation representation = (FilterBasicRepresentation) super.clone();
        representation.setMinimum(getMinimum());
        representation.setMaximum(getMaximum());
        representation.setValue(getValue());
        if (mLogVerbose) {
            Log.v(LOGTAG, "cloning from <" + this + "> to <" + representation + ">");
        }
        return representation;
    }

    @Override
    public void useParametersFrom(FilterRepresentation a) {
        if (a instanceof FilterBasicRepresentation) {
            FilterBasicRepresentation representation = (FilterBasicRepresentation) a;
            setMinimum(representation.getMinimum());
            setMaximum(representation.getMaximum());
            setValue(representation.getValue());
            setDefaultValue(representation.getDefaultValue());
            setPreviewValue(representation.getPreviewValue());
        }
    }

    @Override
    public boolean equals(FilterRepresentation representation) {
        if (!super.equals(representation)) {
            return false;
        }
        if (representation instanceof FilterBasicRepresentation) {
            FilterBasicRepresentation basic = (FilterBasicRepresentation) representation;
            if (basic.mMinimum == mMinimum
                    && basic.mMaximum == mMaximum
                    && basic.mValue == mValue
                    && basic.mDefaultValue == mDefaultValue
                    && basic.mPreviewValue == mPreviewValue) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int getMinimum() {
        return mMinimum;
    }

    public void setMinimum(int minimum) {
        mMinimum = minimum;
    }

    @Override
    public int getValue() {
        return mValue;
    }

    @Override
    public void setValue(int value) {
        mValue = value;
        if (mValue < mMinimum) {
            mValue = mMinimum;
        }
        if (mValue > mMaximum) {
            mValue = mMaximum;
        }
    }

    @Override
    public int getMaximum() {
        return mMaximum;
    }

    public void setMaximum(int maximum) {
        mMaximum = maximum;
    }

    public void setDefaultValue(int defaultValue) {
        mDefaultValue = defaultValue;
    }

    @Override
    public int getDefaultValue() {
        return mDefaultValue;
    }

    public int getPreviewValue() {
        return mPreviewValue;
    }

    public void setPreviewValue(int previewValue) {
        mPreviewValue = previewValue;
    }

    @Override
    public String getStateRepresentation() {
        int val = getValue();
        return ((val > 0) ? "+" : "") + val;
    }

    @Override
    public String getParameterType(){
        return sParameterType;
    }

    @Override
    public void setController(Control control) {
    }

    @Override
    public String getValueString() {
        return getStateRepresentation();
    }

    @Override
    public String getParameterName() {
        return getName();
    }

    @Override
    public void setFilterView(FilterView editor) {
    }

    @Override
    public void copyFrom(Parameter src) {
        useParametersFrom((FilterBasicRepresentation) src);
    }
}
