import { afterEach, describe, expect, it } from 'vitest';
import { bulkSelectionStore } from './bulkSelection.svelte';

describe('bulkSelectionStore', () => {
	afterEach(() => bulkSelectionStore.clear());

	it('starts empty', () => {
		expect(bulkSelectionStore.size).toBe(0);
	});

	it('toggle adds an id when absent', () => {
		bulkSelectionStore.toggle('a');
		expect(bulkSelectionStore.has('a')).toBe(true);
		expect(bulkSelectionStore.size).toBe(1);
	});

	it('toggle removes an id when present', () => {
		bulkSelectionStore.add('a');
		bulkSelectionStore.toggle('a');
		expect(bulkSelectionStore.has('a')).toBe(false);
	});

	it('add and remove update size', () => {
		bulkSelectionStore.add('a');
		bulkSelectionStore.add('b');
		expect(bulkSelectionStore.size).toBe(2);
		bulkSelectionStore.remove('a');
		expect(bulkSelectionStore.size).toBe(1);
		expect(bulkSelectionStore.has('b')).toBe(true);
	});

	it('add is idempotent', () => {
		bulkSelectionStore.add('a');
		bulkSelectionStore.add('a');
		expect(bulkSelectionStore.size).toBe(1);
	});

	it('setAll replaces the selection', () => {
		bulkSelectionStore.add('a');
		bulkSelectionStore.add('b');
		bulkSelectionStore.setAll(['c', 'd', 'e']);
		expect(bulkSelectionStore.size).toBe(3);
		expect(bulkSelectionStore.has('a')).toBe(false);
		expect(bulkSelectionStore.has('c')).toBe(true);
	});

	it('clear empties the selection', () => {
		bulkSelectionStore.add('a');
		bulkSelectionStore.add('b');
		bulkSelectionStore.clear();
		expect(bulkSelectionStore.size).toBe(0);
	});

	it('setAll([]) leaves the store empty (no-op when filter returned zero matches)', () => {
		bulkSelectionStore.add('a');
		bulkSelectionStore.setAll([]);
		expect(bulkSelectionStore.size).toBe(0);
	});

	it('setAll drops all previously selected ids, not just some', () => {
		bulkSelectionStore.add('a');
		bulkSelectionStore.add('b');
		bulkSelectionStore.setAll(['c', 'd']);
		expect(bulkSelectionStore.has('a')).toBe(false);
		expect(bulkSelectionStore.has('b')).toBe(false);
		expect(bulkSelectionStore.has('c')).toBe(true);
		expect(bulkSelectionStore.has('d')).toBe(true);
	});

	it('ids getter exposes the current SvelteSet', () => {
		bulkSelectionStore.add('a');
		bulkSelectionStore.add('b');
		const ids = Array.from(bulkSelectionStore.ids);
		expect(ids.sort()).toEqual(['a', 'b']);
	});
});
