package com.netflix.suro.input;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.Inject;
import com.netflix.config.DynamicStringProperty;
import com.netflix.governator.annotations.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.PostConstruct;
import java.util.List;

public class DynamicPropertyInputConfigurator {
    public static final String INPUT_CONFIG_PROPERTY = "SuroServer.inputConfig";

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

    private final InputManager inputManager;
    private final ObjectMapper jsonMapper;

    @Configuration(INPUT_CONFIG_PROPERTY)
    private String initialInputConfig;

    @Inject
    public DynamicPropertyInputConfigurator(
            InputManager inputManager,
            ObjectMapper jsonMapper) {
        this.inputManager = inputManager;
        this.jsonMapper = jsonMapper;
    }

    @PostConstruct
    public void init() {
        DynamicStringProperty inputFP = new DynamicStringProperty(INPUT_CONFIG_PROPERTY, initialInputConfig) {
            @Override
            protected void propertyChanged() {
                buildInput(get(), false);
            }
        };

        buildInput(inputFP.get(), true);
    }

    private void buildInput(String inputListStr, boolean initialSet) {
        try {
            List<SuroInput> inputList = jsonMapper.readValue(
                    inputListStr,
                    new TypeReference<List<SuroInput>>() {});
            if (initialSet) {
                inputManager.initialSet(inputList);
            } else {
                inputManager.set(inputList);
            }
        } catch (Exception e) {
            LOG.info("Error reading input config from fast property: "+e.getMessage(), e);
        }
    }
}