/*******************************************************************************
 * 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.sling.scripting.sightly.java.compiler.impl;

import org.apache.commons.lang3.StringEscapeUtils;

/**
 * Builder object for a Java class printing method.
 */
public class JavaSource {

    private static final String INDENT = "    ";

    private int indentLevel;
    private final StringBuilder builder = new StringBuilder();

    public JavaSource prepend(String str) {
        builder.insert(0, str);
        return this;
    }

    public JavaSource beginIf() {
        indent().append("if (");
        return this;
    }

    public JavaSource completeIf() {
        append(") {\n");
        incIndent();
        return this;
    }

    public JavaSource endBlock() {
        decIndent();
        indent().append("}\n");
        return this;
    }

    public JavaSource comment(String text) {
        indent().append("//").append(text).append("\n");
        return this;
    }

    public JavaSource assign() {
        return append(" = ");
    }

    public JavaSource number(int value) {
        return append(Integer.toString(value));
    }

    public JavaSource increment() {
        return append("++");
    }

    public JavaSource beginAssignment(String variable, String type) {
        return declare(variable, type).assign();
    }

    public JavaSource beginAssignment(String variable) {
        return beginAssignment(variable, "Object");
    }

    public JavaSource declare(String variable, String type) {
        return startStatement().append(type).append(" ").append(variable);
    }

    public JavaSource declare(String variable) {
        return declare(variable, "Object");
    }

    public JavaSource equality() {
        return append(" == ");
    }

    public JavaSource startCall(String methodName, boolean useDot) {
        if (useDot) {
            builder.append('.');
        }
        builder.append(methodName).append('(');
        return this;
    }

    public JavaSource startCall(String methodName) {
        return startCall(methodName, false);
    }

    public JavaSource startMethodCall(String target, String method) {
        return append(target).startCall(method, true);
    }

    public JavaSource startArray() {
        return append("new Object[] {");
    }

    public JavaSource endArray() {
        return append("}");
    }

    public JavaSource startStatement() {
        indent();
        return this;
    }

    public JavaSource nullLiteral() {
        return append("null");
    }

    public JavaSource separateArgument() {
        builder.append(", ");
        return this;
    }

    public JavaSource stringLiteral(String text) {
        builder.append('"')
                .append(StringEscapeUtils.escapeJava(text))
                .append('"');
        return this;
    }

    public JavaSource startExpression() {
        builder.append('(');
        return this;
    }

    public JavaSource endExpression() {
        builder.append(')');
        return this;
    }

    public JavaSource endCall() {
        builder.append(')');
        return this;
    }

    public JavaSource startBlock() {
        indent().append("{\n");
        incIndent();
        return this;
    }

    public JavaSource beginFor(String itemVariable, String listVariable) {
        startStatement()
                .append("for (Object ")
                .append(itemVariable)
                .append(" : ")
                .append(listVariable)
                .append(") {\n");
        incIndent();
        return this;
    }

    public JavaSource endFor() {
        return endBlock();
    }

    public JavaSource endIf() {
        return endBlock();
    }

    public JavaSource beginNewInstanceCall(String className) {
        return append("new ").append(className).append("(");
    }

    public JavaSource append(String str) {
        builder.append(str);
        return this;
    }

    public JavaSource endStatement() {
        builder.append(";\n");
        return this;
    }

    public JavaSource cast(String type) {
        return append("(").append(type).append(")");
    }

    public JavaSource operator(String op) {
        return append(" ").append(op).append(" ");
    }

    public JavaSource beginAnonymousInstance(String className) {
        append("new ").append(className).append("() {\n");
        incIndent();
        return this;
    }

    public JavaSource endAnonymousInstance() {
        decIndent();
        append("}");
        return this;
    }

    public JavaSource beginMethod(String name, String returnType) {
        return startStatement().append("public ").append(returnType).append(" ").append(name).append("(");
    }

    public JavaSource methodParameter(String name, String type) {
        return append(type).append(" ").append(name);
    }

    public JavaSource completeMethodSignature() {
        append(") {\n");
        incIndent();
        return this;
    }

    public JavaSource endMethod() {
        return endBlock();
    }

    public JavaSource conditional() {
        return append(" ? ");
    }

    public JavaSource conditionalBranchSep() {
        return append(" : ");
    }

    public JavaSource negation() {
        return append("!");
    }

    public JavaSource newLine() {
        return append("\n");
    }

    public JavaSource objectModel() {
        return startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, SourceGenConstants.RENDER_CONTEXT_GET_OBJECT_MODEL).endCall();
    }

    public JavaSource property(String target, String property) {
        return append(target).append(".").append(property);
    }

    public JavaSource className(String className) {
        return property(className, "class").startCall("getName", true).endCall();
    }

    private StringBuilder indent() {
        for (int i = 0; i < indentLevel; i++) {
            builder.append(INDENT);
        }
        return builder;
    }

    private void incIndent() {
        indentLevel++;
    }

    private void decIndent() {
        indentLevel--;
    }

    @Override
    public String toString() {
        return builder.toString();
    }
}
