<?php

namespace App\PackagesApi\v4\Controllers\Follower;

use App\Http\Controllers\Controller;
use App\Packages\v4\Follower\Manager\FollowerManager;
use App\Packages\User\Models\User;
use App\Packages\v4\Follower\Repository\FollowerRepository;
use App\Packages\v4\User\Repository\UserRepository;
use App\PackagesApi\v4\Requests\Follower\ActionRequest;
use Illuminate\Http\JsonResponse;

/**
 * Class ActionController
 * @package App\PackagesApi\Controllers\v4\Follower
 */
class ActionController extends Controller
{
    /** @var User */
    private $auth;

    /** @var FollowerManager */
    private $manager;

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

    public function followUser(ActionRequest $request)
    {
        if ($this->auth->uuid == $request->input('user_id')) {
            return jsonErrorEntity([
                'message' => 'Same user',
            ]);
        }

        $user = UserRepository::init()->firstByUuid($request->input('user_id'));
        if (!$user) {
            return jsonErrorEntity([
                'message' => 'User does not exists',
            ]);
        }

        if ( $user->is_private ) {
            $status = $this->manager->privateFollowUser($this->auth, $user);
        } else {
            $status = $this->manager->followUser($this->auth, $user);
        }

        if ($status) {
            return jsonSuccess([
                'message' => $this->manager->message
            ]);
        }

        return jsonErrorMessage($this->manager->message);
    }

    public function unFollowUser(ActionRequest $request)
    {
        if ($this->auth->uuid == $request->input('user_id')) {
            return jsonErrorEntity([
                'message' => 'Same user',
            ]);
        }

        $user = UserRepository::init()->firstByUuid($request->input('user_id'));
        if (!$user) {
            return jsonErrorEntity([
                'message' => 'User does not exists',
            ]);
        }

        $status = $this->manager->unFollowUser($this->auth, $user);

        if ($status) {
            return jsonSuccess([
                'message' => $this->manager->message
            ]);
        }

        return jsonErrorMessage($this->manager->message);
    }

    /**
     * @param ActionRequest $request
     * @return JsonResponse
     */
    public function waitConfirmationApprove(ActionRequest $request)
    {
        if ($this->auth->uuid == $request->input('user_id')) {
            return jsonErrorEntity([
                'message' => 'Same user',
            ]);
        }

        $user = UserRepository::init()->firstByUuid($request->input('user_id'));
        if ( ! $user ) {
            return jsonErrorEntity([
                'message' => 'User does not exists'
            ]);
        }

        $follower_relation = FollowerRepository::init()->getFollowerRow($this->auth, $user);

        if ( ! $follower_relation )
            return jsonErrorEntity([
                'message' => 'Confirmation does not exists'
            ]);

        if ( $follower_relation->status )
            return jsonErrorEntity([
                'message' => 'User already confirm this request'
            ]);

        $follower_relation->status = true;
        $follower_relation->save();

        return jsonSuccess([
            'message' => 'success'
        ]);
    }

    /**
     * @param ActionRequest $request
     * @return JsonResponse
     * @throws \Exception
     */
    public function waitConfirmationDecline(ActionRequest $request)
    {
        if ($this->auth->uuid == $request->input('user_id')) {
            return jsonErrorEntity([
                'message' => 'Same user'
            ]);
        }

        $user = UserRepository::init()->firstByUuid($request->input('user_id'));
        if ( ! $user ) {
            return jsonErrorEntity([
                'message' => 'User does not exists'
            ]);
        }

        $follower_relation = FollowerRepository::init()->getFollowerRow($this->auth, $user);

        if ( ! $follower_relation )
            return jsonErrorEntity([
                'message' => 'Confirmation does not exists'
            ]);

        if ( $follower_relation->status )
            return jsonErrorEntity([
                'message' => 'User already confirm this request'
            ]);

        $follower_relation->delete();

        return jsonSuccess([
            'message' => 'success'
        ]);
    }
}
