<?php

/**
 * ロガークラス
 *
 */
class Logger
{
    /** @var Logger $singleton */
    private static Logger $singleton;

    /** @var string[] $logs ログ */
    private array $logs = [];

    /** @var string 改行 */
    private string $eol = PHP_EOL;

    /**
     * ログを追加
     *
     * @param string|Stringable $message
     * @return void
     */
    public static function add(string|Stringable $message): void
    {
        if ($message instanceof Stringable) {
            $message = (string) $message;
        }

        self::getInstance()->logs[] = $message;
    }

    /**
     * ログ出力
     *
     * @return void
     */
    public static function output(): void
    {
        $singleton = self::getInstance();
        foreach ($singleton->logs as $log) {
            echo $log . $singleton->eol;
        }
    }

    /**
     * 改行設定
     *
     * @param string $eol
     * @return void
     */
    public static function setEol(string $eol): void
    {
        self::getInstance()->eol = $eol;
    }

    /**
     * constructor
     */
    private function __construct()
    {
    }

    /**
     * __clone
     *
     * @return void
     */
    private function __clone(): void
    {
    }

    /**
     * インスタンス取得
     *
     * @return self
     */
    private static function getInstance(): self
    {
        if (isset(self::$singleton)) {
            return self::$singleton;
        }

        return self::$singleton = new self();
    }
}