import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';
import { homedir } from 'node:os';
import { McpctlConfigSchema, DEFAULT_CONFIG } from './schema.js';
import type { McpctlConfig } from './schema.js';

export interface ConfigLoaderDeps {
  configDir: string;
}

function defaultConfigDir(): string {
  return join(homedir(), '.mcpctl');
}

export function getConfigPath(configDir?: string): string {
  return join(configDir ?? defaultConfigDir(), 'config.json');
}

export function loadConfig(deps?: Partial<ConfigLoaderDeps>): McpctlConfig {
  const configPath = getConfigPath(deps?.configDir);

  if (!existsSync(configPath)) {
    return DEFAULT_CONFIG;
  }

  const raw = readFileSync(configPath, 'utf-8');
  const parsed = JSON.parse(raw) as unknown;
  return McpctlConfigSchema.parse(parsed);
}

export function saveConfig(config: McpctlConfig, deps?: Partial<ConfigLoaderDeps>): void {
  const dir = deps?.configDir ?? defaultConfigDir();
  const configPath = getConfigPath(dir);

  if (!existsSync(dir)) {
    mkdirSync(dir, { recursive: true });
  }

  writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
}

export function mergeConfig(overrides: Partial<McpctlConfig>, deps?: Partial<ConfigLoaderDeps>): McpctlConfig {
  const current = loadConfig(deps);
  return McpctlConfigSchema.parse({ ...current, ...overrides });
}
