<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Controllers\Traits\MediaUploadingTrait;
use App\Http\Requests\MassDestroyCmsPageRequest;
use App\Http\Requests\StoreCmsPageRequest;
use App\Http\Requests\UpdateCmsPageRequest;
use App\Models\CmsPage;
use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Request;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
use Symfony\Component\HttpFoundation\Response;
use Yajra\DataTables\Facades\DataTables;

class CmsPagesController extends Controller
{
    use MediaUploadingTrait;

    public function index(Request $request)
    {
        abort_if(Gate::denies('cms_page_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        if ($request->ajax()) {
            $query = CmsPage::query()->select(sprintf('%s.*', (new CmsPage)->table));
            $table = Datatables::of($query);

            $table->addColumn('actions', '&nbsp;');

            $table->addColumn('actions', function ($row) {
                $viewGate      = 'cms_page_show';
                $editGate      = 'cms_page_edit';
                $deleteGate    = 'cms_page_delete';
                $crudRoutePart = 'cms-pages';

                return view('partials.datatablesActions', compact(
                    'viewGate',
                    'editGate',
                    'deleteGate',
                    'crudRoutePart',
                    'row'
                ));
            });

            $table->addColumn('id', function ($row) {
                return $row->id ? $row->id : '';
            });
            $table->addColumn('title', function ($row) {
                return $row->title ? $row->title : '';
            });
            $table->addColumn('slug', function ($row) {
                return $row->slug ? $row->slug : '';
            });

            $table->rawColumns(['actions']);

            return $table->make(true);
        }

        return view('admin.cmsPages.index');
    }

    public function create()
    {
        abort_if(Gate::denies('cms_page_create'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        return view('admin.cmsPages.create');
    }

    public function store(Request $request)
    {
        $cmsPage = CmsPage::create($request->all());

        if ($media = $request->input('ck-media', false)) {
            Media::whereIn('id', $media)->update(['model_id' => $cmsPage->id]);
        }

        return redirect()->route('admin.cms-pages.index')->with('success', __('global.cms_page_store'));
    }

    public function edit(CmsPage $cmsPage)
    {
        abort_if(Gate::denies('cms_page_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        return view('admin.cmsPages.edit', compact('cmsPage'));
    }

    public function update(Request $request, CmsPage $cmsPage)
    {
        $cmsPage->update($request->all());

        return redirect()->route('admin.cms-pages.index')->with('success', __('global.cms_page_update'));
    }

    public function show(CmsPage $cmsPage)
    {
        abort_if(Gate::denies('cms_page_show'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        return view('admin.cmsPages.show', compact('cmsPage'));
    }

    public function destroy(CmsPage $cmsPage)
    {
        abort_if(Gate::denies('cms_page_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $cmsPage->delete();

        return back()->with('success', __('global.cms_page_delete'));
    }

    public function massDestroy(MassDestroyCmsPageRequest $request)
    {
        $cmsPages = CmsPage::find(request('ids'));

        foreach ($cmsPages as $cmsPage) {
            $cmsPage->delete();
        }

        return response(null, Response::HTTP_NO_CONTENT);
    }

    public function storeCKEditorImages(Request $request)
    {
        abort_if(Gate::denies('cms_page_create') && Gate::denies('cms_page_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $model         = new CmsPage();
        $model->id     = $request->input('crud_id', 0);
        $model->exists = true;
        $media         = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media');

        return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED);
    }
}
