// 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.graph.ProgramDefinition;
import com.android.tools.r8.keepanno.annotations.KeepForApi;
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;

@KeepForApi
public class CheckDiscardDiagnostic implements Diagnostic {

  private final List<String> messages;

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

    @SuppressWarnings("DefaultCharset")
    public Builder addFailedItems(
        List<ProgramDefinition> failed,
        GraphReporter graphReporter,
        WhyAreYouKeepingConsumer whyAreYouKeepingConsumer) {
      for (ProgramDefinition definition : failed) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        whyAreYouKeepingConsumer.printWhyAreYouKeeping(
            graphReporter.getGraphNode(definition.getReference()), new PrintStream(baos));
        messagesBuilder.add(
            "Item "
                + definition.getReference().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;
  }

  public int getNumberOfFailures() {
    return messages.size();
  }

  /** 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 were not discarded");
      messages.forEach(
          message -> {
            builder.append(System.lineSeparator());
            builder.append(message);
          });
    }
    return builder.toString();
  }
}
