<?php

namespace App\Packages\v4\Capsule\Services;

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

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

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

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

		return $capsuleVideo;
	}

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

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

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

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

		return $response;
	}

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

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

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

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

        return $response;
    }

    /**
     * @param CapsuleVideo $capsuleVideo
     *
     * @return bool
     *
     * @throws \League\Flysystem\FileNotFoundException
     */
	public function removeUploadedVideo(CapsuleVideo $capsuleVideo)
    {
        /** @var Filesystem $spacesConnection */
        $spacesConnection = $this->flySystemManager->connection('video');
        $response = $spacesConnection->delete(
            $capsuleVideo->aws_key
        );

        return $response;
    }
}
