import { describe, it, expect, vi, beforeEach } from 'vitest';
import { checkHealth, checkHealthDetailed } from './health.js';

const BASE_URL = 'http://localhost:11434';

describe('checkHealth', () => {
  beforeEach(() => {
    vi.restoreAllMocks();
  });

  it('returns true when server is healthy', async () => {
    globalThis.fetch = vi.fn().mockResolvedValue({ ok: true });
    expect(await checkHealth(BASE_URL)).toBe(true);
  });

  it('returns false when server returns non-ok', async () => {
    globalThis.fetch = vi.fn().mockResolvedValue({ ok: false });
    expect(await checkHealth(BASE_URL)).toBe(false);
  });

  it('returns false when fetch throws', async () => {
    globalThis.fetch = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));
    expect(await checkHealth(BASE_URL)).toBe(false);
  });
});

describe('checkHealthDetailed', () => {
  beforeEach(() => {
    vi.restoreAllMocks();
  });

  it('returns online + version when server is healthy', async () => {
    globalThis.fetch = vi.fn().mockImplementation((url: string) => {
      if (url.includes('/api/tags')) return Promise.resolve({ ok: true });
      if (url.includes('/api/version'))
        return Promise.resolve({
          ok: true,
          json: () => Promise.resolve({ version: '0.5.4' }),
        });
      return Promise.reject(new Error('unexpected'));
    });

    const result = await checkHealthDetailed(BASE_URL);
    expect(result).toEqual({ online: true, version: '0.5.4', url: BASE_URL });
  });

  it('returns offline when server is unreachable', async () => {
    globalThis.fetch = vi.fn().mockRejectedValue(new Error('ECONNREFUSED'));

    const result = await checkHealthDetailed(BASE_URL);
    expect(result).toEqual({ online: false, version: null, url: BASE_URL });
  });
});
