package com.airbnb.lottie.network;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.airbnb.lottie.utils.Logger;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;

public class DefaultLottieFetchResult implements LottieFetchResult {

  @NonNull
  private final HttpURLConnection connection;

  public DefaultLottieFetchResult(@NonNull HttpURLConnection connection) {
    this.connection = connection;
  }

  @Override public boolean isSuccessful() {
    try {
      return connection.getResponseCode() / 100 == 2;
    } catch (IOException e) {
      return false;
    }
  }

  @NonNull @Override public InputStream bodyByteStream() throws IOException {
    return connection.getInputStream();
  }

  @Nullable @Override public String contentType() {
    return connection.getContentType();
  }

  @Nullable @Override public String error() {
    try {
      return isSuccessful() ? null :
          "Unable to fetch " + connection.getURL() + ". Failed with " + connection.getResponseCode() + "\n" + getErrorFromConnection(connection);
    } catch (IOException e) {
      Logger.warning("get error failed ", e);
      return e.getMessage();
    }
  }

  @Override public void close() {
    connection.disconnect();
  }

  private String getErrorFromConnection(HttpURLConnection connection) throws IOException {
    BufferedReader r = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
    StringBuilder error = new StringBuilder();
    String line;

    try {
      while ((line = r.readLine()) != null) {
        error.append(line).append('\n');
      }
    } finally {
      try {
        r.close();
      } catch (Exception e) {
        // Do nothing.
      }
    }
    return error.toString();
  }
}
