<?php

namespace App\Http\Controllers\Backoffice;

use App\Facades\Backoffice\BackendUserService;
use App\Facades\Backoffice\MediaService;
use App\Http\Controllers\Controller;
use App\Http\Requests\Backoffice\FolderBaseRequest;
use App\Http\Requests\Backoffice\FolderCreateRequest;
use App\Http\Requests\Backoffice\FolderListRequest;
use App\Http\Requests\Backoffice\FolderRenameRequest;
use App\Http\Requests\Backoffice\MediaItemCrop as BackofficeMediaItemCrop;
use App\Http\Requests\Backoffice\MediaItemListRequest;
use App\Http\Requests\Backoffice\MediaItemUpdate as BackofficeMediaItemUpdate;
use App\Http\Resources\Backoffice\MediaItemResource;
use App\Http\Requests\Backoffice\MediaMoveRequest;
use App\Http\Resources\Backoffice\MediaFolderResource;
use App\Libs\Backoffice\Managers\MediaManager;
use App\Models\Backoffice\MediaItem;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class MediaManagerController extends Controller
{
    public function getList(Request $request)
    {
        $page       = $request->input("page");
        $rowCount   = $request->input("perPage", 24);
        $sort       = $request->input("sort");
        $search     = $request->input("searchPhrase");
        $mediaType  = $request->input("mediaType");
        $folderId   = $request->input("media_folder_id");

        $result = MediaService::getMediaListPerPage($page, $rowCount, $sort, $search, $folderId, $mediaType);
        $result['items'] = MediaItemResource::collection($result['items']);
        return response()->json($result);
    }

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

        try {
            $mediaManager = new MediaManager($baseFolder);
            $mediaItem = $mediaManager->uploadFile($user, $file, $relatedType, $mediaFolderId);
        } catch (HttpException $e) {
            return response()->json($e->getMessage(), $e->getStatusCode());
        }

        if ($uploadType == 'editor') {
            $editorImage = [
                'url' => Storage::url($mediaItem->public_path),
                'id' => $mediaItem->id
            ];
            return response()->json($editorImage, 201);
        } else {
            return response()->json(new MediaItemResource($mediaItem), 201);
        }
    }

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

    public function postMedia(BackofficeMediaItemUpdate $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(new MediaItemResource($mediaItem));
    }

    public function postDelete($mediaId)
    {
        try {
            MediaService::deleteMediaItem($mediaId);
            return response()->json(true);
        } catch (NotFoundHttpException $e) {
            return response()->json(false);
        }
    }

    public function postCrop(BackofficeMediaItemCrop $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(new MediaItemResource($mediaItem), 201);
    }


    public function createFolder(FolderCreateRequest $request)
    {
        $data = $request->validated();

        $baseFolder = $data['base_folder'] ?? 'default';
        $parentId = $data['parent_id'] ?? null;
        $mediaManager = new MediaManager($baseFolder);

        try {
            $folder = $mediaManager->createFolder($data['name'], $parentId);
            return new MediaFolderResource($folder);
        } catch (Exception $e) {
            Log::error('Error during folder creation: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'error' => $e->getMessage()
            ], 500);
        }
    }

    public function deleteFolder(FolderBaseRequest $request, int $id)
    {
        $data = $request->validated();

        $baseFolder = $data['baseFolder'] ?? 'default';
        $mediaManager = new MediaManager($baseFolder);

        try {
            $mediaManager->deleteFolder($id);
            return response()->json(true, 200);
        } catch (Exception $e) {
            Log::error('Error during folder deletion: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'error' => $e->getMessage()
            ], 500);
        }
    }

    public function renameFolder(FolderRenameRequest $request, int $id)
    {
        $data = $request->validated();

        $baseFolder = $data['base_folder'] ?? 'default';
        $mediaManager = new MediaManager($baseFolder);

        try {
            $folder = $mediaManager->renameFolder($id, $data['name']);
            return new MediaFolderResource($folder);
        } catch (Exception $e) {
            Log::error('Error during folder renaming: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'error' => $e->getMessage()
            ], 500);
        }
    }

    public function getFolder(FolderBaseRequest $request)
    {
        $data = $request->validated();
        $baseFolder = $data['baseFolder'] ?? 'default';
        $mediaManager = new MediaManager($baseFolder);
        $folder = $mediaManager->getFolder($data['folderId'] ?? null);

        return new MediaFolderResource($folder);
    }

    public function listFolders(FolderListRequest $request)
    {
        $data = $request->validated();
        $baseFolder = $data['base_folder'] ?? 'default';
        $mediaManager = new MediaManager($baseFolder);
        $folders = $mediaManager->getFolders($data);
        return MediaFolderResource::collection($folders);
    }

    public function moveItems(MediaMoveRequest $request)
    {
        $data = $request->validated();
        $baseFolder = $data['base_folder'] ?? 'default';
        $mediaManager = new MediaManager($baseFolder);

        try {
            $movedCount = $mediaManager->moveItems($data['media_ids'], $data['target_folder_id']);
            return response()->json([
                'success' => true,
                'moved' => $movedCount,
            ]);
        } catch (Exception $e) {
            Log::error('Error moving media items: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    /**
     * Show the admin dashboard
     *
     * @return \Illuminate\Http\Response
     */
    public function getIndex()
    {
        return Inertia::render('Backoffice/MediaManager', []);
    }
}
