"use strict";

const {strict: assert} = require("assert");

const {zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");

const search_pill = zrequire("search_pill");
const input_pill = zrequire("input_pill");

const is_starred_item = {
    display_value: "is:starred",
    description: "starred messages",
};

const is_private_item = {
    display_value: "is:private",
    description: "private messages",
};

run_test("create_item", () => {
    function test_create_item(search_string, current_items, expected_item) {
        const item = search_pill.create_item_from_search_string(search_string, current_items);
        assert.deepEqual(item, expected_item);
    }

    test_create_item("is:starred", [], is_starred_item);
});

run_test("get_search_string", () => {
    assert.equal(search_pill.get_search_string_from_item(is_starred_item), "is:starred");
});

run_test("append", () => {
    let appended;
    let cleared;

    function fake_append(search_string) {
        appended = true;
        assert.equal(search_string, is_starred_item.display_value);
    }

    function fake_clear() {
        cleared = true;
    }

    const pill_widget = {
        appendValue: fake_append,
        clear_text: fake_clear,
    };

    search_pill.append_search_string(is_starred_item.display_value, pill_widget);

    assert.ok(appended);
    assert.ok(cleared);
});

run_test("get_items", () => {
    const items = [is_starred_item, is_private_item];

    const pill_widget = {
        items() {
            return items;
        },
    };

    assert.deepEqual(
        search_pill.get_search_string_for_current_filter(pill_widget),
        is_starred_item.display_value + " " + is_private_item.display_value,
    );
});

run_test("create_pills", ({override_rewire}) => {
    let input_pill_create_called = false;

    override_rewire(input_pill, "create", () => {
        input_pill_create_called = true;
        return {dummy: "dummy"};
    });

    const pills = search_pill.create_pills({});
    assert.ok(input_pill_create_called);
    assert.deepEqual(pills, {dummy: "dummy"});
});
