package com.android.server.location;

import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;

import java.util.ArrayList;
import java.util.List;

/**
 * Detects blacklist change and updates the blacklist.
 */
class GnssSatelliteBlacklistHelper {

    private static final String TAG = "GnssBlacklistHelper";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
    private static final String BLACKLIST_DELIMITER = ",";

    private final Context mContext;
    private final GnssSatelliteBlacklistCallback mCallback;

    interface GnssSatelliteBlacklistCallback {
        void onUpdateSatelliteBlacklist(int[] constellations, int[] svids);
    }

    GnssSatelliteBlacklistHelper(Context context, Looper looper,
            GnssSatelliteBlacklistCallback callback) {
        mContext = context;
        mCallback = callback;
        ContentObserver contentObserver = new ContentObserver(new Handler(looper)) {
            @Override
            public void onChange(boolean selfChange) {
                updateSatelliteBlacklist();
            }
        };
        mContext.getContentResolver().registerContentObserver(
                Settings.Global.getUriFor(
                        Settings.Global.GNSS_SATELLITE_BLACKLIST),
                true,
                contentObserver, UserHandle.USER_ALL);
    }

    void updateSatelliteBlacklist() {
        ContentResolver resolver = mContext.getContentResolver();
        String blacklist = Settings.Global.getString(
                resolver,
                Settings.Global.GNSS_SATELLITE_BLACKLIST);
        if (blacklist == null) {
            blacklist = "";
        }
        if (DEBUG) {
            Log.d(TAG, String.format("Update GNSS satellite blacklist: %s", blacklist));
        }

        List<Integer> blacklistValues;
        try {
            blacklistValues = parseSatelliteBlacklist(blacklist);
        } catch (NumberFormatException e) {
            Log.e(TAG, "Exception thrown when parsing blacklist string.", e);
            return;
        }

        if (blacklistValues.size() % 2 != 0) {
            Log.e(TAG, "blacklist string has odd number of values."
                    + "Aborting updateSatelliteBlacklist");
            return;
        }

        int length = blacklistValues.size() / 2;
        int[] constellations = new int[length];
        int[] svids = new int[length];
        for (int i = 0; i < length; i++) {
            constellations[i] = blacklistValues.get(i * 2);
            svids[i] = blacklistValues.get(i * 2 + 1);
        }
        mCallback.onUpdateSatelliteBlacklist(constellations, svids);
    }

    @VisibleForTesting
    static List<Integer> parseSatelliteBlacklist(String blacklist) throws NumberFormatException {
        String[] strings = blacklist.split(BLACKLIST_DELIMITER);
        List<Integer> parsed = new ArrayList<>(strings.length);
        for (String string : strings) {
            string = string.trim();
            if (!"".equals(string)) {
                int value = Integer.parseInt(string);
                if (value < 0) {
                    throw new NumberFormatException("Negative value is invalid.");
                }
                parsed.add(value);
            }
        }
        return parsed;
    }
}
