/*
 *  Copyright (C) 2004-2020 Savoir-faire Linux Inc.
 *
 *  Author: Thibault Wittemberg <thibault.wittemberg@savoirfairelinux.com>
 *  Author: Adrien Beraud <adrien.beraud@savoirfairelinux.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
package cx.ring.services;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.text.TextUtils;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.preference.PreferenceManager;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.inject.Inject;

import cx.ring.R;
import cx.ring.application.JamiApplication;
import cx.ring.model.Settings;
import cx.ring.utils.DeviceUtils;
import cx.ring.utils.NetworkUtils;

public class SharedPreferencesServiceImpl extends PreferencesService {

    public static final String PREFS_SETTINGS = "ring_settings";
    private static final String PREFS_REQUESTS = "ring_requests";
    public static final String PREFS_THEME = "theme";
    public static final String PREFS_VIDEO = "videoPrefs";
    public static final String PREFS_ACCOUNT = "account_";

    private static final String PREF_PUSH_NOTIFICATIONS = "push_notifs";
    private static final String PREF_PERSISTENT_NOTIFICATION = "persistent_notif";
    private static final String PREF_SHOW_TYPING = "persistent_typing";
    private static final String PREF_SHOW_READ = "persistent_read";
    private static final String PREF_BLOCK_RECORD = "persistent_block_record";
    private static final String PREF_HW_ENCODING = "video_hwenc";
    public static final String PREF_BITRATE = "video_bitrate";
    public static final String PREF_RESOLUTION = "video_resolution";
    private static final String PREF_SYSTEM_CONTACTS = "system_contacts";
    private static final String PREF_PLACE_CALLS = "place_calls";
    private static final String PREF_ON_STARTUP = "on_startup";
    public static final String PREF_DARK_MODE= "darkMode";
    private  static final String PREF_ACCEPT_IN_MAX_SIZE = "acceptIncomingFilesMaxSize";
    public static final String PREF_PLUGINS = "plugins";
    private final Map<String, Set<String>> mNotifiedRequests = new HashMap<>();

    @Inject
    protected Context mContext;

    @Override
    protected void saveSettings(Settings settings) {
        SharedPreferences appPrefs = getPreferences();
        SharedPreferences.Editor edit = appPrefs.edit();
        edit.clear();
        edit.putBoolean(PREF_SYSTEM_CONTACTS, settings.isAllowSystemContacts());
        edit.putBoolean(PREF_PLACE_CALLS, settings.isAllowPlaceSystemCalls());
        edit.putBoolean(PREF_ON_STARTUP, settings.isAllowOnStartup());
        edit.putBoolean(PREF_PUSH_NOTIFICATIONS, settings.isAllowPushNotifications());
        edit.putBoolean(PREF_PERSISTENT_NOTIFICATION, settings.isAllowPersistentNotification());
        edit.putBoolean(PREF_SHOW_TYPING, settings.isAllowTypingIndicator());
        edit.putBoolean(PREF_SHOW_READ, settings.isAllowReadIndicator());
        edit.putBoolean(PREF_BLOCK_RECORD, settings.isRecordingBlocked());
        edit.apply();
    }

    @Override
    protected Settings loadSettings() {
        SharedPreferences appPrefs = getPreferences();
        Settings settings = getUserSettings();
        if (settings == null) {
            settings = new Settings();
        }
        settings.setAllowSystemContacts(appPrefs.getBoolean(PREF_SYSTEM_CONTACTS, false));
        settings.setAllowPlaceSystemCalls(appPrefs.getBoolean(PREF_PLACE_CALLS, false));
        settings.setAllowRingOnStartup(appPrefs.getBoolean(PREF_ON_STARTUP, true));
        settings.setAllowPushNotifications(appPrefs.getBoolean(PREF_PUSH_NOTIFICATIONS, false));
        settings.setAllowPersistentNotification(appPrefs.getBoolean(PREF_PERSISTENT_NOTIFICATION, false));
        settings.setAllowTypingIndicator(appPrefs.getBoolean(PREF_SHOW_TYPING, true));
        settings.setAllowReadIndicator(appPrefs.getBoolean(PREF_SHOW_READ, true));
        settings.setBlockRecordIndicator(appPrefs.getBoolean(PREF_BLOCK_RECORD, false));
        return settings;
    }

    private void saveRequests(String accountId, Set<String> requests) {
        SharedPreferences preferences = mContext.getSharedPreferences(PREFS_REQUESTS, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = preferences.edit();
        edit.putStringSet(accountId, requests);
        edit.apply();
    }

    @Override
    public void saveRequestPreferences(String accountId, String contactId) {
        Set<String> requests = loadRequestsPreferences(accountId);
        requests.add(contactId);
        saveRequests(accountId, requests);
    }

    @Override
    @NonNull
    public Set<String> loadRequestsPreferences(@NonNull String accountId) {
        Set<String> requests = mNotifiedRequests.get(accountId);
        if (requests == null) {
            SharedPreferences preferences = mContext.getSharedPreferences(PREFS_REQUESTS, Context.MODE_PRIVATE);
            requests = new HashSet<>(preferences.getStringSet(accountId, new HashSet<>()));
            mNotifiedRequests.put(accountId, requests);
        }
        return requests;
    }

    @Override
    public void removeRequestPreferences(String accountId, String contactId) {
        Set<String> requests = loadRequestsPreferences(accountId);
        requests.remove(contactId);
        saveRequests(accountId, requests);
    }

    @Override
    public boolean hasNetworkConnected() {
        return NetworkUtils.isConnectivityAllowed(mContext);
    }

    @Override
    public boolean isPushAllowed() {
        String token = JamiApplication.getInstance().getPushToken();
        return getSettings().isAllowPushNotifications() && !TextUtils.isEmpty(token) /*&& NetworkUtils.isPushAllowed(mContext, getSettings().isAllowMobileData())*/;
    }

    @Override
    public int getResolution() {
        return Integer.parseInt(getVideoPreferences().getString(PREF_RESOLUTION,
                DeviceUtils.isTv(mContext)
                        ? mContext.getString(R.string.video_resolution_default_tv)
                        : mContext.getString(R.string.video_resolution_default)));
    }

    @Override
    public int getBitrate() {
        return Integer.parseInt(getVideoPreferences().getString(PREF_BITRATE, mContext.getString(R.string.video_bitrate_default)));
    }

    @Override
    public boolean isHardwareAccelerationEnabled() {
        return getVideoPreferences().getBoolean(PREF_HW_ENCODING, true);
    }

    @Override
    public void setDarkMode(boolean enabled) {
        SharedPreferences.Editor edit = getThemePreferences().edit();
        edit.putBoolean(PREF_DARK_MODE, enabled)
                .apply();
        applyDarkMode(enabled);
    }

    @Override
    public boolean getDarkMode() {
        return getThemePreferences().getBoolean(PREF_DARK_MODE, false);
    }

    @Override
    public void loadDarkMode() {
        applyDarkMode(getDarkMode());
    }

    @Override
    public int getMaxFileAutoAccept(String accountId) {
        return mContext.getSharedPreferences(PREFS_ACCOUNT+accountId, Context.MODE_PRIVATE)
                .getInt(PREF_ACCEPT_IN_MAX_SIZE, 30) * 1024 * 1024;
	}

    private void applyDarkMode(boolean enabled) {
        AppCompatDelegate.setDefaultNightMode(
                enabled ? AppCompatDelegate.MODE_NIGHT_YES
                        : Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
                            ? AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
                            : AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
    }

    private SharedPreferences getPreferences() {
        return mContext.getSharedPreferences(PREFS_SETTINGS, Context.MODE_PRIVATE);
    }

    private SharedPreferences getVideoPreferences() {
        return mContext.getSharedPreferences(PREFS_VIDEO, Context.MODE_PRIVATE);
    }

    private SharedPreferences getThemePreferences() {
        return PreferenceManager.getDefaultSharedPreferences(mContext);
    }
}
