<?php

namespace Dalten\RuianToUir\Writer;

/**
 * Formatter, který vypisuje data do výstupní šložky jako soubory, pojmenované dle converteru, který data přeložil.
 */
class MultipleFiles extends AbstractWriter implements WriterInterface
{
    /**
     * Nastavuje závilosti a konfiguraci.
     *
     * @param \Dalten\RuianToUir\Formatter\FormatterInterface $formatter  instance formatteru
     * @param string                                          $_dirName   název cílového adresáře
     * @param string                                          $_extension přípona tvořených souborů (bez tečky)
     */
    public function __construct(\Dalten\RuianToUir\Formatter\FormatterInterface $formatter, /**
     * Cesta k cílovému adresáři.
     */
        private $_dirName,
        /**
         * Příponatvořených souborů.
         */
        private $_extension = 'txt')
    {
        parent::__construct($formatter);
    }

    /**
     * Zapíše data do souboru dle názvu converteru.
     *
     * @param string $data          zformátovaná data
     * @param string $converterName název converteru, který provedl převod
     *
     * @throws \RuntimeException pokud se nepodaří zápis do souboru
     */
    protected function executeWrite(string $data, string $converterName): void
    {
        $fileName = $this->_getFileName($converterName);
        $result = file_put_contents($fileName, $data.\PHP_EOL, \FILE_APPEND);
        if (false === $result) {
            throw new \RuntimeException(\sprintf('Nepodařil se zápis do souboru %s!', $fileName));
        }
    }

    /**
     * Převede název converteru na cestu k souboru.
     *
     * @param string $converterName název converteru, který provedl převod
     *
     * @return string cesta k cílovému souboru
     */
    private function _getFileName(string $converterName): string
    {
        $name = $this->_dirName.\DIRECTORY_SEPARATOR.$converterName;
        if ($this->_extension) {
            $name .= '.'.$this->_extension;
        }

        return $name;
    }
}
