/*
 * Copyright 2015-present Open Networking Foundation
 *
 * 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.onosproject.cfg.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.onosproject.cfg.ComponentConfigService;
import org.slf4j.Logger;

import java.io.File;

import static org.slf4j.LoggerFactory.getLogger;

/**
 * Component responsible for automatically loading configuration file from
 * configuration directory.
 */
@Component(immediate = true)
public class ComponentConfigLoader {

    private static final String CFG_JSON = "../config/component-cfg.json";
    static File cfgFile = new File(CFG_JSON);

    private final Logger log = getLogger(getClass());

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected ComponentConfigService configService;

    private ObjectNode root;

    @Activate
    protected void activate() {
        this.loadConfigs();
        log.info("Started");
    }

    // Loads the configurations for each component from the file in
    // ../config/component-cfg.json, using the preSetProperty method.
    private void loadConfigs() {
        try {
            if (cfgFile.exists()) {
                root = (ObjectNode) new ObjectMapper().readTree(cfgFile);
                root.fieldNames().
                        forEachRemaining(component -> root.path(component).fieldNames()
                                .forEachRemaining(k -> configService
                                        .preSetProperty(component, k,
                                                        root.path(component).path(k)
                                                                .asText())));
                log.info("Loaded initial component configuration from {}", cfgFile);
            }
        } catch (Exception e) {
            log.warn("Unable to load initial component configuration from {}",
                     cfgFile, e);
        }
    }
}
