<?php

/**
 * This file is part of RSS-Bridge, a PHP project capable of generating RSS and
 * Atom feeds for websites that don't have one.
 *
 * For the full license information, please view the UNLICENSE file distributed
 * with this source code.
 *
 * @package Core
 * @license https://unlicense.org/ UNLICENSE
 * @link    https://github.com/rss-bridge/rss-bridge
 */

/**
 * An abstract class for format implementations
 *
 * This class implements {@see FormatInterface}
 */
abstract class FormatAbstract implements FormatInterface
{
    /** The default charset (UTF-8) */
    const DEFAULT_CHARSET = 'UTF-8';

    /** MIME type of format output */
    const MIME_TYPE = 'text/plain';

    /** @var string $charset The charset */
    protected $charset;

    /** @var array $items The items */
    protected $items;

    /**
     * @var int $lastModified A timestamp to indicate the last modified time of
     * the output data.
     */
    protected $lastModified;

    /** @var array $extraInfos The extra infos */
    protected $extraInfos;

    /** {@inheritdoc} */
    public function getMimeType()
    {
        return static::MIME_TYPE;
    }

    /**
     * {@inheritdoc}
     *
     * @param string $charset {@inheritdoc}
     */
    public function setCharset($charset)
    {
        $this->charset = $charset;

        return $this;
    }

    /** {@inheritdoc} */
    public function getCharset()
    {
        $charset = $this->charset;

        if (is_null($charset)) {
            return static::DEFAULT_CHARSET;
        }
        return $charset;
    }

    /**
     * Set the last modified time
     *
     * @param int $lastModified The last modified time
     * @return void
     */
    public function setLastModified($lastModified)
    {
        $this->lastModified = $lastModified;
    }

    /**
     * {@inheritdoc}
     *
     * @param array $items {@inheritdoc}
     */
    public function setItems(array $items)
    {
        $this->items = $items;

        return $this;
    }

    /** {@inheritdoc} */
    public function getItems()
    {
        if (!is_array($this->items)) {
            throw new \LogicException(sprintf('Feed the %s with "setItems" method before !', get_class($this)));
        }

        return $this->items;
    }

    /**
     * {@inheritdoc}
     *
     * @param array $extraInfos {@inheritdoc}
     */
    public function setExtraInfos(array $extraInfos = [])
    {
        foreach (['name', 'uri', 'icon', 'donationUri'] as $infoName) {
            if (!isset($extraInfos[$infoName])) {
                $extraInfos[$infoName] = '';
            }
        }

        $this->extraInfos = $extraInfos;

        return $this;
    }

    /** {@inheritdoc} */
    public function getExtraInfos()
    {
        if (is_null($this->extraInfos)) { // No extra info ?
            $this->setExtraInfos(); // Define with default value
        }

        return $this->extraInfos;
    }
}