<?php
namespace nur\mapper\base;

use nur\cli\DynamicCommand;
use nur\mapper\csv\Assoc2CsvMapper_command;
use nur\mapper\csv\Csv2AssocMapper_command;
use nur\mapper\fsv\Assoc2FsvMapper_command;
use nur\mapper\fsv\Fsv2AssocMapper_command;
use nur\mapper\item\Assoc2SeqMapper_command;
use nur\mapper\item\AttributeFilterMapper_command;
use nur\mapper\item\GenericMapper_command;
use nur\mapper\item\ItemFilterMapper_command;
use nur\mapper\item\NumberMapper_command;
use nur\mapper\item\SchemaMapper_command;
use nur\mapper\item\Seq2AssocMapper_command;
use nur\mapper\item\StreamMapper_command;
use nur\mapper\item\StringMapper_command;
use nur\mapper\item\TextMapper_command;
use nur\mapper\line\IconvMapper_command;

/**
 * Class mappers_command: classe de support pour construire un ensemble de
 * mappers pour une application recevant des commandes utilisateurs
 */
class mappers_command extends DynamicCommand {
  const PRODUCER_CLASSES = [
  ];
  const CONSUMER_CLASSES = [
  ];
  const MAPPER_CLASSES = [
    # base
    FuncMapper_command::class,
    # item
    StreamMapper_command::class,
    StringMapper_command::class,
    TextMapper_command::class,
    NumberMapper_command::class,
    GenericMapper_command::class,
    Seq2AssocMapper_command::class,
    SchemaMapper_command::class,
    ItemFilterMapper_command::class,
    AttributeFilterMapper_command::class,
    Assoc2SeqMapper_command::class,
    # line
    IconvMapper_command::class,
    # csv
    Csv2AssocMapper_command::class,
    Assoc2CsvMapper_command::class,
    # fsv
    Fsv2AssocMapper_command::class,
    Assoc2FsvMapper_command::class,
  ];

  protected function DYNAMIC_COMMAND_CLASSES(): array {
    return array_merge(self::PRODUCER_CLASSES, self::CONSUMER_CLASSES, self::MAPPER_CLASSES);
  }

  function COMMANDS(): array {
    $commands = [];
    foreach ($this->DYNAMIC_COMMAND_CLASSES() as $cc) {
      $commands[] = $cc::get_def();
    }
    return $commands;
  }

  static $mappers = [];

  static function add(Mapper $mapper): Mapper {
    self::$mappers[] = $mapper;
    return $mapper;
  }
}
