/*
 * 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.iceberg;

import java.util.Collection;
import java.util.List;
import org.apache.iceberg.relocated.com.google.common.base.Joiner;
import org.apache.iceberg.relocated.com.google.common.base.MoreObjects;
import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
import org.apache.iceberg.relocated.com.google.common.collect.ImmutableList;

public class BaseCombinedScanTask implements CombinedScanTask {
  private final FileScanTask[] tasks;

  public BaseCombinedScanTask(FileScanTask... tasks) {
    Preconditions.checkNotNull(tasks, "tasks cannot be null");
    this.tasks = tasks;
  }

  public BaseCombinedScanTask(List<FileScanTask> tasks) {
    Preconditions.checkNotNull(tasks, "tasks cannot be null");
    this.tasks = tasks.stream().toArray(FileScanTask[]::new);
  }

  @Override
  public Collection<FileScanTask> files() {
    return ImmutableList.copyOf(tasks);
  }

  @Override
  public String toString() {
    return MoreObjects.toStringHelper(this)
        .add("tasks", Joiner.on(", ").join(tasks))
        .toString();
  }
}
