/* Baby Buddy Timer
 *
 * Uses a supplied ID to run a timer. The element using the ID must have
 * three children with the following classes:
 *  * timer-seconds
 *  * timer-minutes
 *  * timer-hours
 */
BabyBuddy.Timer = (function ($) {
  var runIntervalId = null;
  var timerId = null;
  var timerElement = null;
  var lastUpdate = new Date();
  var hidden = null;

  var Timer = {
    run: function (timer_id, element_id) {
      timerId = timer_id;
      timerElement = $("#" + element_id);

      if (timerElement.length === 0) {
        console.error("BBTimer: Timer element not found.");
        return false;
      }

      if (
        timerElement.find(".timer-seconds").length === 0 ||
        timerElement.find(".timer-minutes").length === 0 ||
        timerElement.find(".timer-hours").length === 0
      ) {
        console.error("BBTimer: Element does not contain expected children.");
        return false;
      }

      runIntervalId = setInterval(this.tick, 1000);

      // If the page just came in to view, update the timer data with the
      // current actual duration. This will (potentially) help mobile
      // phones that lock with the timer page open.
      if (typeof document.hidden !== "undefined") {
        hidden = "hidden";
      } else if (typeof document.msHidden !== "undefined") {
        hidden = "msHidden";
      } else if (typeof document.webkitHidden !== "undefined") {
        hidden = "webkitHidden";
      }
      window.addEventListener("focus", Timer.handleVisibilityChange, false);
    },

    handleVisibilityChange: function () {
      if (!document[hidden] && new Date() - lastUpdate > 1) {
        Timer.update();
      }
    },

    tick: function () {
      var s = timerElement.find(".timer-seconds");
      var seconds = Number(s.text());
      if (seconds < 59) {
        s.text(seconds + 1);
        return;
      } else {
        s.text(0);
      }

      var m = timerElement.find(".timer-minutes");
      var minutes = Number(m.text());
      if (minutes < 59) {
        m.text(minutes + 1);
        return;
      } else {
        m.text(0);
      }

      var h = timerElement.find(".timer-hours");
      var hours = Number(h.text());
      h.text(hours + 1);
    },

    update: function () {
      $.get("/api/timers/" + timerId + "/", function (data) {
        if (data && "duration" in data) {
          clearInterval(runIntervalId);
          var duration = data.duration.split(/[\s:.]/);
          if (duration.length === 5) {
            duration[0] = parseInt(duration[0]) * 24 + parseInt(duration[1]);
            duration[1] = duration[2];
            duration[2] = duration[3];
          }
          timerElement.find(".timer-hours").text(parseInt(duration[0]));
          timerElement.find(".timer-minutes").text(parseInt(duration[1]));
          timerElement.find(".timer-seconds").text(parseInt(duration[2]));
          lastUpdate = new Date();
          runIntervalId = setInterval(Timer.tick, 1000);
        }
      });
    },
  };

  return Timer;
})(jQuery);