/*-
 * ~~~~~~licensing~~~~~~
 * data-mapper-management
 * ==========
 * 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.modules.data.datamapper.management;

import java.util.List;

import javax.management.MBeanOperationInfo;

import ru.entaxy.esb.platform.base.management.core.Qualifier;
import ru.entaxy.esb.platform.base.management.core.api.Attribute;
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;
import ru.entaxy.platform.modules.datamapper.exceptions.DataMapperException;

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

    String DATA_MAPPER_KEY = "data-mapper";

    public static Qualifier getQualifier(String mapperId) {
        return DataMappersMBean.Q_DATA_MAPPERS.qualifier(DATA_MAPPER_KEY, mapperId);
    }

    public enum VALUE_TYPE {
        STRING,
        BOOLEAN,
        NUMBER
    }

    @Attribute
    String getId();

    @Operation(impact = MBeanOperationInfo.INFO, desc = "List available data maps")
    List<String> listMaps();

    @Operation(desc = "Get value from the map", impact = MBeanOperationInfo.INFO)
    Object resolve(
            @Parameter(name = "mapName", desc = "Name of the map") String mapName,
            @Parameter(name = "sourceValue", desc = "Value to resolve") String sourceValue,
            @Parameter(name = "isTrimForString", desc = "Trim for string") boolean isTrimForString)
            throws DataMapperException;


    @Operation(desc = "Put mapped values to the map", impact = MBeanOperationInfo.ACTION)
    void put(
            @Parameter(name = "mapName", desc = "Name of the map") String mapName,
            @Parameter(name = "sourceValue", desc = "Value to resolve from") String sourceValue,
            @Parameter(name = "targetValue", desc = "Value to resolve to") String targetValue,
            @Parameter(name = "targetType", desc = "Type of the target value") String targetType)
            throws Exception;

    @Operation(desc = "Remove mapping from the map", impact = MBeanOperationInfo.ACTION)
    void remove(
            @Parameter(name = "mapName", desc = "Name of the map") String mapName,
            @Parameter(name = "sourceValue", desc = "Value to remove") String sourceValue)
            throws DataMapperException;

}
