/**
 * 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.camel.component.servicenow.model;

import java.util.Collections;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.camel.component.servicenow.annotations.ServiceNowSysParm;

@ServiceNowSysParm(name = "sysparm_exclude_reference_link", value = "true")
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ImportSetResponse {
    private final String importSet;
    private final String stagingTable;
    private final List<ImportSetResult> results;

    @JsonCreator
    public ImportSetResponse(
        @JsonProperty("import_set") String importSet,
        @JsonProperty("staging_table") String stagingTable,
        @JsonProperty("result") List<ImportSetResult> results) {
        this.importSet = importSet;
        this.stagingTable = stagingTable;
        this.results = results == null ? Collections.emptyList() : results;
    }

    public String getImportSet() {
        return importSet;
    }

    public String getStagingTable() {
        return stagingTable;
    }

    public List<ImportSetResult> getResults() {
        return results;
    }
}
