import { test } from 'node:test';
import assert from 'node:assert';
import {
  decrementProjectSessionCount,
  loadSidebarViewMode,
  saveSidebarViewMode,
  sidebarProjectScopes,
} from './sidebarView.ts';

test('sidebar view defaults to workspace and accepts only the flat preference', () => {
  assert.equal(loadSidebarViewMode(null), 'workspace');
  assert.equal(loadSidebarViewMode({ getItem: () => 'workspace', setItem() {} }), 'workspace');
  assert.equal(loadSidebarViewMode({ getItem: () => 'flat', setItem() {} }), 'flat');
  assert.equal(loadSidebarViewMode({ getItem: () => 'unexpected', setItem() {} }), 'workspace');
});

test('sidebar view preference is persisted without making storage mandatory', () => {
  let saved = '';
  saveSidebarViewMode('flat', {
    getItem: () => null,
    setItem: (_key, value) => { saved = value; },
  });
  assert.equal(saved, 'flat');

  assert.doesNotThrow(() => saveSidebarViewMode('workspace', {
    getItem: () => null,
    setItem: () => { throw new Error('storage disabled'); },
}));
});

test('workspace view loads requested expanded buckets while flat view uses the global feed', () => {
  assert.deepEqual(sidebarProjectScopes('workspace', ['project-1', 'project-2']), [
    'project-1',
    'project-2',
  ]);
  assert.deepEqual(sidebarProjectScopes('workspace', ['', 'project-2', 'project-2']), ['project-2']);
  assert.deepEqual(sidebarProjectScopes('flat', ['project-1']), []);
});

test('successful deletion decrements only the matching project summary', () => {
  const projects = [
    { hash: 'project-1', session_count: 2, name: 'one' },
    { hash: 'project-2', session_count: 4, name: 'two' },
  ];

  assert.deepEqual(decrementProjectSessionCount(projects, 'project-1'), [
    { hash: 'project-1', session_count: 1, name: 'one' },
    { hash: 'project-2', session_count: 4, name: 'two' },
  ]);
  assert.equal(projects[0].session_count, 2);
});

test('project session count never becomes negative', () => {
  const projects = [{ hash: 'project-1', session_count: 0 }];
  assert.deepEqual(decrementProjectSessionCount(projects, 'project-1'), [
    { hash: 'project-1', session_count: 0 },
  ]);
});