/*
 * Copyright (C) 2016 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.googlecode.android_scripting;

import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.Toast;

public class Log {
  private Log() {
    // Utility class.
  }

  private static String getTag() {
    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    String fullClassName = stackTraceElements[4].getClassName();
    String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
    int lineNumber = stackTraceElements[4].getLineNumber();
    return "sl4a." + className + ":" + lineNumber;
  }

  private static void toast(Context context, String message) {
    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
  }

  public static void notify(Context context, String title, String contentTitle, String message) {
    android.util.Log.v(getTag(), String.format("%s %s", contentTitle, message));

    String packageName = context.getPackageName();
    int iconId = context.getResources().getIdentifier("stat_sys_warning", "drawable", packageName);
    NotificationManager notificationManager =
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification.Builder builder = new Notification.Builder(context);
    builder.setSmallIcon(iconId > 0 ? iconId : -1)
           .setTicker(title)
           .setWhen(0)
           .setContentTitle(contentTitle)
           .setContentText(message)
           .setContentIntent(PendingIntent.getService(context, 0, null, 0));
    Notification note = builder.build();
    note.contentView.getLayoutId();
    notificationManager.notify(NotificationIdFactory.create(), note);
  }

  public static void showDialog(final Context context, final String title, final String message) {
    android.util.Log.v(getTag(), String.format("%s %s", title, message));

    MainThread.run(context, new Runnable() {
      @Override
      public void run() {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title);
        builder.setMessage(message);

        DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
          }
        };
        builder.setPositiveButton("Ok", buttonListener);
        builder.show();
      }
    });
  }

  public static void v(String message) {
    android.util.Log.v(getTag(), message);
  }

  public static void v(String message, Throwable e) {
    android.util.Log.v(getTag(), message, e);
  }

  public static void v(Context context, String message) {
    toast(context, message);
    android.util.Log.v(getTag(), message);
  }

  public static void v(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.v(getTag(), message, e);
  }

  public static void e(Throwable e) {
    android.util.Log.e(getTag(), "Error", e);
  }

  public static void e(String message) {
    android.util.Log.e(getTag(), message);
  }

  public static void e(String message, Throwable e) {
    android.util.Log.e(getTag(), message, e);
  }

  public static void e(Context context, String message) {
    toast(context, message);
    android.util.Log.e(getTag(), message);
  }

  public static void e(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.e(getTag(), message, e);
  }

  public static void w(Throwable e) {
    android.util.Log.w(getTag(), "Warning", e);
  }

  public static void w(String message) {
    android.util.Log.w(getTag(), message);
  }

  public static void w(String message, Throwable e) {
    android.util.Log.w(getTag(), message, e);
  }

  public static void w(Context context, String message) {
    toast(context, message);
    android.util.Log.w(getTag(), message);
  }

  public static void w(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.w(getTag(), message, e);
  }

  public static void d(String message) {
    android.util.Log.d(getTag(), message);
  }

  public static void d(String message, Throwable e) {
    android.util.Log.d(getTag(), message, e);
  }

  public static void d(Context context, String message) {
    toast(context, message);
    android.util.Log.d(getTag(), message);
  }

  public static void d(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.d(getTag(), message, e);
  }

  public static void i(String message) {
    android.util.Log.i(getTag(), message);
  }

  public static void i(String message, Throwable e) {
    android.util.Log.i(getTag(), message, e);
  }

  public static void i(Context context, String message) {
    toast(context, message);
    android.util.Log.i(getTag(), message);
  }

  public static void i(Context context, String message, Throwable e) {
    toast(context, message);
    android.util.Log.i(getTag(), message, e);
  }
}
