<?php

namespace App\PackagesApi\v4\Controllers\Core;

use App\Http\Controllers\Controller;
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\Core\Models\Report;
use App\Packages\User\Models\User;
use App\Packages\v4\Capsule\Repository\CapsuleCommentRepository;
use App\Packages\v4\Capsule\Repository\CapsuleRepository;
use App\PackagesApi\v4\Requests\Capsule\CancelRequest;
use App\PackagesApi\v4\Requests\Report\ReportCommentRequest;
use App\PackagesApi\v4\Requests\Report\ReportRequest;
use Illuminate\Http\JsonResponse;

/**
 * Class ReportController
 *
 * @package App\Http\Controllers\API
 */
class ReportController extends Controller
{
    /** @var User */
    private $user;

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

    public function sendComment(ReportCommentRequest $request)
    {
        $comment = CapsuleCommentRepository::init()->firstByUuid($request->comment_id);
        if ( ! $comment ) {
            return jsonErrorEntity([
                'message' => 'Comment does not exists'
            ]);
        }

        CapsuleCommentReport::createReport($comment, $this->user);

        return jsonSuccess([
            'message' => 'Comment has been reported'
        ]);
    }

    /**
     * @param CancelRequest $request
     * @return JsonResponse
     */
    public function sendCapsule(CancelRequest $request)
    {
        $capsule = CapsuleRepository::init()->firstByUuid($request->capsule_id);
        if (!$capsule) {
            return jsonErrorEntity([
                'message' => trans('api.msg.capsule_does_not_exists'),
            ]);
        }

        CapsuleReport::createReport($capsule, $this->user);

        return jsonSuccess([
            'message' => 'Capsule has been reported',
        ]);
    }

    /**
     * @param ReportRequest $request
     *
     * @return JsonResponse
     */
    public function sendFeedback(ReportRequest $request)
    {
        $this->user->saveAccess('Send feedback');

        Report::reportProblem($this->user, $request->email, $request->content);

        return jsonSuccess(
            [
                'message' => 'Thank you for your feedback',
            ]
        );
    }

    /**
     * @param ReportRequest $request
     *
     * @return JsonResponse
     */
    public function sendProblem(ReportRequest $request)
    {
        $this->user->saveAccess('Send problem');

        Report::reportProblem($this->user, $request->email, $request->content);

        return jsonSuccess(
            [
                'message' => 'Thank you for your problem report',
            ]
        );
    }
}
