package org.thoughtcrime.securesms.util;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ClipData;
import android.content.Context;
import android.content.Intent;
import androidx.annotation.ColorInt;
import androidx.appcompat.app.AlertDialog;
import android.text.TextPaint;
import android.text.style.URLSpan;
import android.view.View;
import android.widget.Toast;

import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;

import org.thoughtcrime.securesms.ConversationActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.DcHelper;

public class LongClickCopySpan extends URLSpan {
  private static final String PREFIX_MAILTO = "mailto:";
  private static final String PREFIX_TEL = "tel:";

  private boolean isHighlighted;
  @ColorInt
  private int highlightColor;

  public LongClickCopySpan(String url) {
    super(url);
  }

  private void openChat(Activity activity, DcContact contact) {
    DcContext dcContext = DcHelper.getContext(activity);
    int chatId = dcContext.createChatByContactId(contact.getId());
    if (chatId != 0) {
      Intent intent = new Intent(activity, ConversationActivity.class);
      intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId);
      activity.startActivity(intent);
    }
  }

  @Override
  public void onClick(View widget) {
    String url = getURL();
    if (url.startsWith(PREFIX_MAILTO)) {
      try {
        String addr = prepareUrl(url);
        Activity activity = (Activity) widget.getContext();
        DcContext dcContext = DcHelper.getContext(activity);
        DcContact contact = dcContext.getContact(dcContext.createContact(null, addr));
        if (contact.getId()!=0 && dcContext.getChatIdByContactId(contact.getId())!=0) {
          openChat(activity, contact);
        } else {
          new AlertDialog.Builder(activity)
                  .setMessage(activity.getString(R.string.ask_start_chat_with, contact.getNameNAddr()))
                  .setPositiveButton(android.R.string.ok, (dialog, which) -> {
                    openChat(activity, contact);
                  })
                  .setNegativeButton(R.string.cancel, null)
                  .show();
        }
      }
      catch(Exception e) {
        e.printStackTrace();
      }
    }
    else {
      super.onClick(widget);
    }
  }

  void onLongClick(View widget) {
    Context context = widget.getContext();
    String preparedUrl = prepareUrl(getURL());

    new AlertDialog.Builder(context)
        .setTitle(preparedUrl)
        .setItems(new CharSequence[]{
                context.getString(R.string.menu_copy_to_clipboard)
            },
            (dialogInterface, i) -> {
              copyUrl(context, preparedUrl);
              Toast.makeText(context, context.getString(R.string.copied_to_clipboard), Toast.LENGTH_SHORT).show();
            })
        .setNegativeButton(R.string.cancel, null)
        .show();
  }

  @Override
  public void updateDrawState(TextPaint ds) {
    super.updateDrawState(ds);
    ds.bgColor = highlightColor;
    ds.setUnderlineText(!isHighlighted);
  }

  void setHighlighted(boolean highlighted, @ColorInt int highlightColor) {
    this.isHighlighted = highlighted;
    this.highlightColor = highlightColor;
  }

  private void copyUrl(Context context, String url) {
    int sdk = android.os.Build.VERSION.SDK_INT;
    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
      @SuppressWarnings("deprecation") android.text.ClipboardManager clipboard =
              (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
      clipboard.setText(url);
    } else {
      copyUriSdk11(context, url);
    }
  }

  @TargetApi(android.os.Build.VERSION_CODES.HONEYCOMB)
  private void copyUriSdk11(Context context, String url) {
    android.content.ClipboardManager clipboard =
            (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText(context.getString(R.string.app_name), url);
    clipboard.setPrimaryClip(clip);
  }

  private String prepareUrl(String url) {
    if (url.startsWith(PREFIX_MAILTO)) {
      return url.substring(PREFIX_MAILTO.length());
    } else if (url.startsWith(PREFIX_TEL)) {
      return url.substring(PREFIX_TEL.length());
    }
    return url;
  }
}