<?php

namespace App\PackagesAdmin\User\Controllers;

use App\Http\Controllers\Controller;
use App\Packages\Capsule\Models\Capsule;
use App\Packages\User\Models\User;
use App\Packages\v4\Capsule\Repository\CapsuleRepository;
use App\PackagesAdmin\Capsule\DataTables\CapsuleCommentDataTable;
use App\PackagesAdmin\Capsule\DataTables\CapsuleDataTable;
use App\PackagesAdmin\User\DataTables\UserAccessLogDataTable;
use App\PackagesAdmin\User\Requests\ChangeUserRequest;
use App\PackagesAdmin\User\DataTables\FriendDataTable;
use App\PackagesAdmin\User\DataTables\UserDataTable;
use App\PackagesAdmin\User\Services\UserExportService;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;

/**
 * Class UserController
 * @package App\PackagesAdmin\User\Controllers
 */
class UserController extends Controller
{

    /** @TODO: Add service for User model manipulations. */

    /**
     * @param Request $request
     * @param UserDataTable $dataTable
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
     * @throws \Exception
     */
    public function index(Request $request, UserDataTable $dataTable)
    {
        if ($request->ajax()) {
            return $dataTable->getDataTable();
        }

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

    /**
     * @param $id
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function show($id)
    {
        $user = User::find($id);
        $total_capsules = CapsuleRepository::init()->countUserCapsulesForAdmin($user);

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


    /**
     * @param $id
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function edit($id)
    {
        $user = User::find($id);

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

    /**
     * @param ChangeUserRequest $request
     * @param $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(ChangeUserRequest $request, $id)
    {
        /** @var User $user */
        $user = User::query()->find($id);
        $user->first_name = $request->first_name;
        $user->last_name = $request->last_name;
        $user->nickname = $request->nickname;
        $user->email = $request->email;
        $user->phone_number = $request->phone_number;
        $user->is_notification_push = $request->push_notification?:0;

        /** Search settings */
        $user->is_suggested = ($request->is_suggested) ? true : false;
        $user->suggested_position = $request->suggested_position;
        $user->search_position = $request->search_position;

        $user->save();

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

    /**
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function toggleBlock($id)
    {
        $user = User::find($id);
        $user->is_active = ($user->is_active)?0:1;
        $user->save();

        return response()->json(['status' => 'success']);
    }

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

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

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

    /**
     * @param FriendDataTable $dataTable
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     * @throws \Exception
     */
    public function friendsList(FriendDataTable $dataTable, $id)
    {
        return $dataTable->getUserDataTable($id);
    }

    /**
     * @param CapsuleDataTable $dataTable
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function capsulesList(CapsuleDataTable $dataTable, $id)
    {
        return $dataTable->getUserDataTable($id);
    }

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

    /**
     * @param UserAccessLogDataTable $dataTable
     * @param $id
     * @return mixed
     * @throws \Exception
     */
    public function accessLogList(UserAccessLogDataTable $dataTable, $id)
    {
        return $dataTable->getUserDataTable($id);
    }
}