/*-
 * ~~~~~~licensing~~~~~~
 * search-service
 * ==========
 * Copyright (C) 2020 - 2025 EmDev LLC
 * ==========
 * You may not use this file except in accordance with the License Terms of the Copyright
 * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
 * rights to the Software and any copies are the property of the Copyright Holder. Unless
 * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
 * Software for commercial purposes to provide services to third parties.
 * 
 * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
 * Under no circumstances does the Copyright Holder guarantee or promise that the
 * Software provided by him will be suitable or not suitable for the specific purposes
 * of the User, that the Software will meet all commercial and personal subjective
 * expectations of the User, that the Software will work properly, without technical
 * errors, quickly and uninterruptedly.
 * 
 * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
 * to the User for any direct or indirect losses of the User, his expenses or actual
 * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
 * or damage to data, property, etc.
 * ~~~~~~/licensing~~~~~~
 */
package ru.entaxy.platform.search.jmx;

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

import javax.management.MBeanOperationInfo;

import org.osgi.framework.InvalidSyntaxException;

import ru.entaxy.esb.platform.base.management.core.ManagementCore;
import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
import ru.entaxy.esb.platform.base.management.core.api.Operation;
import ru.entaxy.esb.platform.base.management.core.api.Parameter;

@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
public interface SearchMBean {

    String SEARCH_KEY = "util";
    String SEARCH_KEY_VALUE = "search";

    String JMX_OBJECT_NAME = ManagementCore.Q_PLATFORM_S + ","
            + SearchMBean.SEARCH_KEY + "=" + SearchMBean.SEARCH_KEY_VALUE;

    @Operation(impact = MBeanOperationInfo.INFO, desc = "Lists available search providers")
    List<String> listProviders();

    @Operation(impact = MBeanOperationInfo.INFO, desc = "Lists types available for search")
    List<String> listProvidedTypes();

    @Operation(impact = MBeanOperationInfo.INFO, desc = "Lists standard attributes for selected type")
    Map<String, String> listStandardAttributes(@Parameter(name = "type") String type)
            throws InvalidSyntaxException, IllegalArgumentException;

    @Operation(impact = MBeanOperationInfo.INFO, desc = "Lists attributes available for the target search")
    default List<String> listAttributes(@Parameter(name = "type") String type,
            @Parameter(name = "filter") String filter)
            throws InvalidSyntaxException, IllegalArgumentException {

        List<String> result = new LinkedList<>();

        for (Map<String, Object> item : search(type, filter))
            for (String attr : item.keySet())
                if (!result.contains(attr))
                    result.add(attr);

        return result;
    };


    @Operation(impact = MBeanOperationInfo.INFO, desc = "Executes search")
    List<Map<String, Object>> search(@Parameter(name = "type") String type, @Parameter(name = "filter") String filter)
            throws InvalidSyntaxException, IllegalArgumentException;

}
