//===========================================
//  Lumina-DE source code
//  Copyright (c) 2014-16, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
//  This is the main interface for any OS-specific system calls
//    To port Lumina to a different operating system, just create a file 
//    called "LuminaOS-<Operating System>.cpp", and use that file in 
//    the project (libLumina.pro) instead of LuminaOS-FreeBSD.cpp
//===========================================
#ifndef _LUMINA_LIBRARY_OS_H
#define _LUMINA_LIBRARY_OS_H

#include <QString>
#include <QStringList>
#include <QProcess>
#include <QDir>
#include <QObject>

#include "LUtils.h"

class LOS{
public:
	//Return the name of the OS being used
	static QString OSName(); 

	//OS-specific prefix(s)
	static QString LuminaShare(); //Install dir for Lumina share files
	static QString AppPrefix(); //Prefix for applications (/usr/local/ on FreeBSD)
	static QString SysPrefix(); //Prefix for system (/usr/ on FreeBSD)

	//OS-specific application shortcuts (*.desktop files)
	static QString ControlPanelShortcut();
	static QString AppStoreShortcut();

	//OS-specific RSS feeds 
	static QStringList RSSFeeds(); //Return Format: QStringList[ <name>::::<url> ];

	//Scan for mounted external devices
	static QStringList ExternalDevicePaths(); //Returns: QStringList[<type>::::<filesystem>::::<path>]
	  //Note: <type> = [USB, HDRIVE, DVD, SDCARD, UNKNOWN]

	//Read screen brightness information
	static int ScreenBrightness(); //Returns: Screen Brightness as a percentage (0-100, with -1 for errors)
	//Set screen brightness
	static void setScreenBrightness(int percent);

	//Read the current volume
	static int audioVolume(); //Returns: audio volume as a percentage (0-100, with -1 for errors)
	//Set the current volume
	static void setAudioVolume(int percent);
	//Modify the current volume by a set amount (+ or -)
	static void changeAudioVolume(int percentdiff);

	//Check if a graphical audio mixer is installed
	static bool hasMixerUtility();
	//Launch the graphical audio mixer utility
	static void startMixerUtility();

	//Check for user system permission (shutdown/restart)
	static bool userHasShutdownAccess();
	static bool systemPerformingUpdates();
	static QString systemPendingUpdates(); //returns nothing if no updates waiting to install at shutdown

	//System Shutdown
	static void systemShutdown(bool skipupdates = false); //start poweroff sequence
	//System Restart
	static void systemRestart(bool skipupdates = false); //start reboot sequence
	//Check for suspend support
	static bool systemCanSuspend();
	//Put the system into the suspend state
	static void systemSuspend();


	//Battery Availability
	static bool hasBattery();
	//Battery Charge Level
	static int batteryCharge(); //Returns: percent charge (0-100), anything outside that range is counted as an error
	//Battery Charging State
	static bool batteryIsCharging();
	//Battery Time Remaining
	static int batterySecondsLeft(); //Returns: estimated number of seconds remaining
	
	//Get the checksum for a file
	static QStringList Checksums(QStringList filepaths); //Return: checksum of each input file (same order)
	
	//Get the filesystem capacity
	static QString FileSystemCapacity(QString dir) ; //Return: percentage capacity as give by the df command
	
	//System CPU Information
	static QStringList CPUTemperatures(); //Returns: List containing the temperature of any CPU's ("50C" for example)
	static int CPUUsagePercent(); //Returns: Overall percentage of the amount of CPU cycles in use (-1 for errors)
	static int MemoryUsagePercent(); //Returns: Overall percentage of the amount of available memory in use (-1 for errors)
	static QStringList DiskUsage(); //Returns: List of current read/write stats for each device
};

#endif