<?php

declare(strict_types=1);

namespace VK;

use  \VK\Core,
    \VK\Robots\RobotAbstract,
    \VK\Robots\Group,
    \VK\Robots\User,
    \VK\Loggers\Jasmo;

/**
 * Сборщик
 * 
 * @property Core $core Ядро
 * 
 * @method public function __construct(Core $core = null) Инициализация
 * @method public function group() Создание робота-группы
 * @method public function user() Создание робота-пользователя
 * @method private function reg() Регистрация в ядре
 * @method public function log(string $file = null) Журналирование
 * 
 * @package VK\Builder
 * @author Arsen Mirzaev <red@hood.su>
 */
class Builder
{
    /**
     * Инициализация
     * 
     * @param Core $core Ядро
     */
    public function __construct(Core $core = null)
    {
        if (isset($core)) {
            $this->core = $core::init();
        }
    }

    /**
     * Создание робота-группы
     * 
     * @param int $id Идентификатор
     * 
     * @return Group
     */
    public function group(int $id): Group
    {
        // Создание робота
        $robot = new Group();

        // Идентификатор
        $robot->id = $id;

        // Сессия
        $robot->session = isset($this->core) ? count($this->core->get($id)) : 0;

        return isset($this->core) ? $this->reg($robot) : $robot;
    }

    /**
     * Создание робота-пользователя
     * 
     * @param int $id Идентификатор
     * 
     * @return User
     */
    public function user(): User
    {
        return $this->reg(new User());
    }

    /**
     * Регистрация в ядре
     * 
     * @param RobotAbstract $robot Регистрируемый робот
     * 
     * @return RobotAbstract
     * 
     * @todo Добавить создание нового процесса (многопоточность)
     */
    private function reg(RobotAbstract $robot): RobotAbstract
    {
        // Регистрация в ядре
        $this->core->set((int) $robot->id, $robot);

        // Количество роботов
        ++$this->core->robots;

        return $robot;
    }

    /**
     * Журналирование
     * 
     * @param string $file Файл для журналирования
     * 
     * @return Builder
     * 
     * @todo Добавить установку иного журналиста по спецификации PSR-3
     * @todo Более гибкое журналирование
     */
    public function log(string $file = null): Builder
    {
        // Инициализация журналиста (требует переработки)
        Jasmo::init()::post($file)::postErrorHandler()::postShutdownHandler();

        return $this;
    }
}