/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
 *
 * 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.adt.internal.wizards.templates;

import static com.android.tools.lint.detector.api.LintUtils.assertionsEnabled;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.eclipse.adt.AdtPlugin;

import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;
import java.util.Map;

/**
 * A template handler which can evaluate simple strings. Used to evaluate
 * parameter constraints during UI wizard value editing.
 * <p>
 * Unlike the more general {@link TemplateHandler} which is used to instantiate
 * full template files (from resources, merging into existing files etc) this
 * evaluator supports only simple strings, referencing only values from the
 * provided map (and builtin functions).
 */
class StringEvaluator implements TemplateLoader {
    private Map<String, Object> mParameters;
    private Configuration mFreemarker;
    private String mCurrentExpression;

    StringEvaluator() {
        mParameters = TemplateHandler.createBuiltinMap();

        mFreemarker = new Configuration();
        mFreemarker.setObjectWrapper(new DefaultObjectWrapper());
        mFreemarker.setTemplateLoader(this);
    }

    /** Evaluates the given expression, with the given set of parameters */
    @Nullable
    String evaluate(@NonNull String expression, @NonNull List<Parameter> parameters) {
        // Render the instruction list template.
        for (Parameter parameter : parameters) {
            mParameters.put(parameter.id, parameter.value);
        }
        try {
            mCurrentExpression = expression;
            Template inputsTemplate = mFreemarker.getTemplate(expression);
            StringWriter out = new StringWriter();
            inputsTemplate.process(mParameters, out);
            out.flush();
            return out.toString();
        } catch (Exception e) {
            if (assertionsEnabled()) {
                AdtPlugin.log(e, null);
            }
            return null;
        }
    }

    // ---- Implements TemplateLoader ----

    @Override
    public Object findTemplateSource(String name) throws IOException {
        return mCurrentExpression;
    }

    @Override
    public long getLastModified(Object templateSource) {
        return 0;
    }

    @Override
    public Reader getReader(Object templateSource, String encoding) throws IOException {
        return new StringReader(mCurrentExpression);
    }

    @Override
    public void closeTemplateSource(Object templateSource) throws IOException {
    }
}
