import { describe, it, expect } from 'vitest';
import { interpolateEnvVars, ConfigLoader } from '@zyphon/config-loader';
import path from 'node:path';

describe('Config Loader & Interpolator', () => {
  it('interpolates environment variables properly', () => {
    const env = {
      APP_PORT: '8080',
      APP_NAME: 'ZyphonGateway',
    };

    const input = {
      port: '${APP_PORT}',
      name: '${APP_NAME}',
      description: 'Running on port ${APP_PORT}',
      nested: {
        endpoint: 'http://${APP_NAME}:${APP_PORT}/api',
      },
    };

    const output = interpolateEnvVars(input, env) as any;
    expect(output.port).toBe('8080');
    expect(output.name).toBe('ZyphonGateway');
    expect(output.description).toBe('Running on port 8080');
    expect(output.nested.endpoint).toBe('http://ZyphonGateway:8080/api');
  });

  it('uses default fallback values when env vars are missing', () => {
    const input = {
      host: '${NON_EXISTENT_HOST:-127.0.0.1}',
      timeout: '${TIMEOUT_MS:-5000}',
    };

    const output = interpolateEnvVars(input, {}) as any;
    expect(output.host).toBe('127.0.0.1');
    expect(output.timeout).toBe('5000');
  });

  it('successfully loads and validates actual cluster configs', () => {
    const configDir = path.resolve(__dirname, '../../config');
    const stateDir = path.resolve(__dirname, '../../data/state');
    const loader = new ConfigLoader(configDir, stateDir);

    const cluster = loader.loadClusterConfig();
    expect(cluster.server).toBeDefined();
    expect(Array.isArray(cluster.applications)).toBe(true);
    expect(Array.isArray(cluster.providers)).toBe(true);
    expect(Array.isArray(cluster.routing.default.email)).toBe(true);
    expect(cluster.policies.queue_size).toBe(500);
  });
});

