// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.errors;

import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.Keep;
import com.android.tools.r8.graph.DexDefinition;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
import com.android.tools.r8.shaking.GraphReporter;
import com.android.tools.r8.shaking.WhyAreYouKeepingConsumer;
import com.google.common.collect.ImmutableList;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.List;

@Keep
public class CheckDiscardDiagnostic implements Diagnostic {

  private final List<String> messages;

  public static class Builder {
    private ImmutableList.Builder<String> messagesBuilder = ImmutableList.builder();

    public Builder addFailedItems(
        List<DexDefinition> failed,
        GraphReporter graphReporter,
        WhyAreYouKeepingConsumer whyAreYouKeepingConsumer) {
      for (DexDefinition definition : failed) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        whyAreYouKeepingConsumer.printWhyAreYouKeeping(
            graphReporter.getGraphNode(definition.toReference()), new PrintStream(baos));
        messagesBuilder.add(
            "Item " + definition.toSourceString() + " was not discarded.\n" + baos.toString());
      }
      return this;
    }

    public CheckDiscardDiagnostic build() {
      return new CheckDiscardDiagnostic(messagesBuilder.build());
    }
  }

  private CheckDiscardDiagnostic(List<String> messages) {
    this.messages = messages;
  }

  /** The origin of a -checkdiscarded failure is not unique. (The whole app is to blame.) */
  @Override
  public Origin getOrigin() {
    return Origin.unknown();
  }

  /** The position of a -checkdiscarded failure is always unknown. */
  @Override
  public Position getPosition() {
    return Position.UNKNOWN;
  }

  @Override
  public String getDiagnosticMessage() {
    StringBuilder builder = new StringBuilder("Discard checks failed.");
    if (messages.size() > 0) {
      builder.append(System.lineSeparator());
      builder.append("The following items where not discarded");
      messages.forEach(
          message -> {
            builder.append(System.lineSeparator());
            builder.append(message);
          });
    }
    return builder.toString();
  }
}
