package com.termux.shared.net.url;

import androidx.annotation.Nullable;
import com.termux.shared.data.DataUtils;
import com.termux.shared.logger.Logger;
import java.net.MalformedURLException;
import java.net.URL;

public class UrlUtils {

    /**
     * The parts of a {@link URL}.
     */
    public enum UrlPart {

        AUTHORITY,
        FILE,
        HOST,
        REF,
        FRAGMENT,
        PATH,
        PORT,
        PROTOCOL,
        QUERY,
        USER_INFO
    }

    private static final String LOG_TAG = "UrlUtils";

    /**
     * Join a url base and destination.
     *
     * @param base The base url to open.
     * @param destination The destination url to open.
     * @param logError If an error message should be logged.
     * @return Returns the joined {@link String} Url, otherwise {@code null}.
     */
    @Nullable
    public static String joinUrl(final String base, String destination, boolean logError) {
        if (DataUtils.isNullOrEmpty(base))
            return null;
        try {
            return new URL(new URL(base), destination).toString();
        } catch (MalformedURLException e) {
            if (logError)
                Logger.logError(LOG_TAG, "Failed to join url base \"" + base + "\" and destination \"" + destination + "\": " + e.getMessage());
            return null;
        }
    }

    /**
     * Get {@link URL} from url string.
     *
     * @param urlString The urlString string.
     * @return Returns the {@link URL} if a valid urlString, otherwise {@code null}.
     */
    @Nullable
    public static URL getUrl(String urlString) {
        if (DataUtils.isNullOrEmpty(urlString))
            return null;
        try {
            return new URL(urlString);
        } catch (MalformedURLException e) {
            return null;
        }
    }

    /**
     * Get a {@link URL} part from url string.
     *
     * @param urlString The urlString string.
     * @param urlPart The part to get.
     * @return Returns the {@link URL} part if a valid urlString and part, otherwise {@code null}.
     */
    @Nullable
    public static String getUrlPart(String urlString, UrlPart urlPart) {
        URL url = getUrl(urlString);
        if (url == null)
            return null;
        switch(urlPart) {
            case AUTHORITY:
                return url.getAuthority();
            case FILE:
                return url.getFile();
            case HOST:
                return url.getHost();
            case REF:
            case FRAGMENT:
                return url.getRef();
            case PATH:
                return url.getPath();
            case PORT:
                return String.valueOf(url.getPort());
            case PROTOCOL:
                return url.getProtocol();
            case QUERY:
                return url.getQuery();
            case USER_INFO:
                return url.getUserInfo();
            default:
                return null;
        }
    }

    /**
     * Remove "https://www.", "https://", "www.", etc
     */
    public static String removeProtocol(String urlString) {
        if (urlString == null)
            return null;
        return urlString.replaceFirst("^(http[s]?://www\\.|http[s]?://|www\\.)", "");
    }

    public static boolean areUrlsEqual(String url1, String url2) {
        if (url1 == null && url2 == null)
            return true;
        if (url1 == null || url2 == null)
            return false;
        return UrlUtils.removeProtocol(url1).replaceAll("/+$", "").equals(UrlUtils.removeProtocol(url2).replaceAll("/+$", ""));
    }
}
