// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

(function(document) {
  'use strict';

  // See https://github.com/Polymer/polymer/issues/1381
  window.addEventListener('WebComponentsReady', function() {
    // Middleware
    function scrollToTop(ctx, next) {
      document.body.scrollTop = 0;
      next();
    }

    // Routes.
    page('/', function() {
      page.redirect('/q/status:open');
    });

    function queryHandler(data) {
      app.route = 'gr-change-list';
      app.params = data.params;
    }

    page('/q/:query,:offset', scrollToTop, queryHandler);
    page('/q/:query', scrollToTop, queryHandler);

    page(/^\/(\d+)\/?/, scrollToTop, function(ctx) {
      page.redirect('/c/' + ctx.params[0]);
    });

    page('/c/:changeNum', scrollToTop, function(data) {
      app.route = 'gr-change-view';
      app.params = data.params;
    });

    page(/^\/c\/(\d+)\/((\d+)(\.\.(\d+))?)\/(.+)/, scrollToTop, function(ctx) {
      app.route = 'gr-diff-view';
      var params = {
        changeNum: ctx.params[0],
        basePatchNum: ctx.params[2],
        patchNum: ctx.params[4],
        path: ctx.params[5]
      };
      // Don't allow diffing the same patch number against itself because WHY?
      if (params.basePatchNum == params.patchNum) {
        page.redirect('/c/' + params.changeNum + '/' + params.patchNum + '/' +
            params.path);
        return;
      }
      if (!params.patchNum) {
        params.patchNum = params.basePatchNum;
        delete(params.basePatchNum);
      }
      app.params = params;
    });

    page.start();
  });

})(document);
