// Copyright 2009 Google Inc. All Rights Reserved.

/**
 * @fileoverview Handles the text and links in the smart frontpage button.
 * @author danielrocha@google.com (Daniel Rocha)
 */

// Load jQuery
google.load('jquery', '1');

var isContestRunning = function(secsToStart, secsToEnd) {
  return secsToStart <= 0 && 0 < secsToEnd;
};

var isContestOver = function(secsToStart, secsToEnd) {
  return secsToEnd <= 0;
};

var setMainButton = function(text, link) {
  document.getElementById('platform-button').innerHTML =
      '<a href="' + link + '">' + text + '</a>';
};

var setSmallLinks = function(link0, link1, link2) {
  var index = 0;
  if (link0) {
    var linkHtml = (index > 0 ? ' - ' : '') + '<a href="' + link0[1] + '">' +
        link0[0] + '</a>';
    document.getElementById('link-under-action-button-' + index).innerHTML =
        linkHtml;
    index++;
  }
  if (link1) {
    var linkHtml = (index > 0 ? ' - ' : '') + '<a href="' + link1[1] + '">' +
        link1[0] + '</a>';
    document.getElementById('link-under-action-button-' + index).innerHTML =
        linkHtml;
    index++;
  }
  if (link2) {
    var linkHtml = (index > 0 ? ' - ' : '') + '<a href="' + link2[1] + '">' +
        link2[0] + '</a>';
    document.getElementById('link-under-action-button-' + index).innerHTML =
        linkHtml;
    index++;
  }

  // If we haven't used all links, clear the remaining ones.
  while (index < 3) {
    document.getElementById('link-under-action-button-' + index).innerHTML = '';
    index++;
  }
};

var MAIN_BUTTON_REFRESH_MILLISECONDS = 1000;
var setMainButtonWithClock = function(text, secsToStart) {
  // Gets a timestamp (in milliseconds) for when the contest will start.
  this.contestStartTime = (new Date()).getTime() + secsToStart * 1000;
  this.buttonElement = document.getElementById('platform-button');
  // If we have a current timer, clear it.
  if (this.updateTimer) {
    clearInterval(this.updateTimer);
  }

  this.updateText = function() {
    var currentTime = (new Date()).getTime();
    var seconds = Math.round((this.contestStartTime - currentTime) / 1000);
    // TODO(danielrocha): there's no need for the <a> tags, fix the CSS.
    if (seconds >= 60) {
      if (seconds < 10 * 60) {
        var minutes = Math.floor(seconds / 60);
        var seconds = seconds - minutes * 60;
        if (seconds < 10) {
          seconds = '0' + seconds;
        }
        this.buttonElement.innerHTML =
            '<a>' + text + ' ' + minutes + ':' + seconds + ' </a>';
      } else {
        var minutes = Math.floor(seconds / 60);
        var suffix = (minutes == 1 ? '' : 's');
        this.buttonElement.innerHTML =
            '<a>' + text + ' ' + minutes + ' minute' + suffix + ' </a>';
      }
    } else if (seconds > 0) {
      var suffix = (seconds == 1 ? '' : 's');
      this.buttonElement.innerHTML =
          '<a>' + text + ' ' + seconds + ' second' + suffix + ' </a>';
    } else {
      // The clock finished counting down, we should refresh all the links.
      clearInterval(this.updateTimer);
      getJSONAndUpdateLinks();
    }
  }

  this.updateText();  // Does a first update of the clock.
  this.updateTimer = setInterval(function(){this.updateText()},
                                 MAIN_BUTTON_REFRESH_MILLISECONDS);
};

