<?php

namespace Rubix\ML\Loggers;

use Stringable;

use function trim;
use function date;
use function strtoupper;

/**
 * Screen
 *
 * A logger that displays log messages to the standard output.
 *
 * @category    Machine Learning
 * @package     Rubix/ML
 * @author      Andrew DalPino
 */
class Screen extends Logger
{
    /**
     * The channel name that appears on each line.
     *
     * @var string
     */
    protected string $channel;

    /**
     * The format of the timestamp.
     *
     * @var string
     */
    protected string $timestampFormat;

    /**
     * @param string $channel
     * @param string $timestampFormat
     */
    public function __construct(string $channel = '', string $timestampFormat = 'Y-m-d H:i:s')
    {
        $this->channel = trim($channel);
        $this->timestampFormat = $timestampFormat;
    }

    /**
     * Logs with an arbitrary level.
     *
     * @param mixed $level
     * @param string|Stringable $message
     * @param mixed[] $context
     */
    public function log($level, string|Stringable $message, array $context = []) : void
    {
        $prefix = '';

        if ($this->timestampFormat) {
            $prefix .= '[' . date($this->timestampFormat) . '] ';
        }

        if ($this->channel) {
            $prefix .= $this->channel . '.';
        }

        $prefix .= strtoupper((string) $level);

        echo $prefix . ': ' . trim((string) $message) . PHP_EOL;
    }
}
