/**
 * 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.atlas.model.impexp;

import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
import org.codehaus.jackson.annotate.JsonAnySetter;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.annotate.JsonSerialize;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;

@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown=true)
public class AtlasImportRequest implements Serializable {
    private static final long   serialVersionUID = 1L;
    public  static final String TRANSFORMS_KEY   = "transforms";
    private static final String START_POSITION_KEY = "startPosition";
    private static final String START_GUID_KEY = "startGuid";
    private static final String UPDATE_TYPE_DEFINITION_KEY = "updateTypeDefinition";

    private Map<String, String> options;

    public AtlasImportRequest() {
        this.options = new HashMap<>();
    }

    public Map<String, String> getOptions() { return options; }

    public void setOptions(Map<String, String> options) { this.options = options; }

    public StringBuilder toString(StringBuilder sb) {
        if (sb == null) {
            sb = new StringBuilder();
        }

        sb.append("AtlasImportRequest{");
        sb.append("options={");
        AtlasBaseTypeDef.dumpObjects(options, sb);
        sb.append("}");
        sb.append("}");

        return sb;
    }

    @Override
    public String toString() {
        return toString(new StringBuilder()).toString();
    }

    @JsonIgnore
    public String getStartGuid() {
        return getOptionForKey(START_GUID_KEY);
    }

    @JsonIgnore
    public String getStartPosition() {
        return getOptionForKey(START_POSITION_KEY);
    }

    @JsonIgnore
    public String getUpdateTypeDefs() {
        return getOptionForKey(UPDATE_TYPE_DEFINITION_KEY);
    }

    private String getOptionForKey(String key) {
        if (this.options == null || !this.options.containsKey(key)) {
            return null;
        }

        return (String) this.options.get(key);
    }
 @JsonAnySetter
    public void setOption(String key, String value) {
        if (null == options) {
            options = new HashMap<>();
        }
        options.put(key, value);
    }}
