package org.schabi.newpipe.about;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.webkit.WebView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;

import org.schabi.newpipe.R;
import org.schabi.newpipe.util.ThemeHelper;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.ref.WeakReference;
import java.nio.charset.StandardCharsets;

import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;

public class LicenseFragmentHelper extends AsyncTask<Object, Void, Integer> {
    private final WeakReference<Activity> weakReference;
    private License license;

    public LicenseFragmentHelper(@Nullable final Activity activity) {
        weakReference = new WeakReference<>(activity);
    }

    private static String getFinishString(final Activity activity) {
        return activity.getApplicationContext().getResources().getString(R.string.finish);
    }

    /**
     * @param context the context to use
     * @param license the license
     * @return String which contains a HTML formatted license page
     * styled according to the context's theme
     */
    public static String getFormattedLicense(final Context context, final License license) {
        if (context == null) {
            throw new NullPointerException("context is null");
        }
        if (license == null) {
            throw new NullPointerException("license is null");
        }

        StringBuilder licenseContent = new StringBuilder();
        String webViewData;
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    context.getAssets().open(license.getFilename()), StandardCharsets.UTF_8));
            String str;
            while ((str = in.readLine()) != null) {
                licenseContent.append(str);
            }
            in.close();

            // split the HTML file and insert the stylesheet into the HEAD of the file
            String[] insert = licenseContent.toString().split("</head>");
            webViewData = insert[0] + "<style type=\"text/css\">"
                    + getLicenseStylesheet(context) + "</style></head>"
                    + insert[1];
        } catch (Exception e) {
            throw new NullPointerException("could not get license file:"
                    + getLicenseStylesheet(context));
        }
        return webViewData;
    }

    /**
     * @param context
     * @return String which is a CSS stylesheet according to the context's theme
     */
    public static String getLicenseStylesheet(final Context context) {
        boolean isLightTheme = ThemeHelper.isLightThemeSelected(context);
        return "body{padding:12px 15px;margin:0;background:#"
                + getHexRGBColor(context, isLightTheme
                ? R.color.light_license_background_color
                : R.color.dark_license_background_color)
                + ";color:#"
                + getHexRGBColor(context, isLightTheme
                ? R.color.light_license_text_color
                : R.color.dark_license_text_color) + ";}"
                + "a[href]{color:#"
                + getHexRGBColor(context, isLightTheme
                ? R.color.light_youtube_primary_color
                : R.color.dark_youtube_primary_color) + ";}"
                + "pre{white-space: pre-wrap;}";
    }

    /**
     * Cast R.color to a hexadecimal color value.
     *
     * @param context the context to use
     * @param color   the color number from R.color
     * @return a six characters long String with hexadecimal RGB values
     */
    public static String getHexRGBColor(final Context context, final int color) {
        return context.getResources().getString(color).substring(3);
    }

    @Nullable
    private Activity getActivity() {
        Activity activity = weakReference.get();

        if (activity != null && activity.isFinishing()) {
            return null;
        } else {
            return activity;
        }
    }

    @Override
    protected Integer doInBackground(final Object... objects) {
        license = (License) objects[0];
        return 1;
    }

    @Override
    protected void onPostExecute(final Integer result) {
        Activity activity = getActivity();
        if (activity == null) {
            return;
        }

        String webViewData = getFormattedLicense(activity, license);
        AlertDialog.Builder alert = new AlertDialog.Builder(activity);
        alert.setTitle(license.getName());

        WebView wv = new WebView(activity);
        wv.loadData(webViewData, "text/html; charset=UTF-8", null);

        alert.setView(wv);
        assureCorrectAppLanguage(activity.getApplicationContext());
        alert.setNegativeButton(getFinishString(activity), (dialog, which) -> dialog.dismiss());
        alert.show();
    }

}
