<?php

namespace App\PackagesAdmin\Manager\DataTables;

use App\PackagesAdmin\Manager\Models\Manager;
use App\PackagesAdmin\Manager\Models\ManagerRole;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
use Yajra\DataTables\DataTables;

/**
 * Class ManagerDataTable
 * @package App\PackagesAdmin\Manager\DataTables
 */
class ManagerDataTable
{
    /**  @var DataTables */
    private $dataTablesInstance;

    /** @var Manager $managerModel */
    private $managerModel;

    /** @var ManagerRole $roleModel */
    private $roleModel;

    public function __construct(Datatables $dataTablesInstance, Manager $manager, ManagerRole $role)
    {
        $this->dataTablesInstance = $dataTablesInstance;
        $this->managerModel = $manager;
        $this->roleModel = $role;
    }

    /**
     * @return JsonResponse
     * @throws \Exception
     */
    public function getDataTable()
    {
        $query = $this->managerModel::query()
            ->select([
                'table_manager.*',
                'role.title as role'
            ])
            ->leftJoin($this->roleModel->getTable() . ' as role', 'role.id', '=', 'table_manager.role_id');

        $dataTable = $this->dataTablesInstance
            ->eloquent($query)
            ->editColumn('is_active', function ($manager) {
                return ($manager->is_active) ? 'Yes' : 'No';
            })
            ->filterColumn('is_active', function ($query, $keyword) {
                /** @var Builder $query */
                if ($keyword == 'Yes') $query->where('is_active', true);
                else if ($keyword == 'No') $query->where('is_active', false);
            })
            ->filterColumn('role', function ($query, $keyword) {
                /** @var Builder $query */
                $query->whereRaw('role.title like ?', ["%{$keyword}%"]);
            })
            ->addColumn('editLink', function ($manager) {
                return route('admin.manager.edit', ['id' => $manager->id]);
            })
            ->addColumn('deleteLink', function ($manager) {
                return route('admin.manager.destroy', ['id' => $manager->id]);
            });

        return $dataTable->make();
    }
}