/*-
 * ~~~~~~licensing~~~~~~
 * object-producing-config-support
 * ==========
 * 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.core.producer.config.support;

import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

import org.jline.utils.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ru.entaxy.platform.base.support.CommonUtils;
import ru.entaxy.platform.base.support.JSONUtils;
import ru.entaxy.platform.config.runtime.ObjectConfig;
import ru.entaxy.platform.config.runtime.ObjectConfig.ConfigHint;

public class DeployableConfig {

    private static final Logger LOG = LoggerFactory.getLogger(DeployableConfig.class);

    public String jsonData;
    public Map<String, Object> properties;

    public String configurationPid;

    public DeployableConfig(String configurationPid, String jsonData) {

        this.configurationPid = configurationPid;

        this.jsonData = jsonData;

        Map<String, Object> origin = JSONUtils.element2map(JSONUtils.getJsonRootObject(jsonData));
        properties = new HashMap<>();
        if (origin == null) {
            return;
        }

        for (Map.Entry<String, Object> entry : origin.entrySet())
            if (!entry.getKey().startsWith("#"))
                properties.put(entry.getKey(), entry.getValue());

        try {
            generateHint();
        } catch (Exception e) {
            Log.error("Error generating condig hint", e);
        }

    }

    protected void generateHint() throws Exception {

        properties.remove(ObjectConfig.CONFIG_HINT_FIELD_NAME);

        String factoryId = properties.getOrDefault(ObjectConfig.CONFIG_FACTORY_FIELD_NAME, "").toString();
        String outputType = properties.getOrDefault(ObjectConfig.CONFIG_OUTPUT_FIELD_NAME, "").toString();

        ConfigHint configHint = new ConfigHint();
        configHint.generate(properties, factoryId, outputType);

        String jsonHint = configHint.getAsJsonString();
        if (CommonUtils.isValid(jsonHint)) {
            properties.put(ObjectConfig.CONFIG_HINT_FIELD_NAME,
                    Base64.getEncoder().encodeToString(jsonHint.getBytes()));

        }



    }

}
