package com.automattic.simplenote.utils;

/*
 *  misc. string utilities
 *  added 01-Apr-2013 by Nick Bradbury
 */

import static androidx.core.util.PatternsCompat.EMAIL_ADDRESS;

import android.text.Spanned;
import android.text.TextUtils;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

@SuppressWarnings("unused")
public class StrUtils {
    public static final String SPACE_STRING = " ";

    // suppress default constructor for non-instantiability
    private StrUtils() {
        throw new AssertionError();
    }

    public static boolean isEmail(String str) {
        return !TextUtils.isEmpty(str) && EMAIL_ADDRESS.matcher(str).matches();
    }

    // returns true if the passed string is null or empty
    public static boolean isBlankStr(String str) {
        return (str == null || str.length() == 0);
    }

    // returns true if the passed string is null, empty or nothing but whitespace
    public static boolean isBlankTrimStr(String str) {
        return (str == null) || (str.length() == 0) || (str.trim().length() == 0);
    }

    // returns "" if the passed string is null, otherwise returns the passed string
    public static String notNullStr(final String value) {
        if (value == null)
            return "";
        return value;
    }

    // exception-less conversion of string to int
    public static int strToInt(final String value) {
        return strToInt(value, 0);
    }

    public static int strToInt(String value, int defaultInt) {
        if (value == null)
            return defaultInt;
        try {
            return Integer.valueOf(value);
        } catch (NumberFormatException e) {
            return defaultInt;
        }
    }

    // exception-less conversion of string to long
    public static long strToLong(final String value) {
        return strToLong(value, 0);
    }

    public static long strToLong(String value, long defaultLong) {
        if (value == null)
            return defaultLong;
        try {
            return Long.valueOf(value);
        } catch (NumberFormatException e) {
            return defaultLong;
        }
    }

    // exception-less conversion of string to float
    public static float strToFloat(String value) {
        return strToFloat(value, 0f);
    }

    public static float strToFloat(String value, float defaultFloat) {
        if (value == null)
            return defaultFloat;
        try {
            return Float.valueOf(value);
        } catch (NumberFormatException e) {
            return defaultFloat;
        }
    }

    public static String urlEncode(final String text) {
        try {
            return URLEncoder.encode(text, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // should never get here
            return "";
        }
    }

    public static String urlDecode(final String text) {
        try {
            return URLDecoder.decode(text, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // should never get here
            return "";
        }
    }

    // returns true if passed strings are the same, handles null so caller can skip null check before comparison
    public static boolean isSameStr(String s1, String s2) {
        if (s1 == null || s2 == null)
            return (s1 == null && s2 == null);
        return s1.equals(s2);
    }

    // removes html from the passed string
    public static String stripHtml(final String html) {
        if (html == null)
            return "";

        // HtmlCompat.fromHtml().toString() is not high-performance, so skip whenever possible
        if (!html.contains("<") && !html.contains("&"))
            return html;

        // http://stackoverflow.com/a/7389663/1673548
        return HtmlCompat.fromHtml(html).toString().trim();
    }

    public static Spanned setTextToUpperCaseAndBold(String originalString) {
        if (TextUtils.isEmpty(originalString)) {
            return HtmlCompat.fromHtml("");
        }

        return HtmlCompat.fromHtml("<strong>" + originalString.toUpperCase() + "</strong>");
    }
}
