<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Category;
use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Yajra\DataTables\Facades\DataTables;

class CategoryController extends Controller
{
    public function index(Request $request)
    {
        abort_if(Gate::denies('category_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

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

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

            $table->addColumn('actions', function ($row) {
                $viewGate      = 'category_show';
                $editGate      = 'category_edit';
                $deleteGate    = 'category_delete';
                $crudRoutePart = 'category';

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

            $table->addColumn('id', function ($row) {
                return $row->id ? $row->id : '';
            });
            $table->addColumn('name', function ($row) {
                return $row->name ? $row->name : '';
            });
            $table->addColumn('name_ar', function ($row) {
                return $row->name_ar ? $row->name_ar : '';
            });
            $table->addColumn('status', function ($row) {
                return isset(Category::STATUS_SELECT[$row->status]) ? Category::STATUS_SELECT[$row->status] : '';
            });
            $table->addColumn('image', function ($row) {
                    return sprintf(
                        '<a href="%s" class="fancybox-popup"><img src="%s" height="50px"></a>',
                        asset($row->image),
                        asset($row->image),
                    );

                return '';
            });

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

            return $table->make(true);
        }

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

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

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

    public function store(Request $request)
    {
        $category_data = $request->all();

        if ($request->hasFile('image')) {
            $imageName = time().'.'.$request->file('image')->getClientOriginalExtension();
            $request->file('image')->move(public_path('uploads/category'), $imageName);
            $category_data['image']= 'uploads/category/' . $imageName;
        }

        Category::create($category_data);

        return redirect()->route('admin.category.index');
    }

    public function edit(Category $category)
    {
        abort_if(Gate::denies('category_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden');
        
        return view('admin.category.edit', compact('category'));
    }

    public function update(Request $request, Category $category)
    {
        $category_data = $request->all();

        if ($request->hasFile('image')) {
            if ($category->image) {
                $oldImagePath = public_path($category->image);
    
                if (file_exists($oldImagePath)) {
                    unlink($oldImagePath); // Delete the file
                } 
            }

            $imageName = time().'.'.$request->file('image')->getClientOriginalExtension();
            $request->file('image')->move(public_path('uploads/category'), $imageName);
            $category_data['image']= 'uploads/category/' . $imageName;
        }

        $category->update($category_data);

        return redirect()->route('admin.category.index');
    }

    public function show(Category $category)
    {
        abort_if(Gate::denies('category_show'), Response::HTTP_FORBIDDEN, '403 Forbidden');

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

    public function destroy(Category $category)
    {
        abort_if(Gate::denies('category_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden');
        
        if ($category->image) {
            $oldImagePath = public_path($category->image);

            if (file_exists($oldImagePath)) {
                unlink($oldImagePath); // Delete the file
            } 
        }

        $category->delete();

        return back();
    }
}
