/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.localepicker;

import android.content.Context;
import android.content.SharedPreferences;

import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;

import com.android.settingslib.datastore.SharedPreferencesStorage;

import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

/**
 * A data manager that manages the {@link SharedPreferences} for the locale notification
 * information.
 */
public class LocaleNotificationDataManager {
    public static final String LOCALE_NOTIFICATION = "locale_notification";
    private Context mContext;

    /**
     * Constructor
     *
     * @param context The context
     */
    public LocaleNotificationDataManager(Context context) {
        this.mContext = context;
    }

    /** Returns the underlying {@link SharedPreferences} storage. */
    @NonNull
    public static SharedPreferencesStorage getSharedPreferencesStorage(@NonNull Context context) {
        return new SharedPreferencesStorage(context, LOCALE_NOTIFICATION, Context.MODE_PRIVATE);
    }

    private static SharedPreferences getSharedPreferences(Context context) {
        return context.getSharedPreferences(LOCALE_NOTIFICATION, Context.MODE_PRIVATE);
    }

    /**
     * Adds one entry with the corresponding locale and {@link NotificationInfo} to the
     * {@link SharedPreferences}.
     *
     * @param locale A locale which the application sets to
     * @param info   The notification metadata
     */
    public void putNotificationInfo(String locale, NotificationInfo info) {
        Gson gson = new Gson();
        String json = gson.toJson(info);
        SharedPreferences.Editor editor = getSharedPreferences(mContext).edit();
        editor.putString(locale, json);
        editor.apply();
    }

    /**
     * Removes one entry with the corresponding locale from the {@link SharedPreferences}.
     *
     * @param locale A locale which the application sets to
     */
    public void removeNotificationInfo(String locale) {
        SharedPreferences.Editor editor = getSharedPreferences(mContext).edit();
        editor.remove(locale);
        editor.apply();
    }

    /**
     * Gets the {@link NotificationInfo} with the associated locale from the
     * {@link SharedPreferences}.
     *
     * @param locale A locale which the application sets to
     * @return {@link NotificationInfo}
     */
    public NotificationInfo getNotificationInfo(String locale) {
        Gson gson = new Gson();
        String json = getSharedPreferences(mContext).getString(locale, "");
        return json.isEmpty() ? null : gson.fromJson(json, NotificationInfo.class);
    }

    /**
     * Gets the locale notification map.
     *
     * @return A map which maps the locale to the corresponding {@link NotificationInfo}
     */
    public Map<String, NotificationInfo> getLocaleNotificationInfoMap() {
        Gson gson = new Gson();
        Map<String, String> map = (Map<String, String>) getSharedPreferences(mContext).getAll();
        Map<String, NotificationInfo> result = new HashMap<>(map.size());
        map.forEach((key, value) -> {
            result.put(key, gson.fromJson(value, NotificationInfo.class));
        });
        return result;
    }

    /**
     * Clears the locale notification map.
     */
    @VisibleForTesting
    void clearLocaleNotificationMap() {
        getSharedPreferences(mContext).edit().clear().apply();
    }
}
