<?php

namespace App\Packages\v4\User\Repository;

use App\Packages\User\Models\User;
use App\Packages\v4\Core\Repository\AbstractRepository;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;

/**
 * Class UserCapsuleRepository
 * @package App\Packages\User\Repository\v4
 *
 * @method User firstById($id)
 *
 * @property User $model
 */
class UserCapsuleRepository extends AbstractRepository {

    public static function init(){
        return new UserCapsuleRepository(User::class);
    }

    /**
     * @param bool|User $user
     * @param bool|string $keyword
     * @return Builder
     */
    private function baseUsersByKeyword($user = false, $keyword = false)
    {
        $query = $this->query()
            ->whereNotNull('nickname')
            ->where('nickname', '!=', '')
            ->where('is_registered', true);

        if ($user) {
            $query->where('id', '!=', $user->id);
        }

        if ($keyword) {
            $keyword = mb_strtolower($keyword);
            $query->whereRaw("LOWER(nickname) like '{$keyword}%'");
        }

        return $query;
    }

    /**
     * @param bool|User $user
     * @param bool|string $keyword
     * @param bool|int $offset
     * @return int
     */
    public function countUsersByKeyword($user = false, $keyword = false, $offset = false)
    {
        $query = $this->baseUsersByKeyword($user, $keyword);

        if ($offset) $query->skip($offset);

        return $query->count();
    }

    /**
     * @param bool|User $user
     * @param bool|string $keyword
     * @param bool|int $limit
     * @param bool|int $offset
     * @return Builder[]|Collection
     */
    public function getUsersByKeyword($user = false, $keyword = false, $limit = false, $offset = false)
    {
        $query = $this->baseUsersByKeyword($user, $keyword)
            ->orderBy('nickname', 'DESC');

        if ($limit) $query->take($limit);

        if ($offset) $query->skip($offset);

        return $query->get();
    }

}
