<?php

namespace App\PackagesAdmin\Capsule\DataTables;

use App\Packages\Capsule\Models\CapsuleComment;
use App\Packages\Capsule\Models\CapsuleLike;
use App\Packages\Capsule\Models\CapsuleSubscriber;
use App\Packages\Capsule\Models\CapsuleTaggedUser;
use App\Packages\User\Models\User;
use App\Packages\Capsule\Models\Capsule;
use Illuminate\Database\Query\Builder;
use Illuminate\Http\JsonResponse;
use Yajra\DataTables\DataTables;

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

	public function __construct(Datatables $dataTablesInstance)
	{
		$this->dataTablesInstance = $dataTablesInstance;
	}

	private function addActionButtons($dataTable)
    {
        return $dataTable
            ->addColumn('showLink', function ($capsule) {
                return route('admin.capsule.show', ['id' => $capsule->id]);
            })
            ->addColumn('editLink', function ($capsule) {
                return route('admin.capsule.edit', ['id' => $capsule->id]);
            })
            ->addColumn('deleteLink', function ($capsule) {
                return route('admin.capsule.destroy', ['id' => $capsule->id]);
            });
    }

    /**
     * @return JsonResponse
     * @throws \Exception
     */
	public function getDataTable()
	{
	    $user_table = (new User())->getTable();
	    $capsule_table = (new Capsule())->getTable();

		$query = \DB::table($capsule_table . ' as capsule')
            ->select([
                'capsule.id',
                'capsule.uuid',
                'user.nickname',
                'user.phone_number',
                'capsule.caption',
                'capsule.open_at',
                'capsule.created_at',
                'capsule.count_likes',
                'capsule.count_subscribers',
                'capsule.count_comments',
                'capsule.count_tagged_users',
                'capsule.count_reports',
                'capsule.blocked'
            ])
            ->leftJoin($user_table . ' as user', 'user.id', '=', 'capsule.user_id');

		$dataTable = $this->dataTablesInstance
            ->queryBuilder($query)
            ->editColumn('blocked', function ($capsule) {
                if ($capsule->blocked) return 'Yes';
                else return 'No';
            })
            ->editColumn('caption', function ($capsule) {
                return (mb_strlen($capsule->caption) > 200) ? mb_substr($capsule->caption, 0, 200) . '...' : $capsule->caption;
            })
            ->filterColumn('blocked', function ($query, $keyword) {
                /** @var Builder $query */
                if ($keyword == 'Yes') $query->where('capsule.blocked', true);
                else if ($keyword == 'No') $query->where('capsule.blocked', false);
            });

		return $this->addActionButtons($dataTable)->make();
	}

	public function getUserDataTable($id)
    {
        $query = Capsule::query()
            ->where('user_id', $id);

        $dataTable = $this->dataTablesInstance
            ->eloquent($query)
            ->editColumn('caption', function ($capsule) {
                return (mb_strlen($capsule->caption) > 200) ? mb_substr($capsule->caption, 0, 200) . '...' : $capsule->caption;
            });

        return $this->addActionButtons($dataTable)->make();
    }
}
