// 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.r8.utils;

import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.position.Position;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.FileSystemException;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;

public class IOExceptionDiagnostic extends DiagnosticWithThrowable {

  private final Origin origin;
  private final String message;

  public IOExceptionDiagnostic(IOException e) {
    super(e);
    origin = extractOrigin(e);
    message = extractMessage(e);
  }

  public IOExceptionDiagnostic(IOException e, Origin origin) {
    super(e);
    this.origin = origin;
    message = extractMessage(e);
  }

  private static String extractMessage(IOException e) {
    String message = e.getMessage();
    if (message == null || message.isEmpty()) {
      if (e instanceof NoSuchFileException || e instanceof FileNotFoundException) {
        message = "File not found";
      } else if (e instanceof FileAlreadyExistsException) {
        message = "File already exists";
      }
    }
    return message;
  }

  private static Origin extractOrigin(IOException e) {
    Origin origin = Origin.unknown();

    if (e instanceof FileSystemException) {
      FileSystemException fse = (FileSystemException) e;
      if (fse.getFile() != null && !fse.getFile().isEmpty()) {
        origin = new PathOrigin(Paths.get(fse.getFile()));
      }
    }
    return origin;
  }

  @Override
  public Origin getOrigin() {
    return origin;
  }

  @Override
  public Position getPosition() {
    return Position.UNKNOWN;
  }

  @Override
  public String getDiagnosticMessage() {
    return message;
  }

}
