/*
 * Copyright 2022 Google LLC
 *
 * 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.
 */
package com.google.android.libraries.mobiledatadownload;

import static com.google.common.base.Preconditions.checkArgument;

import android.accounts.Account;
import com.google.auto.value.AutoValue;
import com.google.common.base.Optional;
import javax.annotation.concurrent.Immutable;

/** Request to get multiple file groups after filtering. */
@AutoValue
@Immutable
public abstract class GetFileGroupsByFilterRequest {
  GetFileGroupsByFilterRequest() {}

  // If this value is set to true, groupName should not be set.
  public abstract boolean includeAllGroups();

  // If this value is set to true, only groups without account will be returned, and accountOptional
  // should be absent. The default value is false.
  public abstract boolean groupWithNoAccountOnly();

  public abstract Optional<String> groupNameOptional();

  public abstract Optional<Account> accountOptional();

  public abstract boolean preserveZipDirectories();

  public static Builder newBuilder() {
    return new AutoValue_GetFileGroupsByFilterRequest.Builder()
        .setIncludeAllGroups(false)
        .setGroupWithNoAccountOnly(false)
        .setPreserveZipDirectories(false);
  }

  /** Builder for {@link GetFileGroupsByFilterRequest}. */
  @AutoValue.Builder
  public abstract static class Builder {
    Builder() {}

    /** Sets the flag whether all groups are included. */
    public abstract Builder setIncludeAllGroups(boolean includeAllGroups);

    /** Sets the flag whether to only return account independent groups. */
    public abstract Builder setGroupWithNoAccountOnly(boolean groupWithNoAccountOnly);

    /**
     * Sets the name of the file group, which is optional. When groupNameOptional is absent, caller
     * must set the includeAllGroups.
     */
    public abstract Builder setGroupNameOptional(Optional<String> groupNameOptional);

    /** Sets the account that is associated with the file group, which is optional. */
    public abstract Builder setAccountOptional(Optional<Account> accountOptional);

    /**
     * By default, MDD will scan the directories generated by unpacking zip files in a download
     * transform and generate a ClientDataFile for each contained file. By default, MDD also hides
     * the root directory. Setting this to true disables that behavior, and will simply return the
     * directories as ClientDataFiles.
     */
    public abstract Builder setPreserveZipDirectories(boolean preserve);

    abstract GetFileGroupsByFilterRequest autoBuild();

    public final GetFileGroupsByFilterRequest build() {
      GetFileGroupsByFilterRequest getFileGroupsByFilterRequest = autoBuild();

      if (getFileGroupsByFilterRequest.includeAllGroups()) {
        checkArgument(!getFileGroupsByFilterRequest.groupNameOptional().isPresent());
        checkArgument(!getFileGroupsByFilterRequest.accountOptional().isPresent());
      } else {
        checkArgument(
            getFileGroupsByFilterRequest.groupNameOptional().isPresent(),
            "Request must provide a group name or source to filter by");
      }

      if (getFileGroupsByFilterRequest.groupWithNoAccountOnly()) {
        checkArgument(!getFileGroupsByFilterRequest.accountOptional().isPresent());
      }

      return getFileGroupsByFilterRequest;
    }
  }
}
