/*global waitsFor:true expect:true describe:true beforeEach:true it:true */

describe("Discourse.Report", function() {

  function dateString(days) {
    return moment().subtract("days", days).format('YYYY-MM-DD');
  }

  function reportWithData(data) {
    var arr = [];
    _.each(data,function(val,index) {
      arr.push({x: dateString(index), y: val});
    });
    return Discourse.Report.create({ type: 'topics', data: arr });
  }

  describe("todayCount", function() {
    it("returns the correct value", function() {
      expect( reportWithData([5,4,3,2,1]).get('todayCount') ).toBe(5);
    });
  });

  describe("yesterdayCount", function() {
    it("returns the correct value", function() {
      expect( reportWithData([5,4,3,2,1]).get('yesterdayCount') ).toBe(4);
    });
  });

  describe("sumDays", function() {
    it("adds the values for the given range of days, inclusive", function() {
      expect( reportWithData([1,2,3,5,8,13]).sumDays(2,4) ).toBe(16);
    });
  });

  describe("lastSevenDaysCount", function() {
    it("returns the correct value", function() {
      expect( reportWithData([100,9,8,7,6,5,4,3,200,300,400]).get('lastSevenDaysCount') ).toBe(42);
    });
  });

  describe("percentChangeString", function() {
    it("returns correct value when value increased", function() {
      expect( reportWithData([]).percentChangeString(8,5) ).toBe("+60%");
    });

    it("returns correct value when value decreased", function() {
      expect( reportWithData([]).percentChangeString(2,8) ).toBe("-75%");
    });

    it("returns 0 when value is unchanged", function() {
      expect( reportWithData([]).percentChangeString(8,8) ).toBe("0%");
    });

    it("returns Infinity when previous value was 0", function() {
      expect( reportWithData([]).percentChangeString(8,0) ).toBe(null);
    });

    it("returns -100 when yesterday's value was 0", function() {
      expect( reportWithData([]).percentChangeString(0,8) ).toBe('-100%');
    });

    it("returns NaN when both yesterday and the previous day were both 0", function() {
      expect( reportWithData([]).percentChangeString(0,0) ).toBe(null);
    });
  });

  describe("yesterdayCountTitle", function() {
    it("displays percent change and previous value", function(){
      var title = reportWithData([6,8,5,2,1]).get('yesterdayCountTitle')
      expect( title.indexOf('+60%') ).not.toBe(-1);
      expect( title ).toMatch("Was 5");
    });

    it("handles when two days ago was 0", function() {
      var title = reportWithData([6,8,0,2,1]).get('yesterdayCountTitle')
      expect( title ).toMatch("Was 0");
      expect( title ).not.toMatch("%");
    });
  });

  describe("sevenDayCountTitle", function() {
    it("displays percent change and previous value", function(){
      var title = reportWithData([100,1,1,1,1,1,1,1,2,2,2,2,2,2,2,100,100]).get('sevenDayCountTitle');
      expect( title ).toMatch("-50%");
      expect( title ).toMatch("Was 14");
    });
  });

  describe("thirtyDayCountTitle", function() {
    it("displays percent change and previous value", function(){
      var report = reportWithData([5,5,5,5]);
      report.set('prev30Days', 10);
      var title = report.get('thirtyDayCountTitle');
      expect( title.indexOf('+50%') ).not.toBe(-1);
      expect( title ).toMatch("Was 10");
    });
  });
});