<?php

namespace App\Traits;

use Illuminate\Support\Str;

use App\Utilities\SearchResult;
use App\Utilities\Paginate;

trait PublicationsControllerTrait
{
    abstract protected function getModel();
    abstract protected function getClassname();

    public function index()
    {
        if (!auth()->user()?->can('viewAny', $this->getModel())) {
            if (request()->expectsJson()) {
                return response()->json(['error' => 'You do not have permission to sort pages'], 403);
            } else {
                return redirect('/')->with('error', 'You do not have access to view Blogs');
            }
        }

        return view(Str::plural($this->getClassname()).'.index');
    }

    public function paginate()
    {
        return $this->getModel()->paginateByTags(request());
    }

    public function search()
    {
        request()->validate([
            'terms' => 'required|min:3',
        ]);

        $terms = SearchResult::collectTerms();
        $search_results = $this->getModel()::searchResults($terms);

        if ($search_results->count()) {
            $items = $this->getModel()->getByTags(request(), $search_results->pluck('id')->toArray());
        } else {
            $items = collect();
        }

        return Paginate::create($this->getModel()->loadCollectionAttributes($items));
    }
}
