#include <glib.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>


#include "entity.h"


static void
system_time_get_millisecond (ENode * node, gchar * attr)
{
    GTimeVal t;
    gchar buf[128];

    g_get_current_time (&t);

    g_snprintf (buf, 128, "%ld", t.tv_usec);
    enode_attrib_str (node, attr, buf);
}

static void
system_time_get_second (ENode * node, gchar * attr)
{
    struct tm *tm;
    time_t t;
    gchar buf[128];

    time (&t);
    tm = localtime (&t);

    g_snprintf (buf, 128, "%d", tm->tm_sec);
    enode_attrib_str (node, attr, buf);
}

static void
system_time_get_minute (ENode * node, gchar * attr)
{
    struct tm *tm;
    time_t t;
    gchar buf[128];

    time (&t);
    tm = localtime (&t);

    g_snprintf (buf, 128, "%d", tm->tm_min);
    enode_attrib_str (node, attr, buf);
}

static void
system_time_get_hour (ENode * node, gchar * attr)
{
    struct tm *tm;
    time_t t;
    gchar buf[128];

    time (&t);
    tm = localtime (&t);

    g_snprintf (buf, 128, "%d", tm->tm_hour);
    enode_attrib_str (node, attr, buf);
}

static GDate *
get_current_date (void)
{

    GDate *date;
    date = g_date_new ();

    g_date_set_time (date, time (NULL));
    return date;
}

static void
get_day (ENode * node, gchar * attr)
{
    gchar buf[128];
    GDate *date;

    date = get_current_date ();

    g_snprintf (buf, 128, "%d", (int) (date->day));
    enode_attrib_str (node, attr, buf);
}

static void
get_weekday (ENode * node, gchar * attr)
{
    gchar buf[128];
    GDate *date;

    date = get_current_date ();

    g_snprintf (buf, 128, "%d", (int) g_date_weekday (date));
    enode_attrib_str (node, attr, buf);
}

static void
get_month (ENode * node, gchar * attr)
{
    gchar buf[128];
    GDate *date;

    date = get_current_date ();

    g_snprintf (buf, 128, "%d", (int) (date->month));
    enode_attrib_str (node, attr, buf);
}

static void
get_year (ENode * node, gchar * attr)
{
    gchar buf[128];
    GDate *date;

    date = get_current_date ();

    g_snprintf (buf, 128, "%d", (int) (date->year));
    enode_attrib_str (node, attr, buf);
}

static void
get_leapyear (ENode * node, gchar * attr)
{
    GDate *date;

    date = get_current_date ();

    if (g_date_is_leap_year (date->year)) {
	enode_attrib_str (node, attr, "true");
    } else {
	enode_attrib_str (node, attr, "false");
    }
}

static void
get_cur_time (ENode * node, gchar * attr)
{
    struct tm *tm;
    time_t t;
    gchar buf[128];
    char *default_format = { "%r" };

    gchar *format = enode_attrib_str (node, "time-format", NULL);

    time (&t);
    tm = localtime (&t);

    if (format) {
	strftime ((char *) buf, 128, format, tm);
    } else {
	strftime ((char *) buf, 128, default_format, tm);
    }

    enode_attrib_str (node, attr, buf);
}

void
system_time_renderer_register (void)
{
    Element *element;
    ElementAttr *e_attr;

    element = g_new0 (Element, 1);
    element->tag = "system-time";
    element->description = "Get system time information.";
    element_register (element);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "milliseconds";
    e_attr->description = "Current millisecond.";
    e_attr->value_desc = "integer";
    e_attr->get_attr_func = system_time_get_millisecond;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "seconds";
    e_attr->description = "Current second.";
    e_attr->value_desc = "integer";
    e_attr->get_attr_func = system_time_get_second;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "minutes";
    e_attr->description = "Current minute.";
    e_attr->value_desc = "integer";
    e_attr->get_attr_func = system_time_get_minute;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "hour";
    e_attr->description = "Current hour.";
    e_attr->value_desc = "integer";
    e_attr->get_attr_func = system_time_get_hour;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "day";
    e_attr->description = "Current day.";
    e_attr->value_desc = "integer";
    e_attr->get_attr_func = get_day;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "month";
    e_attr->description = "Current month.";
    e_attr->value_desc = "integer";
    e_attr->get_attr_func = get_month;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "year";
    e_attr->description = "Current year.";
    e_attr->value_desc = "integer";
    e_attr->get_attr_func = get_year;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "weekday";
    e_attr->description = "Current weekday (monday being the first day).";
    e_attr->value_desc = "integer";
    e_attr->get_attr_func = get_weekday;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "leapyear";
    e_attr->description = "Is current year a leapyear.";
    e_attr->value_desc = "boolean";
    e_attr->get_attr_func = get_leapyear;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "curtime";
    e_attr->description = "current time as specified by time-format.  Default"
	"is hours:minutes:seconds";
    e_attr->value_desc = "string";
    e_attr->get_attr_func = get_cur_time;
    element_register_attrib (element, e_attr);

    e_attr = g_new0 (ElementAttr, 1);
    e_attr->attribute = "time-format";
    e_attr->description = "Formatting string for curtime. See the strftime"
	" man page for details.";
    e_attr->value_desc = "string";
    element_register_attrib (element, e_attr);

}


syntax highlighted by Code2HTML, v. 0.9.1