import { describe, expect, it, vi } from 'vitest';
import { probeVault } from '../probe';
import type { GitHost } from '../../service-worker/git-host';

function fakeHost(opts: {
  relicarioFiles?: string[];
  rootFiles?: string[];
  commit?: { sha: string; author: string; date: string } | null;
} = {}): GitHost {
  return {
    listDir: vi.fn().mockImplementation(async (p: string) => {
      if (p === '.relicario') return opts.relicarioFiles ?? [];
      if (p === '') return opts.rootFiles ?? [];
      return [];
    }),
    lastCommit: vi.fn().mockResolvedValue(opts.commit ?? null),
    readFile: vi.fn(), writeFile: vi.fn(), writeFileCreateOnly: vi.fn(),
    deleteFile: vi.fn(), putBlob: vi.fn(), getBlob: vi.fn(), deleteBlob: vi.fn(),
  };
}

describe('probeVault', () => {
  it('reports exists=false when repo is empty', async () => {
    const host = fakeHost();
    expect(await probeVault(host)).toEqual({ exists: false });
  });

  it('reports exists=true when manifest.enc is present', async () => {
    const host = fakeHost({
      rootFiles: ['manifest.enc', 'README.md'],
      commit: { sha: 'abc1234', author: 'Alice', date: '2026-04-20T12:00:00Z' },
    });
    const result = await probeVault(host);
    expect(result.exists).toBe(true);
    expect(result.lastCommit?.author).toBe('Alice');
  });

  it('reports exists=true when only .relicario/salt is present (partial init)', async () => {
    const host = fakeHost({ relicarioFiles: ['salt'] });
    expect((await probeVault(host)).exists).toBe(true);
  });

  it('omits lastCommit field when API returns null', async () => {
    const host = fakeHost({ rootFiles: ['manifest.enc'], commit: null });
    const result = await probeVault(host);
    expect(result.exists).toBe(true);
    expect(result.lastCommit).toBeUndefined();
  });
});
