/*-
 * ============LICENSE_START=======================================================
 * OSAM
 * ================================================================================
 * Copyright (C) 2018 AT&T
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */



package org.onap.osam.aai.model;

import com.fasterxml.jackson.annotation.JsonCreator;

import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public enum ResourceType {

    SERVICE_INSTANCE("service-instance", "service-instance-name"),
    GENERIC_VNF("generic-vnf", "vnf-name"),
    VF_MODULE("vf-module", "vf-module-name"),
    VOLUME_GROUP("volume-group", "volume-group-name");

    private static Map<String, ResourceType> AAI_FORMAT_MAP = Stream
            .of(ResourceType.values())
            .collect(Collectors.toMap(s -> s.aaiFormat, Function.identity()));

    private final String aaiFormat;
    private final String nameFilter;

    ResourceType(String formatted, String nameFilter) {
        this.aaiFormat = formatted;
        this.nameFilter = nameFilter;
    }

    public String getAaiFormat() {
        return aaiFormat;
    }

    public String getNameFilter() {
        return nameFilter;
    }

    @JsonCreator
    public static ResourceType fromString(String string) {
        return Optional
                .ofNullable(AAI_FORMAT_MAP.get(string))
                .orElseThrow(() -> new IllegalArgumentException(string));
    }
}
