import { afterEach, describe, expect, test } from 'bun:test';
import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { _testHelpers } from '../../src/commands/schema.ts';
import { withEnv } from '../helpers/with-env.ts';

const tempDirs: string[] = [];

function tempDir(prefix: string): string {
  const dir = mkdtempSync(join(tmpdir(), prefix));
  tempDirs.push(dir);
  return dir;
}

afterEach(() => {
  for (const dir of tempDirs.splice(0)) {
    rmSync(dir, { recursive: true, force: true });
  }
});

describe('schema packPathByName', () => {
  test('resolves all bundled schema pack names to bundled YAML files', () => {
    for (const name of ['gbrain-base', 'gbrain-recommended', 'gbrain-base-v2']) {
      const path = _testHelpers.packPathByName(name);
      expect(path).toBeTruthy();
      // The resolved path is native-format, so it ends with `src\core\...`
      // on Windows. Only the separator comes from `path`; the directory
      // structure stays hand-written. Byte-identical on POSIX.
      expect(path!.endsWith(join('src', 'core', 'schema-pack', 'base', `${name}.yaml`))).toBe(
        true,
      );
      expect(existsSync(path!)).toBe(true);
    }
  });

  test('returns null for an unknown non-bundled pack name', async () => {
    const home = tempDir('gbrain-packpath-home-');
    await withEnv({ GBRAIN_HOME: home }, async () => {
      expect(_testHelpers.packPathByName('definitely-not-a-pack')).toBeNull();
    });
  });

  test('resolves a user-installed pack by name', async () => {
    const home = tempDir('gbrain-packpath-home-');
    await withEnv({ GBRAIN_HOME: home }, async () => {
      const packDir = join(home, '.gbrain', 'schema-packs', 'custom-pack');
      mkdirSync(packDir, { recursive: true });
      const packPath = join(packDir, 'pack.yaml');
      writeFileSync(packPath, 'name: custom-pack\n', 'utf-8');

      expect(_testHelpers.packPathByName('custom-pack')).toBe(packPath);
    });
  });
});
