<?php

namespace App\PackagesAdmin\CapsuleReport\DataTables;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsuleReport;
use App\Packages\User\Models\User;
use Illuminate\Database\Query\Builder;
use Illuminate\Http\JsonResponse;
use Yajra\DataTables\DataTables;

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

    /** @var Capsule $capsuleModel */
    private $capsuleModel;

    /** @var CapsuleReport $capsuleReportModel */
    private $capsuleReportModel;

    /** @var User $userModel */
    private $userModel;

    /**
     * CapsuleReportDataTable constructor.
     * @param DataTables $dataTablesInstance
     * @param CapsuleReport $capsuleReport
     * @param Capsule $capsule
     * @param User $user
     */
    public function __construct(Datatables $dataTablesInstance,
                                CapsuleReport $capsuleReport,
                                Capsule $capsule,
                                User $user)
    {
        $this->dataTablesInstance = $dataTablesInstance;
        $this->capsuleModel = $capsule;
        $this->capsuleReportModel = $capsuleReport;
        $this->userModel = $user;
    }

    /**
     * @return JsonResponse
     * @throws \Exception
     */
    public function getDataTable()
    {
        $query = \DB::table(\DB::raw('
            (SELECT capsule.*, COUNT(report.id) as total_reports FROM '.$this->capsuleModel->getTable().' as capsule
            LEFT JOIN '.$this->capsuleReportModel->getTable().' as report 
            ON report.capsule_id = capsule.id 
            WHERE capsule.is_complete = true 
            AND report.id IS NOT NULL 
            GROUP BY capsule.id) as base_table
        '))->select([
            'base_table.id',
            'base_table.caption',
            'user.nickname',
            'user.phone_number',
            'base_table.total_reports',
            'base_table.blocked'
        ])
        ->leftJoin(
            $this->userModel->getTable() . ' as user',
            'user.id',
            '=',
            'base_table.user_id'
        );

        $dataTable = $this->dataTablesInstance
            ->query($query)
            ->editColumn('blocked', function ($capsule) {
                if ( $capsule->blocked ) return 'Yes';
                else return 'No';
            })
            ->filterColumn('blocked', function ($query, $keyword) {
                /** @var Builder $query */
                if ($keyword == 'Yes') {
                    $query->where('base_table.blocked', true);
                } else if ($keyword == 'No') {
                    $query->where('base_table.blocked', false);
                }
            })
            ->filterColumn('nickname', function ($query, $keyword) {
                /** @var Builder $query */
                $query->whereRaw("user.nickname like ? ", ["%{$keyword}%"]);
            })
            ->filterColumn('phone_number', function ($query, $keyword) {
                /** @var Builder $query */
                $query->whereRaw("user.phone_number like ? ", ["%{$keyword}%"]);
            })
            ->addColumn('showLink', function ($capsule) {
                return route('admin.capsule.show', ['id' => $capsule->id]);
            })
            ->addColumn('toggleLink', function ($capsule) {
                return route('admin.reported_capsule.toggle', ['id' => $capsule->id]);
            })
            ->addColumn('deleteLink', function ($capsule) {
                return route('admin.reported_capsule.destroy', ['id' => $capsule->id]);
            });

        return $dataTable->make();
    }
}