#include <stdlib.h>
#include <string.h>
#include <uuid/uuid.h>

#include <constants.h>
#include <logger.h>
#include <models/relay.h>

relay_t*
relay_create(uint8_t number)
{
    relay_t *new_relay = malloc(sizeof(relay_t));

    new_relay->number = number;
    new_relay->name[0] = '\0';

    uuid_t off_id;
    memset(off_id, 0, sizeof(uuid_t));
    memcpy(off_id, "off", 3);

    new_relay->schedule = schedule_create(off_id, 0, NULL);

    return new_relay;
}

void
relay_set_name(relay_t *relay, char *name)
{
    strncpy(relay->name, name, MAX_NAME_LENGTH);
    relay->name[MAX_NAME_LENGTH] = '\0';
}

int
relay_is_active(relay_t *relay, time_t timestamp_now)
{
    if(relay->schedule->length == 0)
    {
        return 0;
    }

    // we don't need days. reduce to hours, minutes and seconds
    timestamp_now %= SECONDS_PER_DAY;
    // finally remove seconds
    timestamp_now /= SECONDS_PER_MINUTE;

    for(uint16_t i = 0; i < relay->schedule->length; ++i)
    {
        if(period_includes_time(relay->schedule->periods[i], timestamp_now))
        {
            return 1;
        }
    }
    return 0;
}
//struct tm time_start, time_now, time_end;
//localtime_r(&timestamp_start, &time_start);
//localtime_r(&timestamp_now, &time_now);
//localtime_r(&timestamp_end, &time_end);
//LOG_DEBUG("%02d:%02d - %02d:%02d - %02d:%02d", time_start.tm_hour, time_start.tm_min, time_now.tm_hour, time_now.tm_min, time_end.tm_hour, time_end.tm_min);

void
relay_debug(relay_t *relay)
{
    if(relay == NULL)
    {
        LOG_DEBUG("relay is NULL");
        return;
    }
    LOG_DEBUG("(1/3) %d @ %p", relay->number, relay);
    LOG_DEBUG("(2/3) name: %s", relay->name);
    LOG_DEBUG("(3/3) schedule:");
    schedule_debug(relay->schedule);
}

void
relay_free(relay_t *relay)
{
    if(relay->schedule)
    {
        schedule_free(relay->schedule);
    }
    free(relay);
}