/*
 * 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.unomi.plugins.baseplugin.conditions;

import org.apache.unomi.api.conditions.Condition;
import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder;
import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Map;

/**
 * ES query builder for boolean conditions.
 */
public class BooleanConditionESQueryBuilder implements ConditionESQueryBuilder {

    private static final Logger logger = LoggerFactory.getLogger(BooleanConditionESQueryBuilder.class.getName());

    @Override
    public QueryBuilder buildQuery(Condition condition, Map<String, Object> context,
                                   ConditionESQueryBuilderDispatcher dispatcher) {
        boolean isAndOperator = "and".equalsIgnoreCase((String) condition.getParameter("operator"));
        @SuppressWarnings("unchecked")
        List<Condition> conditions = (List<Condition>) condition.getParameter("subConditions");

        int conditionCount = conditions.size();

        if (conditionCount == 1) {
            return dispatcher.buildFilter(conditions.get(0), context);
        }

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        for (int i = 0; i < conditionCount; i++) {
            if (isAndOperator) {
                QueryBuilder andFilter = dispatcher.buildFilter(conditions.get(i), context);
                if (andFilter != null) {
                    if (andFilter.getName().equals("range")) {
                        boolQueryBuilder.filter(andFilter);
                    } else {
                        boolQueryBuilder.must(andFilter);
                    }
                } else {
                    logger.warn("Null filter for boolean AND sub condition " + conditions.get(i));
                }
            } else {
                QueryBuilder orFilter = dispatcher.buildFilter(conditions.get(i), context);
                if (orFilter != null) {
                    if (orFilter.getName().equals("range")) {
                        boolQueryBuilder.filter(orFilter);
                    } else {
                        boolQueryBuilder.should(orFilter);
                    }
                } else {
                    logger.warn("Null filter for boolean OR sub condition " + conditions.get(i));
                }
            }
        }

        return boolQueryBuilder;
    }
}
