<?php

namespace App\Packages\Capsule\Services;

use App\Packages\Capsule\Models\CapsuleTeaser;
use GrahamCampbell\Flysystem\FlysystemManager;
use Illuminate\Http\UploadedFile;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Filesystem;

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

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

	/**
	 * @param UploadedFile $file
	 *
	 * @return CapsuleTeaser
	 */
	public function createCapsuleVideoRecord(UploadedFile $file)
	{
		//$fileContent = file_get_contents($file);
		$capsuleTeaser = CapsuleTeaser::createFileData(
		//	md5($fileContent),
            "",
			$file->getClientOriginalExtension(),
			$file->getMimeType(),
			$file->getSize()
		);

		return $capsuleTeaser;
	}

    /**
     * @param CapsuleTeaser $capsuleTeaser
     * @param UploadedFile $file
     *
     * @return bool
     *
     * @throws \League\Flysystem\FileExistsException
     */
	public function uploadTeaserStream(CapsuleTeaser $capsuleTeaser, UploadedFile $file)
	{
		/** Generate filename */
		$name = $capsuleTeaser->generateName();

		/** @var Filesystem $spacesConnection */
		$spacesConnection = $this->flySystemManager->connection('teaser');
        $stream = fopen($file->getRealPath(), 'r+');
		$response = $spacesConnection->writeStream(
			$name,  $stream, ['visibility' => 'public']
		);
        fclose($stream);

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

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

		return $response;
	}

    /**
     * @param CapsuleTeaser $capsuleTeaser
     * @param UploadedFile $file
     * @return bool
     * @throws \Exception
     */
    public function uploadTeaserContent(CapsuleTeaser $capsuleTeaser, UploadedFile $file)
    {
        /** Generate filename */
        $name = $capsuleTeaser->generateName();

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

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

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

        return $response;
    }

    /**
     * @param CapsuleTeaser $capsuleTeaser
     *
     * @return bool
     *
     * @throws \League\Flysystem\FileNotFoundException
     */
	public function removeUploadedTeaser(CapsuleTeaser $capsuleTeaser)
    {
        /** @var Filesystem $spacesConnection */
        $spacesConnection = $this->flySystemManager->connection('teaser');
        $response = $spacesConnection->delete(
            $capsuleTeaser->aws_key
        );

        return $response;
    }

    /**
     * @param string $aws_key
     * @return bool
     */
    public function checkIfExist($aws_key)
    {
        /** @var Filesystem $spacesConnection */
        $spacesConnection = $this->flySystemManager->connection('teaser');
        /** @var AwsS3Adapter $adapter */
        $adapter = $spacesConnection->getAdapter();
        $size = $adapter->getSize($aws_key);

        return (bool) $size;
    }
}
