/******************************************************************************!
 * \file oscreensaver.c
 * \author Sebastien Beaugrand
 * \sa http://beaugrand.chez.com/
 * \copyright CeCILL 2.1 Free Software license
 ******************************************************************************/
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include "common.h"

void displayInit();
void displayQuit();
void displayWrite(const char* line1, const char* line2);
int displayScreenSaver();
void keypadInit();
void keypadRead();
void keypadQuit();
int undefinedButton();
int rightButton();
int setupTime();
int setupDate();

/******************************************************************************!
 * \fn drawDate
 ******************************************************************************/
int drawDate(int isDay)
{
    char line1[6];
    char line2[6];
    time_t tOfTheDay;
    struct tm* tmOfTheDay;

    tOfTheDay = time(NULL);
    tmOfTheDay = localtime(&tOfTheDay);

    if (isDay) {
        strftime(line1, sizeof(line1), "%dX%m", tmOfTheDay);
        *line2 = '\0';
    } else {
        strftime(line2, sizeof(line2), "%H:%M", tmOfTheDay);
        *line1 = '\0';
    }
    displayWrite(line1, line2);

    return 1;
}

/******************************************************************************!
 * \fn sigTerm
 ******************************************************************************/
void sigTerm(int sig)
{
    if (sig == SIGTERM) {
        keypadQuit();
        displayQuit();
        exit(EXIT_SUCCESS);
    }
}

/******************************************************************************!
 * \fn main
 ******************************************************************************/
int main()
{
    enum {
        STATE0_NORM,
        STATE4_HOUR,
        STATE5_DATE
    } state = STATE0_NORM;

    int pass;
    int i;

    if (signal(SIGTERM, sigTerm) == SIG_ERR) {
        return EXIT_FAILURE;
    }

    displayInit();
    keypadInit();
    for (;;) {
        if (state == STATE0_NORM) {
            if (displayScreenSaver() != 0) {
                return EXIT_FAILURE;
            }
        }
        pass = 0;
        for (i = 0; i < 200; ++i) {
            keypadRead();
            nanoSleep(100000000);
            if (! undefinedButton()) {
                pass = 1;
            }
            /*  */ if (state == STATE0_NORM && rightButton()) {
                state = STATE4_HOUR;
                drawDate(0);
            } else if (state == STATE4_HOUR && setupTime()) {
                state = STATE5_DATE;
                drawDate(1);
            } else if (state == STATE5_DATE && setupDate()) {
                state = STATE0_NORM;
                break;
            }
        }
        if (pass == 0) {
            state = STATE0_NORM;
        }
    }

    return EXIT_SUCCESS;
}