// 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.getReference()), 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();
  }
}
