<?php

namespace App\Packages\v4\Capsule\Repository;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsuleTaggedUser;
use App\Packages\v4\Core\Repository\AbstractRepository;
use App\Packages\User\Models\User;
use Illuminate\Support\Collection;

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

    /**
     * @param Capsule $capsule
     * @param User $taggedUser
     *
     * @return CapsuleTaggedUser|null|object
     */
    public function getTaggedUser(Capsule $capsule, User $taggedUser)
    {
        return $this->query()
            ->where('user_id', '=', $taggedUser->id)
            ->where('capsule_id', '=', $capsule->id)
            ->first();
    }

    /**
     * @param Capsule $capsule
     * @param User $taggedUser
     *
     * @return bool
     */
    public function existsTaggedUser(Capsule $capsule, User $taggedUser)
    {
        return $this->query()
			->where('user_id', '=', $taggedUser->id)
			->where('capsule_id', '=', $capsule->id)
			->exists();
    }

    /**
     * @param Capsule $capsule
     * @param array $taggedUsersHashArray
     *
     * @return bool
     */
    public function clearAllExceptTaggedUsersByUuid(Capsule $capsule, $taggedUsersHashArray)
    {
        /** @var CapsuleTaggedUser[]|Collection $taggedUsers */
        $this->query()
            ->leftJoin('table_user', 'table_user.id', '=', 'table_capsule_tagged_user.user_id')
            ->where('capsule_id', '=', $capsule->id)
            ->whereNotIn('table_user.uuid', $taggedUsersHashArray)
            ->delete();

        return true;
    }

    public function clearAllTaggedUsers(Capsule $capsule)
    {
        $this->query()
            ->where('capsule_id', $capsule->id)
            ->delete();

        return true;
    }

	/**
	 * @param Capsule $capsule
	 *
	 * @return Collection|User[]
	 */
	public function capsuleTaggedUsers(Capsule $capsule)
	{
		return User::query()
            ->select('table_user.*')
            ->with(['avatar'])
			->leftJoin('table_capsule_tagged_user', 'table_capsule_tagged_user.user_id', '=', 'table_user.id')
			->where('table_capsule_tagged_user.capsule_id', '=', $capsule->id)
            ->where('table_user.is_registered', true)
			->orderBy('table_capsule_tagged_user.created_at', 'desc')
			->get();
	}
}
