/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

var { XPCOMUtils } = ChromeUtils.importESModule("resource://gre/modules/XPCOMUtils.sys.mjs");

XPCOMUtils.defineLazyModuleGetters(this, {
  CalEvent: "resource:///modules/CalEvent.jsm",
  CalTodo: "resource:///modules/CalTodo.jsm",
});

function run_test() {
  test_get_item_sort_key();
  test_sort_items();
}

function test_get_item_sort_key() {
  let event = new CalEvent(dedent`
        BEGIN:VEVENT
        PRIORITY:8
        SUMMARY:summary
        DTSTART:20180102T030405Z
        DTEND:20180607T080910Z
        CATEGORIES:a,b,c
        LOCATION:location
        STATUS:CONFIRMED
        END:VEVENT
    `);

  strictEqual(cal.unifinder.getItemSortKey(event, "nothing"), null);
  equal(cal.unifinder.getItemSortKey(event, "priority"), 8);
  equal(cal.unifinder.getItemSortKey(event, "title"), "summary");
  equal(cal.unifinder.getItemSortKey(event, "startDate"), 1514862245000000);
  equal(cal.unifinder.getItemSortKey(event, "endDate"), 1528358950000000);
  equal(cal.unifinder.getItemSortKey(event, "categories"), "a, b, c");
  equal(cal.unifinder.getItemSortKey(event, "location"), "location");
  equal(cal.unifinder.getItemSortKey(event, "status"), 1);

  let task = new CalTodo(dedent`
        BEGIN:VTODO
        DTSTART:20180102T030405Z
        DUE:20180607T080910Z
        PERCENT-COMPLETE:20
        STATUS:COMPLETED
        END:VTODO
    `);

  equal(cal.unifinder.getItemSortKey(task, "priority"), 5);
  strictEqual(cal.unifinder.getItemSortKey(task, "title"), "");
  equal(cal.unifinder.getItemSortKey(task, "entryDate"), 1514862245000000);
  equal(cal.unifinder.getItemSortKey(task, "dueDate"), 1528358950000000);
  equal(cal.unifinder.getItemSortKey(task, "completedDate"), -62168601600000000);
  equal(cal.unifinder.getItemSortKey(task, "percentComplete"), 20);
  strictEqual(cal.unifinder.getItemSortKey(task, "categories"), "");
  strictEqual(cal.unifinder.getItemSortKey(task, "location"), "");
  equal(cal.unifinder.getItemSortKey(task, "status"), 2);

  let task2 = new CalTodo(dedent`
        BEGIN:VTODO
        STATUS:GETTIN' THERE
        END:VTODO
    `);
  equal(cal.unifinder.getItemSortKey(task2, "percentComplete"), 0);
  equal(cal.unifinder.getItemSortKey(task2, "status"), -1);

  // Default CalTodo objects have the default percentComplete.
  let task3 = new CalTodo();
  equal(cal.unifinder.getItemSortKey(task3, "percentComplete"), 0);
}

function test_sort_items() {
  // string comparison
  let summaries = ["", "a", "b"];
  let items = summaries.map(summary => {
    return new CalEvent(dedent`
            BEGIN:VEVENT
            SUMMARY:${summary}
            END:VEVENT
        `);
  });

  cal.unifinder.sortItems(items, "title", 1);
  deepEqual(
    items.map(item => item.title),
    ["a", "b", null]
  );

  cal.unifinder.sortItems(items, "title", -1);
  deepEqual(
    items.map(item => item.title),
    [null, "b", "a"]
  );

  // date comparison
  let dates = ["20180101T000002Z", "20180101T000000Z", "20180101T000001Z"];
  items = dates.map(date => {
    return new CalEvent(dedent`
            BEGIN:VEVENT
            DTSTART:${date}
            END:VEVENT
        `);
  });

  cal.unifinder.sortItems(items, "startDate", 1);
  deepEqual(
    items.map(item => item.startDate.icalString),
    ["20180101T000000Z", "20180101T000001Z", "20180101T000002Z"]
  );

  cal.unifinder.sortItems(items, "startDate", -1);
  deepEqual(
    items.map(item => item.startDate.icalString),
    ["20180101T000002Z", "20180101T000001Z", "20180101T000000Z"]
  );

  // number comparison
  let percents = [3, 1, 2];
  items = percents.map(percent => {
    return new CalTodo(dedent`
            BEGIN:VTODO
            PERCENT-COMPLETE:${percent}
            END:VTODO
        `);
  });

  cal.unifinder.sortItems(items, "percentComplete", 1);
  deepEqual(
    items.map(item => item.percentComplete),
    [1, 2, 3]
  );

  cal.unifinder.sortItems(items, "percentComplete", -1);
  deepEqual(
    items.map(item => item.percentComplete),
    [3, 2, 1]
  );
}
