/*
 * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation
//
package org.eclipse.persistence.jpa.jpql.tools.resolver;

import java.util.Collections;
import java.util.List;
import org.eclipse.persistence.jpa.jpql.ExpressionTools;
import org.eclipse.persistence.jpa.jpql.JPQLQueryDeclaration;
import org.eclipse.persistence.jpa.jpql.parser.AbstractExpression;
import org.eclipse.persistence.jpa.jpql.parser.Expression;
import org.eclipse.persistence.jpa.jpql.parser.IdentificationVariable;
import org.eclipse.persistence.jpa.jpql.parser.Join;

/**
 * The abstract definition of {@link JPQLQueryDeclaration}.
 *
 * @version 2.5
 * @since 2.5
 * @author Pascal Filion
 */
public abstract class Declaration implements JPQLQueryDeclaration {

    /**
     * Either the range variable declaration if this is a range declaration otherwise the
     * collection-valued path expression when this is a collection member declaration.
     */
    protected Expression baseExpression;

    /**
     * The declaration expression, which is either an {@link
     * org.eclipse.persistence.jpa.jpql.parser.IdentificationVariableDeclaration} or
     * a {@link org.eclipse.persistence.jpa.jpql.parser.CollectionMemberDeclaration} when part
     * of a <b>FROM</b> clause, otherwise it's either the {@link
     * org.eclipse.persistence.jpa.jpql.parser.DeleteClause} or the {@link
     * org.eclipse.persistence.jpa.jpql.parser.UpdateClause}.
     */
    protected Expression declarationExpression;

    /**
     * The identification variable used to declare the "root" object.
     */
    protected IdentificationVariable identificationVariable;

    /**
     * The "root" object for objects which may not be reachable by navigation, it is either the
     * abstract schema name (entity name), a derived path expression (which is only defined in a
     * subquery) or <code>null</code> if this {@link Declaration} is a collection member declaration.
     */
    protected String rootPath;

    /**
     * Creates a new <code>Declaration</code>.
     */
    protected Declaration() {
        super();
    }

    @Override
    public Expression getBaseExpression() {
        return baseExpression;
    }

    @Override
    public Expression getDeclarationExpression() {
        return declarationExpression;
    }

    /**
     * Returns the {@link IdentificationVariable} used to declare the "root" object.
     *
     * @return The alias for the "root" object
     */
    public IdentificationVariable getIdentificationVariable() {
        return identificationVariable;
    }

    @Override
    public List<Join> getJoins() {
        return Collections.emptyList();
    }

    /**
     * Returns the "root" object for objects which may not be reachable by navigation, it is
     * either the abstract schema name (entity name), a derived path expression (which is only
     * defined in a subquery) or <code>null</code> if this {@link Declaration} is a collection
     * member declaration.
     *
     * @return The "root" object for objects which may not be reachable by navigation or
     * <code>null</code> if this {@link Declaration} is a collection member declaration
     */
    public String getRootPath() {
        return rootPath;
    }

    @Override
    public String getVariableName() {
        if (identificationVariable == null) {
            return ExpressionTools.EMPTY_STRING;
        }
        return identificationVariable.getVariableName();
    }

    @Override
    public boolean hasJoins() {
        return false;
    }

    @Override
    public String toString() {

        if (declarationExpression != null) {
            return declarationExpression.toParsedText();
        }

        StringBuilder sb = new StringBuilder();
        sb.append(rootPath);
        sb.append(AbstractExpression.SPACE);
        sb.append(identificationVariable);
        return sb.toString();
    }
}
