<?php

namespace Grav\Plugin\FlexObjects\Events;

use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
use Grav\Framework\Flex\Interfaces\FlexDirectoryInterface;
use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
use Grav\Framework\Object\Interfaces\ObjectInterface;
use Grav\Plugin\FlexObjects\Controllers\AbstractController;

/**
 * @template T as FlexObjectInterface
 * @template C as FlexCollectionInterface
 */
class FlexTaskEvent
{
    /** @var string */
    public $task;
    /** @var string */
    public $type;
    /** @var string */
    public $key;

    /** @var ObjectInterface */
    private $object;
    /** @var AbstractController */
    private $controller;

    /**
     * @param AbstractController $controller
     * @param string $task
     */
    public function __construct(AbstractController $controller, ObjectInterface $object, string $task)
    {
        $this->task = $task;
        $this->type = $controller->getDirectoryType();
        $this->key = $controller->getObjectKey();
        $this->object = $object;
        $this->controller = $controller;
    }

    /**
     * @return AbstractController
     */
    public function getController(): AbstractController
    {
        return $this->controller;
    }

    /**
     * @return FlexDirectoryInterface
     */
    public function getDirectory(): FlexDirectoryInterface
    {
        return $this->getController()->getDirectory();
    }

    /**
     * @return FlexObjectInterface
     * @phpstan-return T
     */
    public function getModifiedObject(): FlexObjectInterface
    {
        return $this->object;
    }

    /**
     * @return FlexObjectInterface
     * @phpstan-return T
     */
    public function getOriginalObject(): FlexObjectInterface
    {
        return $this->controller->getObject();
    }

    /**
     * @return FlexCollectionInterface
     * @phpstan-return C
     */
    public function getCollection(): FlexCollectionInterface
    {
        return $this->getController()->getDirectory()->getCollection();
    }
}