<?php

namespace App\PackagesAdmin\User\DataTables;

use App\Packages\Friend\Models\FriendRelation;
use App\Packages\User\Models\User;
use Illuminate\Http\JsonResponse;
use Yajra\DataTables\DataTables;

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

    /**
     * UserDataTable constructor.
     * @param DataTables $dataTablesInstance
     */
    public function __construct(Datatables $dataTablesInstance)
    {
        $this->dataTablesInstance = $dataTablesInstance;
    }

    /**
     * @return JsonResponse
     * @throws \Exception
     */
    public function getUserDataTable($id)
    {
        $relation_table = (new FriendRelation())->getTable();
        $user_table = (new User())->getTable();

        $full_name_query = "CONCAT(\"user\".\"first_name\", ' ', \"user\".\"last_name\")";

        $query = \DB::table($relation_table . ' as relation')
            ->select([
                'user.id',
                \DB::raw($full_name_query . " as full_name"),
                'user.nickname',
                'user.email',
                'relation.created_at',
                'relation.id as relation_id'
            ])
            ->leftJoin($user_table . ' as user', 'user.id', '=', 'relation.friend_id')
            ->where('relation.user_id', $id);

        return $this->dataTablesInstance
            ->queryBuilder($query)
            ->filterColumn('full_name', function ($query, $keyword) use ($full_name_query) {
                $query->whereRaw("LOWER(" . $full_name_query . ") like ?", ["%{$keyword}%"]);
            })
            ->addColumn('showLink', function ($friend) {
                return route('admin.user.show', ['id' => $friend->id]);
            })
            ->addColumn('editLink', function ($friend) {
                return route('admin.user.edit', ['id' => $friend->id]);
            })
            ->addColumn('deleteLink', function ($friend) {
                return route('admin.user.friend.destroy', ['id' => $friend->relation_id]);
            })
            ->make();
    }
}
