/*
 * Copyright 2016 The Bazel Authors. All rights reserved.
 *
 * 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.idea.blaze.base.ideinfo;

import com.google.common.collect.ImmutableList;
import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;

import java.io.Serializable;

/**
 * Sister class to {@link JavaRuleIdeInfo}
 */
public class CRuleIdeInfo implements Serializable {
  private static final long serialVersionUID = 6L;

  public final ImmutableList<ArtifactLocation> sources;

  // From the cpp compilation context provider. These should all be for the entire transitive closure.
  public final ImmutableList<ExecutionRootPath> transitiveIncludeDirectories;
  public final ImmutableList<ExecutionRootPath> transitiveQuoteIncludeDirectories;
  public final ImmutableList<String> transitiveDefines;
  public final ImmutableList<ExecutionRootPath> transitiveSystemIncludeDirectories;

  public CRuleIdeInfo(
    ImmutableList<ArtifactLocation> sources,
    ImmutableList<ExecutionRootPath> transitiveIncludeDirectories,
    ImmutableList<ExecutionRootPath> transitiveQuoteIncludeDirectories,
    ImmutableList<String> transitiveDefines,
    ImmutableList<ExecutionRootPath> transitiveSystemIncludeDirectories
  ) {
    this.sources = sources;
    this.transitiveIncludeDirectories = transitiveIncludeDirectories;
    this.transitiveQuoteIncludeDirectories = transitiveQuoteIncludeDirectories;
    this.transitiveDefines = transitiveDefines;
    this.transitiveSystemIncludeDirectories = transitiveSystemIncludeDirectories;
  }

  public static Builder builder() {
    return new Builder();
  }

  public static class Builder {
    private final ImmutableList.Builder<ArtifactLocation> sources = ImmutableList.builder();

    private final ImmutableList.Builder<ExecutionRootPath> transitiveIncludeDirectories = ImmutableList.builder();
    private final ImmutableList.Builder<ExecutionRootPath> transitiveQuoteIncludeDirectories = ImmutableList.builder();
    private final ImmutableList.Builder<String> transitiveDefines = ImmutableList.builder();
    private final ImmutableList.Builder<ExecutionRootPath> transitiveSystemIncludeDirectories = ImmutableList.builder();

    public Builder addSources(Iterable<ArtifactLocation> sources) {
      this.sources.addAll(sources);
      return this;
    }

    public Builder addTransitiveIncludeDirectories(Iterable<ExecutionRootPath> transitiveIncludeDirectories) {
      this.transitiveIncludeDirectories.addAll(transitiveIncludeDirectories);
      return this;
    }

    public Builder addTransitiveQuoteIncludeDirectories(Iterable<ExecutionRootPath> transitiveQuoteIncludeDirectories) {
      this.transitiveQuoteIncludeDirectories.addAll(transitiveQuoteIncludeDirectories);
      return this;
    }

    public Builder addTransitiveDefines(Iterable<String> transitiveDefines) {
      this.transitiveDefines.addAll(transitiveDefines);
      return this;
    }

    public Builder addTransitiveSystemIncludeDirectories(Iterable<ExecutionRootPath> transitiveSystemIncludeDirectories) {
      this.transitiveSystemIncludeDirectories.addAll(transitiveSystemIncludeDirectories);
      return this;
    }

    public CRuleIdeInfo build() {
      return new CRuleIdeInfo(
        sources.build(),
        transitiveIncludeDirectories.build(),
        transitiveQuoteIncludeDirectories.build(),
        transitiveDefines.build(),
        transitiveSystemIncludeDirectories.build()
      );
    }
  }

  @Override
  public String toString() {
    return "CRuleIdeInfo{" + "\n" +
           "  sources=" + sources + "\n" +
           "  transitiveIncludeDirectories=" + transitiveIncludeDirectories + "\n" +
           "  transitiveQuoteIncludeDirectories=" + transitiveQuoteIncludeDirectories + "\n" +
           "  transitiveDefines=" + transitiveDefines + "\n" +
           "  transitiveSystemIncludeDirectories=" + transitiveSystemIncludeDirectories + "\n" +
           '}';
  }
}
