<?php

namespace App\Packages\Friend\Repository;

use App\Packages\Core\Repository\AbstractRepository;
use App\Packages\Friend\Models\FriendInvite;
use App\Packages\User\Models\User;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Collection;

/**
 * Class FriendInviteRepository
 * @package App\Packages\Friend\Repository
 *
 * @method FriendInvite firstById($id)
 *
 * @property FriendInvite $model
 */
class FriendInviteRepository extends AbstractRepository
{
    public static function init()
    {
        return new FriendInviteRepository(FriendInvite::class);
    }

    /**
     * @TODO: Refactore, use only one method
     *
     * @param User $user
     * @param User $friend
     *
     * @return bool
     */
    public function checkCreatedInvite(User $user, User $friend)
    {
        return $this->query()
            ->where('user_id', '=', $user->id)
            ->where('friend_id', '=', $friend->id)
            ->exists();
    }

    /**
     * @param User $user
     * @param User $friend
     *
     * @return FriendInvite|null|object
     */
    public function getCreatedInvite(User $user, User $friend)
    {
        return $this->query()
            ->where('user_id', '=', $user->id)
            ->where('friend_id', '=', $friend->id)
            ->first();
    }

    /**
     * @param $inviteId
     *
     * @return FriendInvite|null|object
     */
    public function findInvite($inviteId)
    {
        return $this->query()
            ->where('id', '=', $inviteId)
            ->first();
    }

    /**
     * @param User $user
     * @param User $ownerUser
     * @return bool
     */
    public function existsInvite(User $user, User $ownerUser)
    {
        return $this->query()
            ->where('user_id', '=', $ownerUser->id)
            ->where('friend_id', '=', $user->id)
            ->exists();
    }

    /**
     * @param User $user
     * @param User $ownerUser
     *
     * @return FriendInvite|null|object
     */
    public function getOppositeInvite(User $user, User $ownerUser)
    {
        return $this->query()
            ->where([
                'user_id' => $ownerUser->id,
                'friend_id' => $user->id,
            ])
            ->first();
    }

    /**
     * @param User $user
     * @param User $ownerUser
     *
     * @return FriendInvite|null|object
     */
    public function deleteAllRelativeInvites(User $user, User $ownerUser)
    {
        return $this->query()
            ->where([
                'user_id' => $ownerUser->id,
                'friend_id' => $user->id,
            ])
            ->orWhere(function($query) use ($user, $ownerUser) {
                /** @var Builder $query */
                $query->where('user_id', $user->id)
                    ->where('friend_id', $ownerUser->id);
            })
            ->delete();
    }

	/**
	 * @param User $user
	 *
	 * @return Collection|FriendInvite[]
	 */
	public function getInvites(User $user)
	{
		return $this->query()
			->with(['user'])
			->where('friend_id', '=', $user->id)
//            ->leftJoin('table_user', 'table_user.id', '=', 'table_friend_invite.user_id')
//            ->whereNull('table_user.deleted_at')
			->get();
	}

    /**
     * @TODO: Check joins
     *
     * @param User $user
     *
     * @return Collection|FriendInvite[]
     */
    public function getSentInvites(User $user)
    {
        return $this->query()
            ->with(['user'])
            ->where('user_id', '=', $user->id)
//            ->leftJoin('table_user', 'table_user.id', '=', 'table_friend_invite.friend_id')
//            ->whereNull('table_user.deleted_at')
            ->get();
    }

	/**
	 * @param User $user
	 *
	 * @return bool
	 */
	public function userHasInvites(User $user)
	{
		return $this->query()
			->with(['friend'])
			->where('friend_id', '=', $user->id)
			->count();
	}
}
