#include <time.h>
#include <stdio.h>
#include "cmsys.h"

static char cdate_buffer[32];

/**
 * 閏年
 */
int is_leap_year(int year)
{
    return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}

/**
 * 給日期求星座
 *
 * @return	1..12
 */
int getHoroscope(int m, int d)
{
    if (m > 12 || m < 1)
	return 1;

    // 摩羯 水瓶 雙魚 牡羊 金牛 雙子 巨蟹 獅子 處女 天秤 天蠍 射手
    const int firstday[12] = {
	// Reference: http://zh.wikipedia.org/wiki/%E6%98%9F%E5%BA%A7
	/* Jan. */ 20, 19, 21, 20, 21, 22, 23, 23, 24, 24, 22, 22
    };
    if (d >= firstday[m - 1]) {
	if (m == 12)
	    return 1;
	else
	    return m + 1;
    }
    else
	return m;
}

/**
 * 23+1 bytes, "12/31/2007 00:00:00 Mon\0"
 */
const char*
Cdate(const time4_t *clock)
{
    time_t          temp = (time_t)*clock;
    struct tm       mytm;

    localtime_r(&temp, &mytm);
    strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d/%Y %T %a", &mytm);
    return cdate_buffer;
}

/**
 * 19+1 bytes, "12/31/2007 00:00:00\0"
 */
const char*
Cdatelite(const time4_t *clock)
{
    time_t          temp = (time_t)*clock;
    struct tm       mytm;

    localtime_r(&temp, &mytm);
    strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d/%Y %T", &mytm);
    return cdate_buffer;
}

/**
 * 10+1 bytes, "12/31/2007\0"
 */
const char*
Cdatedate(const time4_t * clock)
{
    time_t          temp = (time_t)*clock;
    struct tm       mytm;

    localtime_r(&temp, &mytm);
    strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d/%Y", &mytm);
    return cdate_buffer;
}

/**
 * 5+1 bytes, "12/31\0"
 */
const char*
Cdate_md(const time4_t * clock)
{
    time_t          temp = (time_t)*clock;
    struct tm       mytm;

    localtime_r(&temp, &mytm);
    strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d", &mytm);
    return cdate_buffer;
}

/**
 * 11+1 bytes, "12/31 10:01\0"
 */
const char*
Cdate_mdHM(const time4_t * clock)
{
    time_t          temp = (time_t)*clock;
    struct tm       mytm;

    localtime_r(&temp, &mytm);
    strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d %H:%M", &mytm);
    return cdate_buffer;
}

/**
 * 13+1 bytes, "12/31 10:01:01\0"
 */
const char*
Cdate_mdHMS(const time4_t * clock)
{
    time_t          temp = (time_t)*clock;
    struct tm       mytm;

    localtime_r(&temp, &mytm);
    strftime(cdate_buffer, sizeof(cdate_buffer), "%m/%d %H:%M:%S", &mytm);
    return cdate_buffer;
}

#ifdef TIMET64
char           *
ctime4(const time4_t *clock)
{
    time_t temp = (time_t)*clock;
    
    return ctime(&temp);
}

char *
ctime4_r(const time4_t *t, char *buf)
{
    time_t temp = (time_t)*t;

    return ctime_r(&temp, buf);
}

// XXX TODO change this to localtime_r style someday.
struct tm *localtime4(const time4_t *t)
{
    if( t == NULL )
	return localtime(NULL);
    else {
	time_t  temp = (time_t)*t;
	return localtime(&temp);
    }
}

struct tm*
localtime4_r(const time4_t *t, struct tm *pt)
{
    if (t)
    {
	time_t temp  = (time_t)*t;
	localtime_r(&temp, pt);
    }
    else
	localtime_r(NULL, pt);
    return pt;
}


time4_t time4(time4_t *ptr)
{
    if( ptr == NULL )
	return time(NULL);
    else
	return *ptr = (time4_t)time(NULL);
}
#endif
