<?php

namespace App\Packages\Capsule\Repository;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsuleSubscriber;
use App\Packages\Core\Repository\AbstractRepository;
use App\Packages\User\Models\User;
use DB;
use Illuminate\Database\Query\JoinClause;
use Illuminate\Support\Collection;

/**
 * Class CapsuleSubscriberRepository
 * @package App\Packages\Capsule\Repository
 *
 * @method CapsuleSubscriber firstById($id)
 *
 * @property CapsuleSubscriber $model
 */
class CapsuleSubscriberRepository extends AbstractRepository
{
	const LIMIT_SUBSCRIBERS = 5;

	public static function init()
    {
        return new CapsuleSubscriberRepository(CapsuleSubscriber::class);
    }

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

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

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

    /**
     * @param Capsule $capsule
     *
     * @return Collection|User[]
     */
    public function capsuleSubscribersNotTagged(Capsule $capsule)
    {
        return User::query()
            ->select('table_user.*')
            ->leftJoin('table_capsule_subscriber', 'table_capsule_subscriber.user_id', '=', 'table_user.id')

            ->leftJoin('table_capsule_tagged_user as taggedUser', function(JoinClause $join) use ($capsule) {
                $join
                    ->on('taggedUser.capsule_id', '=', DB::raw($capsule->id))
                    ->on('taggedUser.user_id', '=', 'table_user.id');
            })

            ->where('table_capsule_subscriber.capsule_id', '=', $capsule->id)
            ->whereNull('taggedUser.id')
            ->orderBy('table_capsule_subscriber.created_at', 'desc')
            ->get();
    }

    /**
     * @param Capsule $capsule
     *
     * @return int
     */
    public function capsuleSubscribersCount(Capsule $capsule)
    {
        return $this->query()
            ->where('table_capsule_subscriber.capsule_id', '=', $capsule->id)
            ->count();
    }
}
