<?php

namespace App\Packages\Capsule\Services;

use App\Packages\Capsule\Models\CapsulePreview;
use App\Packages\Capsule\Models\CapsuleVideo;
use GrahamCampbell\Flysystem\FlysystemManager;
use Intervention\Image\ImageManager;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\FileNotFoundException;
use League\Flysystem\Filesystem;
use Ramsey\Uuid\Uuid;

/**
 * Class CapsuleUploadService
 * @package App\Packages\Capsule\Services
 */
class CapsuleImageUploadService
{
	/** @var FlysystemManager */
	public $flySystemManager;

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

	/**
	 * @param CapsuleVideo $capsuleVideo
	 * @param string $fileContent
	 *
	 * @return bool
	 */
	public function uploadVideo(CapsuleVideo $capsuleVideo, $fileContent)
	{
		/** Generate filename */
		$name = $capsuleVideo->generateName();

		/** @var Filesystem $spacesConnection */
		$spacesConnection = $this->flySystemManager->connection('video');
		$response = $spacesConnection->put($name, $fileContent, [
			'visibility' => 'public',
		]);

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

			$capsuleVideo->aws_key = $name;
			$capsuleVideo->aws_bucket = $adapter->getBucket();
			$capsuleVideo->save();
		}

		return $response;
	}

	/**
	 * @param CapsulePreview $capsulePreview
	 * @param string $fileContent
	 *
	 * @return bool
	 */
	public function uploadPreview(CapsulePreview $capsulePreview, $fileContent)
	{
		/** Generate filename */
		$name = $capsulePreview->generateName();

		/** @var Filesystem $spacesConnection */
		$spacesConnection = $this->flySystemManager->connection('preview');
		$response = $spacesConnection->put($name, $fileContent, [
			'visibility' => 'public',
		]);

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

			$capsulePreview->aws_key = $name;
			$capsulePreview->aws_bucket = $adapter->getBucket();
			$capsulePreview->save();
		}

		return $response;
	}

	/**
	 * @param CapsulePreview $capsulePreview
	 * @param string $fileContent
	 *
	 * @return bool
	 */
	public function uploadPreviewThumbnail(CapsulePreview $capsulePreview, $fileContent)
	{
		/** Generate filename */
		$name = $capsulePreview->generateName();

		/** @var Filesystem $spacesConnection */
		$spacesConnection = $this->flySystemManager->connection('preview');
		$response = $spacesConnection->put($name, $fileContent, [
			'visibility' => 'public',
		]);

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

			$capsulePreview->aws_key = $name;
			$capsulePreview->aws_bucket = $adapter->getBucket();
			$capsulePreview->save();
		}

		return $response;
	}

    /**
     * @param CapsulePreview $capsulePreview
     *
     * @return bool
     *
     * @throws FileNotFoundException
     */
    public function removeUploadedImage(CapsulePreview $capsulePreview)
    {
        /** @var Filesystem $spacesConnection */
        $spacesConnection = $this->flySystemManager->connection('preview');

        // catch exception
        $response = $spacesConnection->delete(
            $capsulePreview->aws_key
        );

        return $response;
    }
}
