/*
 * 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.maven.plugin.testing;

import java.io.File;

import org.apache.maven.artifact.repository.MavenArtifactRepository;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;

/**
 * Stub for {@link ExpressionEvaluator}
 *
 * @author jesse
 */
public class ResolverExpressionEvaluatorStub implements ExpressionEvaluator {
    /** {@inheritDoc} */
    @Override
    public Object evaluate(String expr) throws ExpressionEvaluationException {

        Object value = null;

        if (expr == null) {
            return null;
        }

        String expression = stripTokens(expr);

        if (expression.equals(expr)) {
            int index = expr.indexOf("${");
            if (index >= 0) {
                int lastIndex = expr.indexOf("}", index);
                if (lastIndex >= 0) {
                    String retVal = expr.substring(0, index);

                    if (index > 0 && expr.charAt(index - 1) == '$') {
                        retVal += expr.substring(index + 1, lastIndex + 1);
                    } else {
                        retVal += evaluate(expr.substring(index, lastIndex + 1));
                    }

                    retVal += evaluate(expr.substring(lastIndex + 1));
                    return retVal;
                }
            }

            // Was not an expression
            if (expression.indexOf("$$") > -1) {
                return expression.replaceAll("\\$\\$", "\\$");
            }
        }

        if ("basedir".equals(expression) || "project.basedir".equals(expression)) {
            return PlexusTestCase.getBasedir();
        } else if (expression.startsWith("basedir") || expression.startsWith("project.basedir")) {
            int pathSeparator = expression.indexOf("/");

            if (pathSeparator > 0) {
                value = PlexusTestCase.getBasedir() + expression.substring(pathSeparator);
            } else {
                System.out.println("Got expression '" + expression + "' that was not recognised");
            }
            return value;
        } else if ("localRepository".equals(expression)) {
            File localRepo = new File(PlexusTestCase.getBasedir(), "target/local-repo");
            return new MavenArtifactRepository(
                    "localRepository",
                    "file://" + localRepo.getAbsolutePath(),
                    new DefaultRepositoryLayout(),
                    null,
                    null);
        } else {
            return expr;
        }
    }

    private String stripTokens(String expr) {
        if (expr.startsWith("${") && expr.indexOf("}") == expr.length() - 1) {
            expr = expr.substring(2, expr.length() - 1);
        }

        return expr;
    }

    /** {@inheritDoc} */
    @Override
    public File alignToBaseDirectory(File file) {
        if (file.getAbsolutePath().startsWith(PlexusTestCase.getBasedir())) {
            return file;
        } else if (file.isAbsolute()) {
            return file;
        } else {
            return new File(PlexusTestCase.getBasedir(), file.getPath());
        }
    }
}