// data from json request
var updateTextAndLinks = function(data) {
  // A series of links that might appear on the main link or in sub-links.
  var CANT_COMPETE_LINK = '/codejam/faq.html#cantcompete';
  var DASHBOARD_LINK = '/codejam/contest/dashboard?c=' + data.contestId;
  var PRACTICE_LINK = '/codejam/contest';
  var REGISTRATION_LINK = '/codejam/contest/registration';
  var RULES_LINK = '/codejam/rules.html';
  var SCOREBOARD_LINK = '/codejam/contest/scoreboard?c=' + data.contestId;
  var SIGN_IN_LINK = data.signInLink;

  // A series of phrases that can show up on the main button.
  var CANT_COMPETE_TEXT = 'Why can\'t I compete?';
  var COMPETE_IN_TEXT = 'Compete in ';
  var COMPETE_TEXT = 'Compete';
  var PARTICIPATE_TEXT = 'Participate';
  var PRACTICE_LONG_TEXT = 'Practice with Google Code Jam 2008';
  var PRACTICE_TEXT = 'Practice';
  var READ_PROBLEMS_TEXT = 'Read Problems';
  var READ_RULES_TEXT = 'Read the Rules';
  var SCOREBOARD_TEXT = 'Scoreboard';
  var SIGN_IN_TEXT = 'Sign in';
  var VIEW_SCORES_TEXT = 'View Scores';
  var WATCH_IN_TEXT = 'Watch in ';
  var WATCH_TEXT = 'Watch Round';

  // A series of texts that can show up as small links below the main button.
  var smallLinksDict = {
      SL_SIGN_IN: [SIGN_IN_TEXT, SIGN_IN_LINK],
      SL_READ_PROBLEMS: [READ_PROBLEMS_TEXT, DASHBOARD_LINK],
      SL_PRACTICE: [PRACTICE_TEXT, PRACTICE_LINK],
      SL_READ_RULES: [READ_RULES_TEXT, RULES_LINK],
      SL_PRACTICE_BIG: [PRACTICE_LONG_TEXT, PRACTICE_LINK],
      SL_SCOREBOARD: [SCOREBOARD_TEXT, SCOREBOARD_LINK],
      SL_CANT_COMPETE: [CANT_COMPETE_TEXT, CANT_COMPETE_LINK] };

  // A few constants with the current contest status.
  var CONTEST_OVER = (
      data.contestExists &&
      isContestOver(data.secsToStart, data.secsToEnd));
  var CONTEST_PREVIOUS_DAY = (
      data.contestExists && CONTEST_OVER &&
      data.secsToEnd >= -24 * 60 * 60);
  var CONTEST_RUNNING = (
      data.contestExists && !CONTEST_OVER &&
      isContestRunning(data.secsToStart, data.secsToEnd));
  var CONTEST_NEXT_HOUR = (
      data.contestExists && !CONTEST_OVER && !CONTEST_RUNNING &&
      data.secsToStart <= 60 * 60);

  // If the user is signed into the system _and_ registered for the
  // currently-running tournament.
  if (data.signedInAndRegistered) {
    if (CONTEST_RUNNING) {
      if (data.contestEligibility) {
        // User is registered and is able to participate in the running
        // contest.
        setMainButton(COMPETE_TEXT, DASHBOARD_LINK);
        setSmallLinks(smallLinksDict.SL_SCOREBOARD,
                      smallLinksDict.SL_READ_RULES);
      } else {
        // User is registered and is NOT able to participate in the running
        // contest.
        setMainButton(WATCH_TEXT, SCOREBOARD_LINK);
        setSmallLinks(smallLinksDict.SL_CANT_COMPETE,
                      smallLinksDict.SL_READ_PROBLEMS,
                      smallLinksDict.SL_PRACTICE);
      }
    } else {  // There's no contest running.
      if (CONTEST_NEXT_HOUR) {
        if (data.contestEligibility) {
          // There's a contest coming up and the user will be able to
          // participate.
          setMainButtonWithClock(COMPETE_IN_TEXT, data.secsToStart);
          setSmallLinks(smallLinksDict.SL_PRACTICE,
                        smallLinksDict.SL_READ_RULES);
        } else {
          // There's a contest coming up and the user will NOT be able to
          // participate.
          setMainButtonWithClock(WATCH_IN_TEXT, data.secsToStart);
          setSmallLinks(smallLinksDict.SL_CANT_COMPETE,
                        smallLinksDict.SL_PRACTICE);
        }
      } else if (CONTEST_PREVIOUS_DAY) {
        // There was a contest in the day before.
        setMainButton(VIEW_SCORES_TEXT, SCOREBOARD_LINK);
        setSmallLinks(smallLinksDict.SL_READ_PROBLEMS,
                      smallLinksDict.SL_PRACTICE,
                      smallLinksDict.SL_READ_RULES);
      } else {
        // There's no contest running and there's no contest coming up.
        setMainButton(PRACTICE_TEXT, PRACTICE_LINK);
        setSmallLinks(smallLinksDict.SL_READ_RULES);
      }
    }
  } else { // User is either not registered or not signed in.
    if (data.registrationOpen) {
      // Before Code Jam starts or during the qualification round.
      setMainButton(PARTICIPATE_TEXT, REGISTRATION_LINK);
      setSmallLinks(smallLinksDict.SL_READ_RULES,
                    smallLinksDict.SL_PRACTICE_BIG);
    } else {
      if (CONTEST_RUNNING) {
        // There's a contest currently running.
        setMainButton(WATCH_TEXT, SCOREBOARD_LINK);
        setSmallLinks((data.userSignedIn ? smallLinksDict.CL_CANT_COMPETE :
                                           smallLinksDict.SL_SIGN_IN),
                      smallLinksDict.SL_READ_PROBLEMS,
                      smallLinksDict.SL_PRACTICE);
      } else if (CONTEST_NEXT_HOUR) {
        // There's a contest coming up.
        setMainButtonWithClock(WATCH_IN_TEXT, data.secsToStart);
        setSmallLinks((data.userSignedIn ? smallLinksDict.SL_CANT_COMPETE :
                                           smallLinksDict.SL_SIGN_IN),
                      smallLinksDict.SL_PRACTICE,
                      smallLinksDict.SL_READ_RULES);
      } else if (CONTEST_PREVIOUS_DAY) {
        // There was a contest in the day before.
        setMainButton(VIEW_SCORES_TEXT, SCOREBOARD_LINK);
        setSmallLinks(smallLinksDict.SL_READ_PROBLEMS,
                      smallLinksDict.SL_PRACTICE,
                      smallLinksDict.SL_READ_RULES);
      } else {
        // This is the case between Code Jams or between Code Jam rounds.
        setMainButton(PRACTICE_TEXT, PRACTICE_LINK);
        setSmallLinks((data.userSignedIn ? false : smallLinksDict.SL_SIGN_IN),
                      smallLinksDict.SL_READ_RULES);
      }
    }
  }
};

var getJSONAndUpdateLinks = function() {
  $.getJSON('/codejam/contest/microsite-info?jsoncallback=?',
            updateTextAndLinks);
};

// On page load complete, fire off a jQuery json-p query to the plataform and
// get all the information needed for setting the button text/link and the
// text/links under the button.
google.setOnLoadCallback(getJSONAndUpdateLinks);

// Updates the button and links every 30 minutes.
// TODO(danielrocha): maybe do a more intelligent approach.
setInterval(getJSONAndUpdateLinks, 30 * 60 * 1000);
