<?php

namespace App\Packages\v4\Capsule\Repository;

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

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

	public static function init()
    {
        return new CapsuleLikeRepository(CapsuleLike::class);
    }

	/**
	 * @param Capsule $capsule
	 * @param User $user
	 *
	 * @return CapsuleLike|null|object
	 */
	public function capsuleUserLike(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 capsuleLikedByUser(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 capsuleLastLikes(Capsule $capsule)
	{
		return User::query()
            ->select('table_user.*')
			->leftJoin('table_capsule_like', 'table_capsule_like.user_id', '=', 'table_user.id')
			->where('table_capsule_like.capsule_id', '=', $capsule->id)
			->orderBy('table_capsule_like.created_at', 'desc')
			->take(static::LIMIT_LIKES)
			->get();
	}

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

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