/*
 * 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.myfaces.extensions.scripting.components;

import org.apache.myfaces.extensions.scripting.core.util.StringUtils;
import org.apache.myfaces.extensions.scripting.api.ScriptingConst;

import javax.el.ValueExpression;
import javax.faces.component.UIOutput;
import javax.faces.context.FacesContext;
import java.util.Locale;

/**
 * Compiler component which currently
 * just shows the last compile output in the system
 * <p/>
 * Not to keep backwards compatibility to JSF 1.2
 * we do not use the StateHelper but go the old route
 * instead
 */
@SuppressWarnings("unused")
public class CompilerComponent extends UIOutput {

    String _scriptingLanguage = null;
    String _errorsLabel = null;
    String _warningsLabel = null;
    private static final String RENDERER_TYPE = "org.apache.myfaces.extensions.scripting.components.CompilerComponentRenderer";
    private static final String ERRORS_LABEL = "errorsLabel";
    private static final String WARNINGS_LABEL = "warningsLabel";
    private static final String SCRIPTING_LANGUAGE = "scriptingLanguage";

    public CompilerComponent() {
        super();
        setRendererType(RENDERER_TYPE);
    }

    @Override
    public boolean isTransient() {
        return true;
    }

    @Override
    public Object saveState(FacesContext facesContext) {
        Object values[] = new Object[4];
        values[0] = super.saveState(facesContext);    //To change body of overridden methods use File | Settings | File Templates.
        values[1] = _scriptingLanguage;
        values[2] = _errorsLabel;
        values[3] = _warningsLabel;
        return values;
    }

    @Override
    public void restoreState(FacesContext facesContext, Object state) {
        Object[] values = (Object[]) state;
        super.restoreState(facesContext, values[0]);

        _scriptingLanguage = (String) values[1];
        _errorsLabel = (String) values[2];
        _warningsLabel = (String) values[3];
    }


    public String getScriptingLanguage() {
        if (_scriptingLanguage != null) {
            return _scriptingLanguage;
        }
        ValueExpression vb = getValueExpression(SCRIPTING_LANGUAGE);
        return vb != null ? ((String) vb.getValue(getFacesContext().getELContext())) : null;
    }

    public Integer getScriptingLanguageAsInt() {
        if (StringUtils.isBlank(_scriptingLanguage)) {
            return ScriptingConst.ENGINE_TYPE_JSF_ALL;
        } else {
            String scriptingLanguage = _scriptingLanguage.toLowerCase(Locale.getDefault()).trim();
            if (scriptingLanguage.equals("java")) {
                return ScriptingConst.ENGINE_TYPE_JSF_JAVA;
            } else if (_scriptingLanguage.toLowerCase(Locale.getDefault()).trim().equals("groovy")) {
                return ScriptingConst.ENGINE_TYPE_JSF_GROOVY;
            }
        }
        return ScriptingConst.ENGINE_TYPE_JSF_NO_ENGINE;
    }

    public void setScriptingLanguage(String scriptingLanguage) {
        _scriptingLanguage = scriptingLanguage;
    }

    public String getErrorsLabel() {
        if (_errorsLabel != null) {
            return _errorsLabel;
        }
        ValueExpression vb = getValueExpression(ERRORS_LABEL);
        return vb != null ? ((String) vb.getValue(getFacesContext().getELContext())) : null;
    }

    public void setErrorsLabel(String _errorsLabel) {
        this._errorsLabel = _errorsLabel;
    }

    public String getWarningsLabel() {
        if (_warningsLabel != null) {
            return _warningsLabel;
        }
        ValueExpression vb = getValueExpression(WARNINGS_LABEL);
        return vb != null ? ((String) vb.getValue(getFacesContext().getELContext())) : null;
    }

    public void setWarningsLabel(String _warningsLabel) {
        this._warningsLabel = _warningsLabel;
    }
}
