/*
 * Copyright 2014-present Facebook, Inc.
 *
 *  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.facebook.buck.rules;

import com.facebook.buck.util.immutables.BuckStyleImmutable;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;

import org.immutables.value.Value;

import java.nio.file.Path;

@Value.Immutable
@Value.Nested
@BuckStyleImmutable
public abstract class ExopackageInfo {

  @Value.Immutable
  @BuckStyleImmutable
  public static interface DexInfo {
    @Value.Parameter
    Path getMetadata();
    @Value.Parameter
    Path getDirectory();
  }

  @Value.Immutable
  @BuckStyleImmutable
  public static interface NativeLibsInfo {
    @Value.Parameter
    Path getMetadata();
    @Value.Parameter
    Path getDirectory();
  }

  public abstract Optional<DexInfo> getDexInfo();
  public abstract Optional<NativeLibsInfo> getNativeLibsInfo();

  @Value.Check
  protected void check() {
    Preconditions.checkArgument(
        getDexInfo().isPresent() || getNativeLibsInfo().isPresent(),
        "ExopackageInfo must either have secondary dexes or native libraries to install.");
  }
}
