import { dump as yamlDump } from 'js-yaml';

/**
 * Supported output formats
 */
export type OutputFormat = 'json' | 'yaml' | 'json-minified';

/**
 * Interface for formatters that handle different output formats
 */
export interface IFormatter {
  format(data: unknown): string;
  getMimeType(): string;
}

/**
 * JSON formatter with pretty printing
 */
export class JsonFormatter implements IFormatter {
  format(data: unknown): string {
    return JSON.stringify(data, null, 2);
  }

  getMimeType(): string {
    return 'application/json';
  }
}

/**
 * Formats data as minified JSON.
 */
export class MinifiedJsonFormatter implements IFormatter {
  format(data: unknown): string {
    return JSON.stringify(data);
  }

  getMimeType(): string {
    return 'application/json';
  }
}

/**
 * YAML formatter using js-yaml library
 */
export class YamlFormatter implements IFormatter {
  format(data: unknown): string {
    return yamlDump(data, {
      indent: 2,
      lineWidth: -1, // Don't wrap long lines
      noRefs: true, // Don't use references
    });
  }

  getMimeType(): string {
    return 'text/yaml';
  }
}

/**
 * Creates a formatter instance based on format name
 */
export function createFormatter(format: OutputFormat): IFormatter {
  switch (format) {
    case 'json':
      return new JsonFormatter();
    case 'yaml':
      return new YamlFormatter();
    case 'json-minified':
      return new MinifiedJsonFormatter();
  }
}
