-- Set new wakeup time
CREATE or REPLACE FUNCTION wakeup_set(integer, varchar) RETURNS INTEGER AS '
  DECLARE
    _wakeup_id int;
  BEGIN
    SELECT INTO _wakeup_id id from wakeup where contact = $1;
    IF _wakeup_id > 1 THEN
      UPDATE wakeup SET wakeuptime=$2, created = NOW() WHERE id=_wakeup_id;
    ELSE
      INSERT INTO wakeup (contact, wakeuptime, created) VALUES ($1, $2, NOW());
    END IF;
    RETURN ''0'';
  END;
' LANGUAGE plpgsql;

-- Get current wakeup time
CREATE or REPLACE FUNCTION wakeup_get(integer) RETURNS VARCHAR AS '
  DECLARE
    _wakeuptime varchar(4);

  BEGIN
    SELECT INTO _wakeuptime wakeuptime FROM wakeup where contact = $1;
    IF char_length(_wakeuptime) = 4 THEN
      RETURN _wakeuptime;
    ELSE
      RETURN ''0'';
    END IF;
  END;
' LANGUAGE plpgsql;

-- Unset current wakeup time
CREATE or REPLACE FUNCTION wakeup_unset(integer) RETURNS INTEGER as '
  BEGIN
    DELETE FROM wakeup WHERE contact=$1;
    RETURN ''1'';
  END;
' LANGUAGE plpgsql;

-- Check if a given time is a correct time
CREATE or REPLACE FUNCTION wakeup_check (varchar) RETURNS INTEGER AS '
  DECLARE
    _hours int;
    _minutes int;
  BEGIN
    SELECT INTO _hours substring($1, 1, 2)::text::int4;
    SELECT INTO _minutes substring($1, 3, 2)::text::int4;

    IF _hours < 0    THEN RETURN ''0''; END IF;
    IF _hours > 23   THEN RETURN ''0''; END IF;
    IF _minutes < 0  THEN RETURN ''0''; END IF;
    IF _minutes > 59 THEN RETURN ''0''; END IF;

    RETURN ''1'';
  END;
' LANGUAGE plpgsql;

