<?php

namespace App\Packages\v4\Follower\Manager;

use App\Packages\Follower\Models\FollowerRelation;
use App\Packages\User\Models\User;
use App\Packages\v4\Follower\Repository\FollowerRepository;
use App\Packages\v4\User\Notifications\NotificationNewFollower;
use App\Packages\v4\User\Notifications\TypesNotification;

/**
 * Class FollowerManager
 * @package App\Packages\Follower\Manager
 */
class FollowerManager
{
    /** @var string */
    public $message;

    /**
     * @param User $loggedUser
     * @param User $user
     * @param bool $accepted
     * @return bool
     */
    public function privateFollowUser($loggedUser, $user, $accepted = false)
    {
        $follower = FollowerRepository::init()->getFollowerRow($user, $loggedUser);

        if ( $follower ) {
            if ($follower->status) $this->message = 'User already follow user';
            else $this->message = 'User already sent invite';

            return false;
        }

        $follower = new FollowerRelation();
        $follower->user_id = $user->id;
        $follower->follower_id = $loggedUser->id;
        $follower->status = $accepted;
        $follower->save();

        if ( ! $accepted ) {
            /** Send notification */
            NotificationNewFollower::dispatch($loggedUser, $user)
                ->onQueue(TypesNotification::QUEUE_NOTIFICATIONS);
        }

        $this->message = 'success';
        return true;
    }

    /**
     * @param User $loggedUser
     * @param User $user
     * @return bool
     */
    public function followUser($loggedUser, $user)
    {
        $check = FollowerRepository::init()->isFollower($user, $loggedUser);

        if ( $check ) {
            $this->message = 'User already follow this user';
            return false;
        }

        $follower = new FollowerRelation();
        $follower->user_id = $user->id;
        $follower->follower_id = $loggedUser->id;
        $follower->status = true;
        $follower->save();

        $this->message = 'success';
        return true;
    }

    /**
     * @param User $loggedUser
     * @param User $user
     * @return bool
     * @throws \Exception
     */
    public function unFollowUser($loggedUser, $user)
    {
        $follower = FollowerRepository::init()->getFollowerRow($user, $loggedUser);

        if ($follower) $follower->delete();

        $this->message = 'success';
        return true;
    }

    /**
     * @param User $loggedUser
     * @return bool
     */
    public static function acceptAllPending($loggedUser)
    {
        FollowerRepository::init()->acceptAllPending($loggedUser);
        return true;
    }

}
