#include "e_system.h"

char *_cmd_halt = NULL;
char *_cmd_reboot = NULL;
char *_cmd_suspend = NULL;
char *_cmd_hibernate = NULL;

static void
_cb_power_halt(void *data EINA_UNUSED, const char *params EINA_UNUSED)
{
   if (_cmd_halt) ecore_exe_run(_cmd_halt, NULL);
}

static void
_cb_power_reboot(void *data EINA_UNUSED, const char *params EINA_UNUSED)
{
   if (_cmd_reboot) ecore_exe_run(_cmd_reboot, NULL);
}

static void
_cb_power_suspend(void *data EINA_UNUSED, const char *params EINA_UNUSED)
{
   if (_cmd_suspend) ecore_exe_run(_cmd_suspend, NULL);
}

static void
_cb_power_hibernate(void *data EINA_UNUSED, const char *params EINA_UNUSED)
{
   if (_cmd_hibernate) ecore_exe_run(_cmd_hibernate, NULL);
}

static void
_power_halt_init(void)
{
#if defined (__FreeBSD__) || defined (__OpenBSD__)
   _cmd_halt = strdup("shutdown -p now");
#else
   if (ecore_file_app_installed("systemctl"))
     _cmd_halt = strdup("systemctl poweroff");
   else
     _cmd_halt = strdup("shutdown -h now");
#endif
   // linux systemd: PATH/systemctl poweroff
   //           bsd: /sbin/shutdown -p no
   // *            : /sbin/shutdown -h now
}

static void
_power_reboot_init(void)
{
#if defined (__FreeBSD__) || defined (__OpenBSD__)
   _cmd_reboot = strdup("shutdown -r now");
#else
   if (ecore_file_app_installed("systemctl"))
     _cmd_reboot = strdup("systemctl reboot");
   else
     _cmd_reboot = strdup("shutdown -r now");
#endif
   // linux systemd: PATH/systemctl reboot
   //             *: /sbin/shutdown -r now
}

static void
_power_suspend_init(void)
{
#if defined (__FreeBSD__) || defined (__OpenBSD__)
   if (ecore_file_app_installed("zzz"))
     _cmd_suspend = strdup("zzz");
#else
   if (ecore_file_app_installed("systemctl"))
     _cmd_suspend = strdup("systemctl suspend");
   else if (ecore_file_app_installed("sleep.sh"))
     _cmd_suspend = strdup("sleep.sh");
   else if (ecore_file_can_exec("/etc/acpi/sleep.sh"))
     _cmd_suspend = strdup("/etc/acpi/sleep.sh force");
   else if (ecore_file_app_installed("pm-suspend"))
     _cmd_suspend = strdup("pm-suspend");
   else if (ecore_file_can_exec("/etc/acpi/pm-suspend"))
     _cmd_suspend = strdup("/etc/acpi/pm-suspend");
#endif
   // linux systemd: PATH/systemctl suspend
   //           bsd: /usr/sbin/zzz
   //             *:
   //    PATH/sleep.sh
   //    /etc/acpi/sleep.sh force
   //    PATH/pm-suspend
   //    /etc/acpi/pm-suspend
}

static void
_power_hibernate_init(void)
{
#if defined (__FreeBSD__) || defined (__OpenBSD__)
   if (ecore_file_app_installed("acpiconf"))
     _cmd_hibernate = strdup("acpiconf -s4");
#else
   if (ecore_file_app_installed("systemctl"))
     _cmd_hibernate = strdup("systemctl hibernate");
   else if (ecore_file_app_installed("hibernate.sh"))
     _cmd_hibernate = strdup("hibernate.sh");
   else if (ecore_file_can_exec("/etc/acpi/hibernate.sh"))
     _cmd_hibernate = strdup("/etc/acpi/hibernate.sh force");
   else if (ecore_file_app_installed("pm-hibernate"))
     _cmd_hibernate = strdup("pm-hibernate");
   else if (ecore_file_can_exec("/etc/acpi/pm-hibernate"))
     _cmd_hibernate = strdup("/etc/acpi/pm-hibernate");
#endif
   // linux systemd: PATH/systemctl hibernate
   // bsd: acpiconf -s4
   // if exist:
   //    PATH/hibernate.sh
   //    /etc/acpi/hibernate.sh force
   //    PATH/pm-hibernate
   //    /etc/acpi/pm-hibernate
}

void
e_system_power_init(void)
{
   _power_halt_init();
   _power_reboot_init();
   _power_suspend_init();
   _power_hibernate_init();
   e_system_inout_command_register("power-halt",       _cb_power_halt, NULL);
   e_system_inout_command_register("power-reboot",     _cb_power_reboot, NULL);
   e_system_inout_command_register("power-suspend",    _cb_power_suspend, NULL);
   e_system_inout_command_register("power-hibernate",  _cb_power_hibernate, NULL);
}

void
e_system_power_shutdown(void)
{
   // only shutdown things we really have to - no need to free mem etc.
}
