<?php
namespace nur\data\template;

use nur\b\io\FileReader;
use nur\b\io\IReader;
use nur\b\io\IWriter;
use nur\b\ValueException;
use nur\data\expr\SimpleContext;

class StreamTemplate extends SimpleContext implements ITemplate {
  use TTemplate;

  /**
   * retourner un nom de fichier à utiliser par défaut en entrée si l'argument
   * $input n'est pas spécifié.
   */
  protected function INPUT(): ?string {
    return static::INPUT;
  } const INPUT = null;

  /** @var IReader */
  private $input;

  /** @var IWriter */
  private $output;

  /** @var bool */
  private $autoClose;

  function __construct(IWriter $output, ?IReader $input=null, bool $autoClose=true) {
    parent::__construct();
    $this->input = $input;
    $this->output = $output;
    $this->autoClose = $autoClose;
    $this->context = $this;
  }

  protected function ensureInput(): IReader {
    $input = $this->input;
    if ($input === null) {
      $input = $this->INPUT();
      if ($input === null) {
        throw new ValueException("input is required");
      }
      $input = new FileReader($input);
    }
    return $input;
  }

  /** retourner true */
  function apply() {
    $context = $this->getContext();
    $input = $this->ensureInput();
    $output = $this->output;
    foreach ($input as $line) {
      $line = $this->applyRules($line, $context);
      $output->wnl($line);
    }
    $output->close($this->autoClose);
    return true;
  }
}
