<?php

namespace App\PackagesAdmin\CapsuleCommentReport\DataTables;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsuleComment;
use App\Packages\Capsule\Models\CapsuleCommentReport;
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 CapsuleCommentReportDataTable
 * @package App\PackagesAdmin\CapsuleCommentReport\DataTables
 */
class CapsuleCommentReportDataTable
{
    /**  @var DataTables */
    private $dataTablesInstance;

    /** @var CapsuleComment $capsuleCommentModel */
    private $capsuleCommentModel;

    /** @var CapsuleCommentReport $capsuleCommentReportModel */
    private $capsuleCommentReportModel;

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

    /**
     * CapsuleCommentReportDataTable constructor.
     * @param DataTables $dataTablesInstance
     * @param CapsuleCommentReport $capsuleCommentReport
     * @param CapsuleComment $comment
     * @param User $user
     */
    public function __construct(Datatables $dataTablesInstance,
                                CapsuleCommentReport $capsuleCommentReport,
                                CapsuleComment $comment,
                                User $user)
    {
        $this->dataTablesInstance = $dataTablesInstance;
        $this->capsuleCommentModel = $comment;
        $this->capsuleCommentReportModel = $capsuleCommentReport;
        $this->userModel = $user;
    }


    /**
     * @return JsonResponse
     * @throws \Exception
     */
    public function getDataTable()
    {
        $query = \DB::table(\DB::raw('
            (SELECT comment.*, COUNT(report.id) as total_reports FROM '.$this->capsuleCommentModel->getTable().' as comment 
            LEFT JOIN '.$this->capsuleCommentReportModel->getTable().' as report 
            ON report.comment_id = comment.id
            WHERE report.id IS NOT NULL 
            GROUP BY comment.id) as base_table
        '))->select([
            'base_table.id',
            'base_table.capsule_id',
            'base_table.content',
            'base_table.updated_at',
            'base_table.total_reports',
            'user.nickname'
        ])
        ->leftJoin(
            $this->userModel->getTable() . ' as user',
            'user.id',
            '=',
            'base_table.user_id'
        );

        $dataTable = $this->dataTablesInstance
            ->query($query)
            ->filterColumn('nickname', function ($query, $keyword) {
                /** @var Builder $query */
                $query->whereRaw("user.nickname like ? ", ["%{$keyword}%"]);
            })
            ->addColumn('showCapsuleLink', function ($comment) {
                return route('admin.capsule.show', ['id' => $comment->capsule_id]);
            })
            ->addColumn('deleteLink', function ($comment) {
                return route('admin.capsule.comment.destroy', ['id' => $comment->id]);
            })
            ->addColumn('deleteReportsLink', function ($comment) {
                return route('admin.reported_comment.destroy', ['id' => $comment->id]);
            });

        return $dataTable->make();
    }
}