<?php

namespace App\PackagesAdmin\Capsule\Controllers;

use App\Http\Controllers\Controller;
use App\Packages\Capsule\Models\CapsuleBlock;
use App\Packages\User\Notifications\AbstractNotification;
use App\Packages\User\Notifications\NotificationBlocked;
use App\Packages\User\Notifications\TypesNotification;
use App\Packages\User\Service\UserMentionService;
use App\Packages\v4\Capsule\Repository\CapsuleRepository;
use App\PackagesAdmin\Capsule\DataTables\CapsuleDataTable;
use App\PackagesAdmin\Capsule\DataTables\CapsuleCommentDataTable;
use App\PackagesAdmin\Capsule\DataTables\CapsuleReportDataTable;
use App\PackagesAdmin\Capsule\DataTables\CapsuleTaggedUserDataTable;
use App\PackagesAdmin\Capsule\DataTables\CapsuleSubscriberDataTable;
use App\Packages\Capsule\Models\Capsule;
use App\PackagesAdmin\Capsule\Requests\BlockCapsuleRequest;
use App\PackagesAdmin\Capsule\Requests\ChangeCapsuleRequest;
use App\PackagesAdmin\Capsule\Services\CapsuleExportService;
use App\PackagesAdmin\Services\CapsuleService;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\StreamedResponse;

/**
 * Class CapsuleController
 * @package App\PackagesAdmin\Capsule\Controllers
 */
class CapsuleController extends Controller
{
	/**
	 * @param Request $request
	 * @param CapsuleDataTable $dataTable
	 *
	 * @return View|JsonResponse
	 */
	public function index(Request $request, CapsuleDataTable $dataTable)
	{
		if ($request->ajax()) {
			return $dataTable->getDataTable();
		}

		return view('admin.capsule.list');
	}

    /**
     * @param $id
     * @return \Illuminate\Contracts\View\Factory|View
     */
    public function show($id)
	{
		$capsule = CapsuleRepository::init()->firstById($id);

		return view('admin.capsule.show', ['capsule' => $capsule]);
	}

    /**
     * @param $id
     * @return \Illuminate\Contracts\View\Factory|View
     */
    public function edit($id)
    {
        $capsule = CapsuleRepository::init()->firstById($id);

        return view('admin.capsule.form', ['capsule' => $capsule]);
    }

    /**
     * @param ChangeCapsuleRequest $request
     * @param $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(ChangeCapsuleRequest $request, $id)
    {
        $capsule = CapsuleRepository::init()->firstById($id);
        $capsule->caption = $request->caption;
        $capsule->is_private = isset($request->is_private) ? 1 : 0;

        /** Search settings */
        if ($capsule->search_setting == 0 && $request->search_setting != 0) {
            $capsule->set_suggested = Carbon::now();
        }

        if ($capsule->search_setting != 0 && $request->search_setting == 0) {
            $capsule->set_suggested = null;
        }

        $capsule->search_setting = $request->search_setting;
        $capsule->search_position = $request->search_position;
        $capsule->suggested_position = $request->suggested_position;

        $capsule->save();

        UserMentionService::processCapsuleCaption($capsule);

        return back()->with('status', trans('admin.capsule.action.update'));
    }

    /**
     * @param BlockCapsuleRequest $request
     * @param $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function block(BlockCapsuleRequest $request, $id)
    {
        $capsule = CapsuleRepository::init()->firstById($id);
        CapsuleService::blockCapsule($capsule, $request->description);

        return back()->with('status', trans('admin.capsule.action.blocked'));
    }

    /**
     * @param Request $request
     * @param $id
     * @return JsonResponse|\Illuminate\Http\RedirectResponse
     */
    public function destroy(Request $request, $id)
    {
        Capsule::destroy($id);

        if ($request->ajax()) return response()->json(['status' => 'success']);
        return back()->with('status', trans('admin.capsule.action.delete'));
    }

    /**
     * @param Request $request
     * @param string $format
     * @return StreamedResponse
     */
    public function export(Request $request, $format = 'csv')
    {
        return CapsuleExportService::csvExport();
    }

    /**
     * @param CapsuleCommentDataTable $dataTable
     * @param $id
     * @return JsonResponse
     * @throws \Exception
     */
    public function commentsList(CapsuleCommentDataTable $dataTable, $id)
	{
		return $dataTable->getCapsuleDataTable($id);
	}

    /**
     * @param CapsuleTaggedUserDataTable $dataTable
     * @param $id
     * @return JsonResponse
     * @throws \Exception
     */
    public function taggedUsersList(CapsuleTaggedUserDataTable $dataTable, $id)
	{
		return $dataTable->getCapsuleDataTable($id);
	}

    /**
     * @param CapsuleSubscriberDataTable $dataTable
     * @param $id
     * @return JsonResponse
     */
    public function subscribersList(CapsuleSubscriberDataTable $dataTable, $id)
	{
	    return $dataTable->getCapsuleDataTable($id);
	}

    /**
     * @param CapsuleReportDataTable $dataTable
     * @param $id
     * @return JsonResponse
     * @throws \Exception
     */
    public function reportsList(CapsuleReportDataTable $dataTable, $id)
    {
        return $dataTable->getCapsuleDataTable($id);
    }
}
