/*
 * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
 * (the "License"). You may not use this work except in compliance with the License, which is
 * available at www.apache.org/licenses/LICENSE-2.0
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied, as more fully set forth in the License.
 *
 * See the NOTICE file distributed with this work for information regarding copyright ownership.
 */

package alluxio.cli.fs.command;

import alluxio.AlluxioURI;
import alluxio.Constants;
import alluxio.annotation.PublicApi;
import alluxio.client.file.FileSystem;
import alluxio.exception.AlluxioException;
import alluxio.grpc.FileSystemMasterCommonPOptions;
import alluxio.grpc.SetAttributePOptions;
import alluxio.grpc.TtlAction;

import java.io.IOException;
import java.util.List;
import javax.annotation.concurrent.ThreadSafe;

/**
 * Common util methods for executing commands.
 */
@ThreadSafe
@PublicApi
public final class FileSystemCommandUtils {

  private FileSystemCommandUtils() {} // prevent instantiation

  /**
   * Sets a new TTL value or unsets an existing TTL value for file at path.
   *
   * @param fs the file system for Alluxio
   * @param path the file path
   * @param ttlMs the TTL (time to live) value to use; it identifies duration (in milliseconds) the
   *        created file should be kept around before it is automatically deleted, irrespective of
   *        whether the file is pinned; {@link Constants#NO_TTL} means to unset the TTL value
   * @param ttlAction Action to perform on Ttl expiry
   */
  public static void setTtl(FileSystem fs, AlluxioURI path, long ttlMs,
      TtlAction ttlAction) throws AlluxioException, IOException {
    SetAttributePOptions options = SetAttributePOptions.newBuilder().setRecursive(false)
        .setCommonOptions(FileSystemMasterCommonPOptions.newBuilder()
            .setTtl(ttlMs).setTtlAction(ttlAction).build())
        .build();
    fs.setAttribute(path, options);
  }

  /**
   * Sets pin state for the input path.
   *
   * @param fs The {@link FileSystem} client
   * @param path The {@link AlluxioURI} path as the input of the command
   * @param pinned the state to be set
   * @param mediumTypes a list of medium types to pin to
   */
  public static void setPinned(FileSystem fs, AlluxioURI path, boolean pinned,
      List<String> mediumTypes)
      throws AlluxioException, IOException {
    SetAttributePOptions options = SetAttributePOptions.newBuilder().setPinned(pinned)
        .addAllPinnedMedia(mediumTypes)
        .build();
    fs.setAttribute(path, options);
  }

  /**
   * Sets direct children loaded.
   *
   * @param fs The {@link FileSystem} client
   * @param path The {@link AlluxioURI} path as the input of the command
   * @param directChildrenLoaded true or false
   */
  public static void setDirectChildrenLoaded(FileSystem fs, AlluxioURI path,
      boolean directChildrenLoaded)
      throws AlluxioException, IOException {
    SetAttributePOptions options = SetAttributePOptions.newBuilder()
        .setRecursive(false)
        .setDirectChildrenLoaded(directChildrenLoaded)
        .build();
    fs.setAttribute(path, options);
  }
}
