#ifndef __VBAR_SCRIPT_H__
#define __VBAR_SCRIPT_H__

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <errno.h>
#include <limits.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>

#define VBAR_BORDER_LEFT   0x01
#define VBAR_BORDER_TOP    0x02
#define VBAR_BORDER_RIGHT  0x04
#define VBAR_BORDER_BOTTOM 0x08

#define KIB (1024UL)
#define MIB (KIB*KIB)
#define GIB (MIB*KIB)

typedef int err_t;
typedef enum { FALSE, TRUE } bool_t;
typedef enum { VBAR_ALIGNED_LEFT, VBAR_ALIGNED_CENTER, VBAR_ALIGNED_RIGHT } vbarAligned_e;
typedef enum { 
	GADGET_EVENT_REFRESH, 
	GADGET_EVENT_EXTEND_OPEN,
	GADGET_EVENT_EXTEND_CLOSE,
	GADGET_EVENT_EXTEND_REFRESH,
	GADGET_EVENT_MOUSE_RELEASE, 
	GADGET_EVENT_MOUSE_PRESS, 
	GADGET_EVENT_MOUSE_MOVE, 
	GADGET_EVENT_MOUSE_ENTER, 
	GADGET_EVENT_MOUSE_LEAVE, 
	GADGET_EVENT_MOUSE_CLICK, 
	GADGET_EVENT_MOUSE_DBLCLICK
}gadgetEventType_e;

typedef struct vbar vbar_s;
typedef struct gadget gadget_s;

typedef struct vbarMouse{
	unsigned x, y, button, extend, line, icon;
}vbarMouse_s;


typedef void(*gadgetScriptEvent_f)(gadget_s* g, gadgetEventType_e ev, void* arg);

vbar_s* vbar_get(void);

void vbar_monitor_set(vbar_s* vb, char const* monitor);
void vbar_fonts_set(vbar_s* vb, char const* name, size_t size);
void vbar_colors_set(vbar_s* vb, unsigned background, unsigned foreground);
void vbar_topbar_set(vbar_s* vb, unsigned ontop);
void vbar_height_set(vbar_s* vb, unsigned height, unsigned spacingTop, unsigned spacingBottom);
void vbar_border_width_set(vbar_s* vb, unsigned size);
void vbar_icon_load(vbar_s* vb, char const* path, char const* name, unsigned background);
unsigned rgb(int r, int g, int b);

gadget_s* gadget_new(vbar_s* vb, char const* class, char const* name);
void gadget_interval(gadget_s* g, long newtime);
void gadget_change_interval(gadget_s* g, long newtime);
void gadget_start(gadget_s* g);
void gadget_stop(gadget_s* g);
void gadget_event_register(gadget_s* g, gadgetScriptEvent_f script);
void gadget_background(gadget_s* g, unsigned color);
void gadget_foreground(gadget_s* g, unsigned color);
void gadget_border_color(gadget_s* g, unsigned color);
void gadget_border(gadget_s* g, unsigned border);
void gadget_align(gadget_s* g, vbarAligned_e align);
void gadget_icon(gadget_s* g, char const* name);
void gadget_hide(gadget_s* g, int hide);
int gadget_status_get(gadget_s* g);
void gadget_status_set(gadget_s* g, int status);
size_t gadget_text_lenght(gadget_s* g, char* txt);
void gadget_text_reset(gadget_s* g);
void gadget_text(gadget_s* g, char const* format,  ...);
const char* gadget_tohuman(double* out, double value, int initial, double div);
void gadget_redraw(gadget_s* g);

void gadget_extend_enable(gadget_s* g, size_t count);
void gadget_extend_background(gadget_s* g, size_t index, unsigned color);
void gadget_extend_foreground(gadget_s* g, size_t index, unsigned color);
void gadget_extend_border_color(gadget_s* g, size_t index, unsigned color);
void gadget_extend_border(gadget_s* g, size_t index, unsigned border);
void gadget_extend_label(gadget_s* g, size_t index, char const* format,  ...);
void gadget_extend_icons_enable(gadget_s* g, size_t index, size_t count);
void gadget_extend_icons_set(gadget_s* g, size_t index, size_t id, char* name);
void gadget_extend_toggle(gadget_s* g);
void gadget_extend_redraw(gadget_s* g);


