<?php

namespace App\Traits;

use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

use App\Jobs\{PhotoDelete,VideoDelete};

/**
 * Multimedia Controller Functions
 *
 * @package App\Traits
 */
trait Multimedia
{
	use Type;

	private function controller(string $type): string
	{
		switch (strtolower($type)) {
			case 'photo': return 'PhotoController';
			case 'video': return 'VideoController';
			default: abort(500,'Type not handled?');
		}
	}

	public function deletesUpdate(Request $request)
	{
		$class = $this->getModelType($request->input('type'));
		$this->updatePostItems($request,$class,TRUE);

		return redirect()->action(
			sprintf('%s@deletes',$this->controller($request->input('type'))),
			sprintf('?page=%s',$request->input('page'))
		);
	}

	public function duplicatesUpdate(Request $request)
	{
		$class = $this->getModelType($request->input('type'));
		$this->updatePostItems($request,$class);

		return redirect()->action(
			sprintf('%s@duplicates',$this->controller($request->input('type'))),
			sprintf('?page=%s',$request->input('page'))
		);
	}

	private function updatePostItems(Request $request,string $class,bool $delete=FALSE)
	{
		foreach ($request->input('items') as $id) {
			try {
				$o = $class::findOrFail($id);
			} catch (ModelNotFoundException $e) {
				Log::alert('Object not found: '.$id);
				continue;
			} catch (\Exception $e) {
				dd($e);
			}

			// Set if duplicate
			$o->duplicate = $request->input('duplicate.'.$id) ? 1 : NULL;

			// Set if ignore duplicate
			$o->ignore_duplicate = $request->input('ignore_duplicate.'.$id) ? 1 : NULL;

			// Set if flag
			$o->flag = $request->input('flag.'.$id) ? 1 : NULL;

			// Set if delete
			if ($delete AND $o->remove AND ($request->input('remove.'.$id) ? 1 : NULL)) {
				switch (strtolower($request->input('type'))) {
					case 'photo':
						$this->dispatch((new PhotoDelete($o))->onQueue('delete'));
						Log::info(sprintf('Dispatching delete for [%s]',$o->id));
						break;

					case 'video':
						$this->dispatch((new VideoDelete($o))->onQueue('delete'));
						Log::info(sprintf('Dispatching delete for [%s]',$o->id));
						break;

					default:
						Log::info(sprintf('Ignoring delete for [%s] - not configured (%s).',$o->id,$class));
				}

			} else {
				$o->remove = $request->input('remove.'.$id) ? 1 : NULL;
			}

			$o->save();
		}
	}
}