<?php
namespace App\Http\Controllers\Admin;
use App\library\CheckValueType;
use App\Models\Settings;
...
use ImageOptimizer;
use Carbon\Carbon;
use App\Http\Requests\CategoryRequest;
class CategoryController extends Controller
{
    private $mailChimpObject;
    public function __construct()
    {
        parent::__construct();
        $this->mailChimpObject= $this->getMailChimpObject();
    }
    public function index($page = 1)
    {
        $backendItemsPerPage = Settings::getValue('backend_items_per_page', CheckValueType::cvtInteger, 20);
        $filter_name = $this->requestData['filter_name'] ?? '';
        $totalCategoriesCount = Category::count();
        $startRowsFrom = (($page-1)*$backendItemsPerPage);
        $categories = Category
            ::getByName($filter_name)
            ->withCount('adCategories')
            ->orderBy('categories.id', 'asc')
            ->paginate($backendItemsPerPage, null, null, $page)
            ->map(function ($categoryItem) {
                $categoryItemImgProps = Category::readCategoryImageProps($categoryItem->id, $categoryItem->image, true);
                if (!empty($categoryItemImgProps)) {
                    $categoryItem['categoryImgProps'] = $categoryItemImgProps;
                }
                return $categoryItem;
            });
        $prevUrlLinks= getPaginationPrevUrlLinks($startRowsFrom, $backendItemsPerPage, $page);
        $nextUrlLinks= getPaginationNextUrlLinks($totalCategoriesCount, $categories->count(),  $backendItemsPerPage, $page);
        $viewParamsArray = $this->getAppParameters(true, ['csrf_token'], []);
        $viewParamsArray['page'] = $page;
        $viewParamsArray['prevUrlLinks'] = $prevUrlLinks;
        $viewParamsArray['nextUrlLinks'] = $nextUrlLinks;
        $viewParamsArray['categories'] = $categories;
        $viewParamsArray['totalCategoriesCount'] = $totalCategoriesCount;
        return view('admin.categories.index', $viewParamsArray);
    }
    public function store(CategoryRequest $request)
    {
        $categoryUploadFile = $request->file('categoryImage');
        if ( !empty($categoryUploadFile)) {
            $categoryImageBasename    = checkValidImgName($categoryUploadFile->getClientOriginalName(), 50, true);
            $categoryFileSourcePath = $categoryUploadFile->getPathName();
            $this->requestData['image']    = $categoryImageBasename;
        }
        DB::beginTransaction();
        try {
            $category            = Category::create($this->requestData);
            DB::commit();
            if ( ! empty($categoryFileSourcePath)) {
                $categoryDestImageDir =  storage_path() . '/app/public/' . Category::getCategoryDir($category->id);
                $categoryDestImagePath = /* $categoryDestImageDir  */'/public/' .  Category::getCategoryDir($category->id) . urldecode($categoryImageBasename);
                createDir($tmpAdImagesDirs, 0755);
                Storage::disk('local')->put($categoryDestImagePath, File::get($categoryFileSourcePath));
                ImageOptimizer::optimize(storage_path() . '/app/' . $categoryDestImagePath, null);
            }
        } catch (\Exception $e) {
            DB::rollback();
            $this->catchError($e);
        }
        $this->flashMessage('success', 'Category created successfully');
        return redirect('admin/categories/' . $category->id . '/edit');
    }
}