/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.tamaya.doc;

import org.apache.tamaya.doc.annot.ConfigAreaSpec;
import org.apache.tamaya.doc.annot.ConfigPropertySpec;
import org.apache.tamaya.doc.annot.ConfigSpec;
import org.apache.tamaya.inject.api.Config;
import org.apache.tamaya.inject.api.DynamicValue;
import org.apache.tamaya.inject.api.NoConfig;
import org.apache.tamaya.spi.PropertyValue;

import java.util.ArrayList;
import java.util.List;

/**
 * An example showing some basic annotations, using an interface to be proxied by the
 * configuration system, nevertheless extending the overall Configuration interface.
 * Created by Anatole on 15.02.14.
 */
@ConfigSpec(
        name="Test",
        version="0.1.0"
)
@ConfigAreaSpec(
        path="",
        description = "Default root configuration",
        areaType = PropertyValue.ValueType.MAP
)
public class AnnotatedDocConfigBean {

    @ConfigPropertySpec(description = "Tests a multi key resolution")
    @Config(value = {"foo.bar.myprop", "mp", "common.testdata.myProperty"}, defaultValue = "ET")
    public String myParameter;

    @ConfigPropertySpec(description = "Tests a simple String description")
    @Config("simple_value")
    public String simpleValue;

    @ConfigPropertySpec(description = "Another test value without any explicit definition")
    @Config
    String anotherValue;

    @ConfigPropertySpec(description = "An explicit config parameter value.")
    @Config("[host.name]")
    private String hostName;

    @ConfigPropertySpec(description = "An non String typed instance.")
    @Config("host.name")
    private DynamicValue<String> dynamicHostname;

    @NoConfig
    public String javaVersion;

    public String getAnotherValue(){
        return anotherValue;
    }

    public String getHostName(){
        return hostName;
    }

    public DynamicValue<String> getDynamicValue(){
        return dynamicHostname;
    }

    @NoConfig
    private List<String> events = new ArrayList<>();

    // verify we don't try to inject final fields
    public static final String CONSTANT = "a constant";


    @Config("java.version")
    void setJavaVersion(String version){
        this.javaVersion = version;
    }

}
