/**
 * Formatter Registry
 * ------------------
 * Maps format names to formatter modules.
 * Each formatter exports: format(measurement, metadata) => string|object
 *
 * Usage:
 *   const { getFormatter, registerFormatter } = require('./formatters');
 *   const fmt = getFormatter('json');
 *   const output = fmt.format('pump1', { fields: {...}, tags: {...} });
 */

const influxdbFormatter = require('./influxdbFormatter');
const jsonFormatter = require('./jsonFormatter');
const csvFormatter = require('./csvFormatter');
const processFormatter = require('./processFormatter');
const frostFormatter = require('./frostFormatter');

// Built-in registry
const registry = {
  influxdb: influxdbFormatter,
  json: jsonFormatter,
  csv: csvFormatter,
  process: processFormatter,
  frost: frostFormatter,
};

/**
 * Retrieve a formatter by name.
 * @param {string} name - Format name (e.g. 'influxdb', 'json', 'csv')
 * @returns {object} Formatter with a .format() method
 * @throws {Error} If the format name is not registered
 */
function getFormatter(name) {
  const formatter = registry[name];
  if (!formatter) {
    throw new Error(`Unknown output format: "${name}". Registered formats: ${Object.keys(registry).join(', ')}`);
  }
  return formatter;
}

/**
 * Register a custom formatter at runtime.
 * @param {string} name      - Format name
 * @param {object} formatter - Object with a .format(measurement, metadata) method
 */
function registerFormatter(name, formatter) {
  if (typeof formatter.format !== 'function') {
    throw new Error('Formatter must have a .format(measurement, metadata) method');
  }
  registry[name] = formatter;
}

/**
 * List all registered format names.
 * @returns {string[]}
 */
function getRegisteredFormats() {
  return Object.keys(registry);
}

module.exports = { getFormatter, registerFormatter, getRegisteredFormats };
