<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\MediaItemCrop;
use App\Http\Requests\MediaItemList;
use App\Http\Requests\MediaItemUpdate;
use App\Models\MediaItem;
use Illuminate\Http\Request;
use Storage;
use Illuminate\Validation\ValidationException;
use MediaService;
use BackendUserService;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class MediaManagerController extends Controller
{
    public function getList(Request $request)
    {
        $page       = $request->input("current");
        $rowCount   = $request->input("sort");
        $sort       = $request->input("sort");
        $search     = $request->input("searchPhrase");

        $result = MediaService::getMediaListPerPage($page, $rowCount, $sort, $search);
        return Response::json($result);
    }

    public function getMore(MediaItemList $request)
    {
        try {
            $data = $request->validated();
        } catch (ValidationException $e) {
            return response()->json(['rows' => []]);
        }

        $result = MediaService::getMediaListByInfiniteScrolling(
            $data['lastId'],
            $data['rowCount'],
            $data['typeFilter'],
            $data['relatedFilter'],
            $data['searchString']
        );

        return response()->json($result);

    }

    public function postUpload(Request $request, $uploadType = 'media_manager')
    {
        $user = BackendUserService::getLoggedUser();
        $file = $request->file('file');
        $relatedType = $request->input('relatedContentType');

        try {
            $mediaItem = MediaService::uploadMedia($user, $file, $relatedType);
        } catch (HttpException $e) {
            return response()->json($e->getMessage(), $e->getStatusCode());
        }

        if ($uploadType == 'editor') {
            $pathAsset = path_asset('path.frontend.media');

            $editorImage = [
                'url' => $pathAsset . '/' . $mediaItem->filename,
                'id' => $mediaItem->id
            ];

            return response()->json($editorImage, 201);
        } else {
            return response()->json($mediaItem, 201);
        }
    }

    public function getMedia($mediaId)
    {
        $mediaItem = MediaItem::find($mediaId);
        if (!$mediaItem) {
            return response()->json(null);
        }
        return response()->json($mediaItem);
    }

    public function postMedia(MediaItemUpdate $request, $mediaId) {

        $data = $request->validated();

        try {
            $mediaItem = MediaService::updateMediaItem($mediaId, $data);
        } catch (NotFoundHttpException $e) {
            $result = [
                'success' => false,
                'error'   => 'not found'
            ];
            return response()->json($result);
        }

        return response()->json($mediaItem);
    }

    public function postDelete($mediaId)
    {

        try {
            $mediaItem = MediaService::deleteMediaItem($mediaId);
        } catch (NotFoundHttpException $e) {
            return response()->json(false);
        }

        return response()->json(true);
    }

    public function postCrop(MediaItemCrop $request, $mediaId)
    {

        $data = $request->validated();

        $user = BackendUserService::getLoggedUser();

        try {
            $mediaItem = MediaService::cropMediaItem($mediaId, $user, $data);;
        } catch (NotFoundHttpException $e) {
            $result = array (
                'error' => config('error.not_found'),
                'description' => trans('response.not_found')
            );

            return response()->json($result, 404);
        }


        return response()->json($mediaItem, 201);
    }
}
