/*
 * Copyright 2019-2023 The Polypheny Project
 *
 * Licensed 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.polypheny.db.cypher.remove;

import java.util.List;
import lombok.Getter;
import org.polypheny.db.algebra.AlgNode;
import org.polypheny.db.algebra.operators.OperatorName;
import org.polypheny.db.algebra.type.AlgDataTypeField;
import org.polypheny.db.cypher.cypher2alg.CypherToAlgConverter.CypherContext;
import org.polypheny.db.cypher.expression.CypherProperty;
import org.polypheny.db.languages.OperatorRegistry;
import org.polypheny.db.languages.QueryLanguage;
import org.polypheny.db.rex.RexNode;
import org.polypheny.db.util.Pair;

@Getter
public class CypherRemoveProperty extends CypherRemoveItem {

    private final CypherProperty property;


    public CypherRemoveProperty( CypherProperty property ) {

        this.property = property;
    }


    @Override
    public void removeItem( CypherContext context ) {
        String nodeName = property.getSubjectName();
        AlgNode node = context.peek();
        int index = node.getRowType().getFieldNames().indexOf( nodeName );
        if ( index < 0 ) {
            throw new RuntimeException( String.format( "Unknown variable with name %s", nodeName ) );
        }
        AlgDataTypeField field = node.getRowType().getFieldList().get( index );

        RexNode ref = context.getRexNode( nodeName );
        if ( ref == null ) {
            ref = context.rexBuilder.makeInputRef( field.getType(), index );
        }

        RexNode op = context.rexBuilder.makeCall(
                field.getType(),
                OperatorRegistry.get( QueryLanguage.from( "cypher" ), OperatorName.CYPHER_REMOVE_PROPERTY ),
                List.of(
                        ref,
                        context.rexBuilder.makeLiteral( getProperty().getPropertyKey() ) ) );

        context.add( Pair.of( nodeName, op ) );
    }

}
