;(function (window, document, $, bam) {


  var sSaleDate = /^(\d{4})(\d{2})(\d{2})/,
      rSaleDate = '$1/$2/$3',
      instance;


  /**
   * TicketingClient
   */
  function TicketingClient (options) {

    /**
     * If called without the new keyword, use a singleton instance.
     */
    if (!(this instanceof TicketingClient)) {
      if (!instance) {
        instance = new TicketingClient();
      }
      return instance;
    }
    
    this.options = $.extend({
      i18n: 'en'
    }, options);
  }

  
  // Add $.loadable behavior to TicketingClient
  $.loadable(TicketingClient, {
    url:      '/ticketing-client/json/Game.tiksrv',
    dataType: 'text',
    cache:    !bam.env.host.isDev, // bust cache on dev
    dataFilter: function (data) {

      var games = $.ensureArray($.deep($.parseJSON(data), 'events.game'));

      return $.map(games, function (game) {
        var link = game.ticket_link;
        link.game_pk            = game.schedule_id;
        link.away_or_home       = link.team_id === game.home_team_id && 'home' || link.team_id === game.away_team_id && 'away';
        link.on_sale_start_date = link.on_sale_start_date.replace(sSaleDate, rSaleDate);
        link.on_sale_end_date   = link.on_sale_end_date.replace(sSaleDate, rSaleDate);
        return link;
      });
    }
  });
  
  
  // Overload $.loadable load method with a custom load method that accepts
  // a date as an optional parameter to configure the request data
  TicketingClient.prototype.loadableConfig = (function (loadableConfig) {
    return function (date) {

      date = $.ensureDate(date);
      
      var ymd  = bam.datetime.toYMD(date),
          cfg = {
            data: {
              sport_id:        1,
              site_section:    '\'DEFAULT\'',
              ticket_category: '\'TICKETS\'',
              begin_date:      ymd,
              end_date:        ymd,
              year:            date.getFullYear()
            }
          };

      if (this.options.i18n === 'es') {
        cfg.data.sub_category = "'Spanish'";
      }

      return loadableConfig.call(this, cfg);

    };
  })(TicketingClient.prototype.loadableConfig);


  // Add TicketingClient to bam.services namespace
  bam.namespace('services').TicketingClient = TicketingClient;


})(this, this.document, this.jQuery, this.bam);

