<?php

namespace App\Packages\User\Services;

use App\Packages\Capsule\Models\CapsuleTaggedUser;
use App\Packages\Capsule\Repository\CapsuleTaggedUserRepository;
use App\Packages\Friend\Models\FriendInvite;
use App\Packages\Friend\Models\FriendRelation;
use App\Packages\Friend\Repository\FriendRepository;
use App\Packages\User\Models\User;
use App\Packages\User\Transformer\UserTransformer;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;

/**
 * Class FriendService
 * @package App\Packages\User\Transformer
 */
class FriendService
{
    /**
     * @param User $user
     *
     * @return int
     */
    public function getFriendsCount(User $user)
    {
        return FriendRepository::init()
            ->getFriendCount($user);
    }

    /**
     * @param User $listOwner
     * @param int $page
     *
     * @return LengthAwarePaginator
     */
    public function getFriendsList(User $listOwner, $page = 1)
    {
        $contacts = FriendRepository::init()->getFriends($listOwner, $page);

        return $contacts;
    }


    /**
     * @param User $user
     * @param User $friend
     *
     * @throws \Exception
     */
    public function removeFriend(User $user, User $friend)
    {
        $friendRelation = FriendRepository::init()->getFriendRelation($user, $friend);
        if ($friendRelation) {
            $friendRelation->delete();
        }

        $userRelation = FriendRepository::init()->getFriendRelation($friend, $user);
        if ($userRelation) {
            $userRelation->delete();
        }

        $user->refreshFriendCount();
        $friend->refreshFriendCount();

        $this->removeFriendTags($user, $friend);
    }

    /**
     * @param User $user
     * @param User $friend
     */
    public function removeFriendTags(User $user, User $friend)
    {
        CapsuleTaggedUserRepository::init()
            ->query()
            ->where('by_user_id', '=', $user->id)
            ->where('user_id', '=', $friend->id)
            ->delete();

        CapsuleTaggedUserRepository::init()
            ->query()
            ->where('by_user_id', '=', $friend->id)
            ->where('user_id', '=', $user->id)
            ->delete();
    }

    /**
     * @param FriendInvite $friendInvite
     */
    public function createFriendFromInvite(FriendInvite $friendInvite)
    {
        FriendRelation::createFriend($friendInvite->user, $friendInvite->friend);

        $friendInvite->user->refreshFriendCount();
        $friendInvite->friend->refreshFriendCount();
    }

}