// @vitest-environment jsdom
/// <reference types="@vitest/browser/matchers" />
import '@testing-library/jest-dom/vitest';
import { WORKSPACE_STORAGE_TYPE } from '@learnitive/constants';
import { renderWithServices } from '@learnitive/test-utils';
import { screen, waitFor, within } from '@testing-library/react';
import React, { act } from 'react';
import { describe, expect, it, vi } from 'vitest';
import { WorkspacesSettingsPage } from '../page-settings-workspaces';

const WORKSPACE_WITH_NOTE = 'ws-with-note';
const EMPTY_WORKSPACE = 'ws-empty';

async function setupWorkspaces(
  services: Awaited<
    ReturnType<ReturnType<typeof renderWithServices>['autoMountServices']>
  >,
) {
  await act(async () => {
    await services.workspaceOps.createWorkspaceInfo({
      name: WORKSPACE_WITH_NOTE,
      type: WORKSPACE_STORAGE_TYPE.Memory,
      metadata: {},
    });
    await services.workspaceOps.createWorkspaceInfo({
      name: EMPTY_WORKSPACE,
      type: WORKSPACE_STORAGE_TYPE.Memory,
      metadata: {},
    });
    await services.fileSystem.createTextFile(
      `${WORKSPACE_WITH_NOTE}:note1.md`,
      '# note1',
    );
  });
}

function noteCellFor(wsName: string): HTMLElement {
  const nameLink = screen.getByRole('link', { name: wsName });
  const infoCell = nameLink.parentElement;
  if (!infoCell) {
    throw new Error(`Could not find info cell for workspace ${wsName}`);
  }
  return infoCell;
}

describe('WorkspacesSettingsPage', () => {
  it('shows per-workspace note counts scoped to each row', async () => {
    const testRender = renderWithServices();
    const services = await testRender.autoMountServices();
    await setupWorkspaces(services);

    testRender.mountComponent({ ui: <WorkspacesSettingsPage /> });

    await waitFor(() => {
      expect(
        within(noteCellFor(WORKSPACE_WITH_NOTE)).getByText('1 file'),
      ).toBeInTheDocument();
    });
    expect(
      within(noteCellFor(EMPTY_WORKSPACE)).getByText('0 files'),
    ).toBeInTheDocument();
  });

  it('shows "Files unavailable" instead of "0 files" when the count fails to load', async () => {
    const testRender = renderWithServices();
    const services = await testRender.autoMountServices();
    await setupWorkspaces(services);

    // A read/permission failure must never be presented as an empty ("0 files")
    // workspace — it must surface as unavailable.
    vi.spyOn(services.fileSystem, 'listNoteFiles').mockRejectedValue(
      new Error('listing failed'),
    );

    testRender.mountComponent({ ui: <WorkspacesSettingsPage /> });

    await waitFor(() => {
      expect(
        within(noteCellFor(WORKSPACE_WITH_NOTE)).getByText('Files unavailable'),
      ).toBeInTheDocument();
    });
    expect(
      within(noteCellFor(EMPTY_WORKSPACE)).getByText('Files unavailable'),
    ).toBeInTheDocument();
    expect(screen.queryByText('0 files')).not.toBeInTheDocument();
    expect(screen.queryByText('1 file')).not.toBeInTheDocument();
  });
});
