// Copyright (c) 2017, 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.apiusagesample;

import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.errors.InterfaceDesugarMissingTypeDiagnostic;
import com.android.tools.r8.origin.ArchiveEntryOrigin;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.position.Position;
import com.android.tools.r8.position.TextPosition;
import com.android.tools.r8.position.TextRange;
import java.nio.file.Files;
import java.nio.file.Path;

class D8DiagnosticsHandler implements DiagnosticsHandler {

  public D8DiagnosticsHandler() {
  }

  public static Origin getOrigin(Path root, Path entry) {
    if (Files.isRegularFile(root)) {
      return new ArchiveEntryOrigin(entry.toString(), new PathOrigin(root));
    } else {
      return new PathOrigin(root.resolve(entry.toString()));
    }
  }

  @Override
  public void error(Diagnostic error) {
    convertToMessage(error);
  }

  @Override
  public void warning(Diagnostic warning) {
    if (warning instanceof InterfaceDesugarMissingTypeDiagnostic) {
      desugarInterfaceMethodInfo((InterfaceDesugarMissingTypeDiagnostic) warning);
    } else {
      convertToMessage(warning);
    }
  }

  @Override
  public void info(Diagnostic info) {
    convertToMessage(info);
  }

  void desugarInterfaceMethodInfo(InterfaceDesugarMissingTypeDiagnostic info) {
    System.out.println("desugar is missing: " + info.getMissingType().toString());
    System.out.println("  used from: " + info.getContextType().toString());
    convertToMessage(info);
  }

  protected void convertToMessage(Diagnostic diagnostic) {
    String textMessage = diagnostic.getDiagnosticMessage();

    Origin origin = diagnostic.getOrigin();
    Position positionInOrigin = diagnostic.getPosition();
    String position;
    if (origin instanceof PathOrigin) {
      Path originFile = ((PathOrigin) origin).getPath();
      if (positionInOrigin instanceof TextRange) {
        TextRange textRange = (TextRange) positionInOrigin;
        position = originFile + ": "
            + textRange.getStart().getLine() + "," + textRange.getStart().getColumn()
            + " - " + textRange.getEnd().getLine() + "," + textRange.getEnd().getColumn();
      } else if (positionInOrigin instanceof TextPosition) {
        TextPosition textPosition = (TextPosition) positionInOrigin;
        position = originFile + ": "
            + textPosition.getLine() + "," + textPosition.getColumn();
      } else {
        position = originFile.toString();
      }
    } else if (origin.parent() instanceof PathOrigin) {
      Path originFile = ((PathOrigin) origin.parent()).getPath();
      position = originFile.toString();
    } else {
      position = "UNKNOWN";
      if (origin != Origin.unknown()) {
        textMessage = origin.toString() + ": " + textMessage;
      }
    }

    System.out.println(position + ": " + textMessage);
  }
}
