<?php

namespace App\Http\Controllers;

use App\Http\Resources\CategoryResource;
use App\Category;
use App\ProjectUser;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

class CategoryController extends Controller
{
    const ITEM_PER_PAGE = 25;
    private $user;

    public function __construct()
    {
        $this->user = auth('api')->user();
    }

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $status = Arr::get($searchParams, 'status', '');
        $list = Category::select('id', 'name', 'slug', 'parent_id')->isPublished()->where('name', '!=', 'その他');

        if ($this->user->hasRole(['customer'])) {
            $list->where('user_id', $this->user->id);
        }

        if ($this->user->hasRole(['user'])) {
            $projectIds = ProjectUser::where('user_id', $this->user->id)->pluck('category_id');
            $list->whereIn('id', $projectIds);
        }

        if (!empty($keyword)) {
            $list->where('name', 'LIKE', '%' . $keyword . '%');
        }
        if ($status != '') {
            $list->where('is_activated', $status);
        }
        $list->orderBy('id');

        return CategoryResource::collection($list->paginate($limit));
    }

    public function topBbsCategory(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $parentId = Arr::get($searchParams, 'parentId', null);

        if ($parentId != null && $parentId != "" && $parentId != 0) {
            $list = Category::select('id', 'name', 'slug', 'parent_id')
                ->isPublished()
                ->where('parent_id', $parentId)
                ->orderBy('position', 'ASC')
                ->orderBy('id', 'DESC');
        } else {
            $list = Category::select('id', 'name', 'slug', 'parent_id')
                ->isPublished()
                /*->where('name', '!=', 'その他')*/
                ->where('is_show_bbs', true)
                ->orderBy('position', 'ASC')
                ->orderBy('id', 'DESC');
        }

        return CategoryResource::collection($list->paginate($limit));
    }

    public function topColumnCategory(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $list = Category::select('id', 'name', 'slug', 'parent_id')
            ->isPublished()->where('name', '!=', 'その他')
            ->where('is_activated', true)
            ->where('is_show_column', true)
            ->orderBy('position', 'ASC')
            ->orderBy('id', 'DESC');

        return CategoryResource::collection($list->paginate($limit));
    }

    public function topCategory()
    {
        $list = Category::select('id', 'name', 'slug', 'description')
            ->isPublished()
            ->orderBy('position')
            ->orderBy('id', 'DESC')
            ->paginate(self::ITEM_PER_PAGE);

        return CategoryResource::collection($list);
    }

    public function slugCategory($slug = '')
    {
        $category = Category::select('id', 'name', 'slug', 'description')
            ->isPublished()
            ->where('slug', $slug)
            ->first();

        return new CategoryResource($category);
    }

    public function show($id = '')
    {
        $category = Category::select('*')
            ->isPublished()
            ->where('id', $id)
            ->first();

        return new CategoryResource($category);
    }

    public function worker($id = '')
    {
        $userIds = ProjectUser::where('category_id', $id)->pluck('user_id')->toArray();
        $users = User::select('id', 'name')->whereIn('id', $userIds)->get();

        return response()->json(['data' => $users], 200);
    }


    public function onlyParent(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $list = Category::select('id', 'name', 'slug', 'parent_id')
            ->isPublished()
            ->where('parent_id', 0)
            ->orderBy('id', 'ASC');

        return CategoryResource::collection($list->paginate($limit));
    }

    public function onlyChildren(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $parentId = Arr::get($searchParams, 'parentId', '');
        $list = Category::select('id', 'name', 'slug', 'parent_id')
            ->isPublished()
            ->whereNotNull('parent_id')
            ->where('parent_id', '!=', 0)
            ->where('parent_id', $parentId)
            ->orderBy('id', 'ASC');

        return CategoryResource::collection($list->paginate($limit));
    }

}
