<?php

namespace App\Services\FileSystem;

use App\Packages\File\Models\FileUploaded;
use GrahamCampbell\Flysystem\FlysystemManager;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Filesystem;

/**
 * Class FileSystemUploader
 * @package App\Services\FileSystem
 */
class FileSystemUploader
{
	/** @var FlysystemManager */
	public $flySystemManager;

	/**
	 * FileSystemUploader constructor.
	 *
	 * @param FlysystemManager $flySystemManager
	 */
	public function __construct(FlysystemManager $flySystemManager)
	{
		$this->flySystemManager = $flySystemManager;
	}

	/**
	 * @param FileUploaded $fileUploaded
	 * @param string $fileStream
	 *
	 * @return bool
	 */
	public function uploadToLocalStorage(FileUploaded $fileUploaded, $fileStream)
	{
		/** @var Filesystem $localConnection */
		$localConnection = $this->flySystemManager->connection('local');
		$response = $localConnection->put($fileUploaded->getFullPath(), $fileStream, [
			'visibility' => 'public',
		]);

		if ($response) {
			$fileUploaded->local_folder = $fileUploaded->getFolderPath();
			$fileUploaded->save();
		}

		return $response;
	}

	/**
	 * @param FileUploaded $fileUploaded
	 * @param string $fileStream
	 *
	 * @return bool
	 */
	public function uploadToDigitalOceanSpaces(FileUploaded $fileUploaded, $fileStream)
	{
		/** @var Filesystem $spacesConnection */
		$spacesConnection = $this->flySystemManager->connection('spaces');
		$response = $spacesConnection->put($fileUploaded->getFullFileName(), $fileStream, [
			'visibility' => 'public',
		]);

		if ($response) {
			/** @var AwsS3Adapter $adapter */
			$adapter = $spacesConnection->getAdapter();

			$fileUploaded->do_key = $fileUploaded->getFullFileName();
			$fileUploaded->do_bucket = $adapter->getBucket();
			$fileUploaded->save();
		}

		return $response;
	}
}