/* ../gadget/G_script.c */
err_t gadget_script_shell(gadget_s* g, char* cmd);
err_t gadget_script_shell_event(gadget_s* g, char* cmd, gadgetEventType_e ev, void* arg);
const char* gadget_script_out_raw(gadget_s* g);
const char* gadget_script_err_raw(gadget_s* g);
int gadget_script_exitcode(gadget_s* g);
const char* gadget_script_txt(gadget_s* g);
const char* gadget_script_cmd(gadget_s* g);
void gadget_script_label_reset(gadget_s* g);
/* end */
/* ../gadget/G_label.c */
void gadget_label_set(gadget_s* g, char* txt);
const char* gadget_label_get(gadget_s* g);
/* end */
/* ../gadget/G_network.c */
void gadget_network_device_set(gadget_s* g, char* device);
const char* gadget_network_essid_get(gadget_s* g);
int gadget_network_dbm_get(gadget_s* g);
int gadget_network_bitrate_get(gadget_s* g);
unsigned long gadget_network_receive_speed(gadget_s* g);
unsigned long gadget_network_transmit_speed(gadget_s* g);
int gadget_network_ok(gadget_s* g);
/* end */
/* ../gadget/G_pulseaudio.c */
void gadget_pulseaudio_connect(gadget_s* g);
void gadget_pulseaudio_sink_set(gadget_s* g, char* name);
const char* gadget_pulseaudio_sink_get(gadget_s* g);
void gadget_pulseaudio_volume_set(gadget_s* g, float percentage);
int gadget_pulseaudio_volume_get(gadget_s* g);
void gadget_pulseaudio_volume_delta(gadget_s* g, int delta) ;
void gadget_pulseaudio_mute_set(gadget_s* g, int mode);
int gadget_pulseaudio_mute_get(gadget_s* g);
/* end */
/* ../gadget/G_alsa.c */
void gadget_alsa_card_set(gadget_s* g, char* name);
void gadget_alsa_channel_set(gadget_s* g, char* name);
void gadget_alsa_volume_set(gadget_s* g, long volume);
long gadget_alsa_volume_get(gadget_s* g);
long gadget_alsa_volume_max_get(gadget_s* g);
void gadget_alsa_connect(gadget_s* g);
/* end */
/* ../gadget/G_workspace.c */
void gadget_workspace_enable_events(gadget_s* g);
int gadget_workspace_count(gadget_s* g);
int gadget_workspace_active(gadget_s* g);
void gadget_workspace_activate(gadget_s* g, unsigned idvd);
char** gadget_workspace_names(gadget_s* g);
void gadget_workspace_names_free(char** names);
/* end */
/* ../gadget/G_powerstat.c */
void gadget_powerstat_device_set(gadget_s* g, const char* device);
double gadget_powerstat_voltage_min_get(gadget_s* g, unsigned unit);
double gadget_powerstat_voltage_now_get(gadget_s* g, unsigned unit);
double gadget_powerstat_energy_full_get(gadget_s* g, unsigned unit);
double gadget_powerstat_energy_now_get(gadget_s* g, unsigned unit);
size_t gadget_powerstat_capacity_get(gadget_s* g);
size_t gadget_powerstat_timeleft_hours_get(gadget_s* g);
size_t gadget_powerstat_timeleft_minutes_get(gadget_s* g);
const char* gadget_powerstat_status_get(gadget_s* g);
/* end */
/* ../gadget/G_memory.c */
size_t gadget_memory_total_get(gadget_s* g);
size_t gadget_memory_free_get(gadget_s* g);
size_t gadget_memory_shared_get(gadget_s* g);
size_t gadget_memory_buffers_get(gadget_s* g);
size_t gadget_memory_available_get(gadget_s* g);
size_t gadget_memory_totalswap_get(gadget_s* g);
size_t gadget_memory_freeswap_get(gadget_s* g);
size_t gadget_memory_used_get(gadget_s* g);
/* end */
/* ../gadget/G_cpufreq.c */
size_t gadget_cpufreq_fq_get(unsigned mode, size_t idcpu);
char** gadget_cpufreq_available_governor_get(size_t* count);
void gadget_cpufreq_available_governor_free(char** list, size_t count);
char* gadget_cpufreq_current_governor_get(size_t idcpu);
void gadget_cpufreq_current_governor_free(char* name);
/* end */
/* ../gadget/G_cpu.c */
double gadget_cpu_load_average(gadget_s* g, unsigned core);
/* end */
/* ../gadget/G_clock.c */
int gadget_clock_years(gadget_s* g);
int gadget_clock_month(gadget_s* g);
int gadget_clock_day(gadget_s* g);
int gadget_clock_hour(gadget_s* g);
int gadget_clock_minutes(gadget_s* g);
int gadget_clock_seconds(gadget_s* g);
/* end */
#endif
