<?php

namespace oat\tao\test\integration;

use oat\generis\test\GenerisPhpUnitTestRunner;
use oat\oatbox\filesystem\FileSystemService;
use Zend\ServiceManager\ServiceLocatorInterface;

abstract class FileStorageTestCase extends GenerisPhpUnitTestRunner
{
    protected $privateDir;
    protected $adapterFixture;

    /**
     * tests initialization
     */
    public function setUp(): void
    {
        $this->privateDir = \tao_helpers_File::createTempDir();
        $this->adapterFixture = 'adapterFixture';
    }

    /**
     * Remove directory of $adapterFixture
     */
    public function tearDown(): void
    {
        \tao_helpers_File::delTree($this->privateDir);
    }

    /**
     * Create serviceLocator with custom filesystem using adapter for sample
     * Two adapters needed to reflect private/public dir
     *
     * @return object
     */
    protected function getServiceLocatorWithFileSystem()
    {
        $adaptersFixture =  [
            'adapters' =>  [
                $this->adapterFixture => [
                    'class' => 'Local',
                    'options' => [
                        'root' => $this->privateDir
                    ]
                ]
            ]
        ];

        $fileSystemService = new FileSystemService($adaptersFixture);

        $smProphecy = $this->prophesize(ServiceLocatorInterface::class);
        $smProphecy->get(FileSystemService::SERVICE_ID)->willReturn($fileSystemService);
        return $smProphecy->reveal();
    }

    /**
     * Get file storage to test
     * Set service locator to have fileSystem with test adapters
     * Set publicFs & privateFs to match with adapters
     *
     * @return \tao_models_classes_service_FileStorage
     */
    public function getFileStorage()
    {
        $fileStorage = new \tao_models_classes_service_FileStorage([
            \tao_models_classes_service_FileStorage::OPTION_PRIVATE_FS => $this->adapterFixture
        ]);
        $fileStorage->setServiceLocator($this->getServiceLocatorWithFileSystem());

        return $fileStorage;
    }
}