/*
	Copyright 2012 to 2021 TeamWin
	This file is part of TWRP/TeamWin Recovery Project.

	TWRP 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.

	TWRP 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 TWRP.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef _DATAMANAGER_HPP_HEADER
#define _DATAMANAGER_HPP_HEADER

#include <string>
#include <pthread.h>
#include "infomanager.hpp"

using namespace std;

class DataManager
{
public:
	static int ResetDefaults();
	static int LoadValues(const string& filename);
	static int LoadPersistValues(void);
	static int Flush();
	static void LoadTWRPFolderInfo(void);

	// Core get routines
	static int GetValue(const string& varName, string& value);
	static int GetValue(const string& varName, int& value);
	static int GetValue(const string& varName, float& value);
	static int GetValue(const string& varName, unsigned long long& value);

	// Helper functions
	static string GetStrValue(const string& varName);
	static int GetIntValue(const string& varName);

	// Core set routines
	static int SetValue(const string& varName, const string& value, const int persist = 0);
	static int SetValue(const string& varName, const int value, const int persist = 0);
	static int SetValue(const string& varName, const float value, const int persist = 0);
	static int SetValue(const string& varName, const unsigned long long& value, const int persist = 0);
	static int SetProgress(const float Fraction);
	static int _SetProgress(float Fraction);
	static int ShowProgress(float Portion, const float Seconds);

	static void DumpValues();
	static void update_tz_environment_variables();
	static void Vibrate(const string& varName);
	static void SetBackupFolder();
	static void SetDefaultValues();
	static void Output_Version(void); // Outputs the version to a file in the TWRP folder
	static void ReadSettingsFile(void);

	static string GetCurrentStoragePath(void);
	static string GetSettingsStoragePath(void);

public:
	static string mBackingFile;

protected:
	static int mInitialized;
	static InfoManager mPersist;
	static InfoManager mData;
	static InfoManager mConst;

	static map<string, string> mConstValues;

protected:
	static int SaveValues();

	static int GetMagicValue(const string& varName, string& value);

private:
	static void sanitize_device_id(char* device_id);
	static void get_device_id(void);

	static pthread_mutex_t m_valuesLock;
};

#endif // _DATAMANAGER_HPP_HEADER

