<?php

namespace App\Http\Controllers\Admin;

use App\CategoryDetail;
use App\Faq;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Photo;
use App\ProjectUser;
use App\ProjectUserDetail;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Category;
use App\Http\Resources\Admin\CategoryResource;
use Validator;

/**
 * Class CategoryController
 *
 * @package App\Http\Controllers
 */
class CategoryController extends Controller
{
    const ITEM_PER_PAGE = 100;

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $list = Category::notDeleted();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $userId = Arr::get($searchParams, 'userId', '');
        $status = Arr::get($searchParams, 'status', '');

        if (!empty($keyword)) {
            $list->where('name', 'LIKE', '%' . $keyword . '%');
        }
        if ($userId != '' && $userId != null) {
            $list->where('user_id', $userId);
        }
        if ($status != '') {
            $list->where('is_activated', $status);
        }
        $list->orderBy('start_date', 'ASC');

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

    public function all(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $list = Category::select('id', 'name', 'slug')->notDeleted()->orderBy('position')->orderBy('id');

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

    public function allNested()
    {
        $list = Category::select('*')->notDeleted()->orderBy('position')->get();
        $rs = $this->getChildItems($list, 0);

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

    public function getChildItems($list, $parent = 0)
    {
        $rs = [];
        foreach ($list as $item) {
            if ($item->parent_id == $parent) {
                $cate = ['value' => $item->id, 'label' => $item->name];
                $children = $this->getChildItems($list, $item->id);
                if ($children !== null && count($children) > 0) $cate['children'] = $children;
                $rs[] = $cate;
            }
        }

        return $rs;
    }

    public function available()
    {
        $list = Category::select('id', 'name')->notDeleted()->activated()->orderBy('position')->orderBy('id');

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

    public function show($id = 0)
    {
        $category = Category::notDeleted()->where('id', $id)->first();
        if (!isset($category)) return response()->json(['errors' => 'Category is not valid'], 403);

        /*return response()->json(['data' => $category]);*/
        return new CategoryResource($category);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), ['name' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();

        $maxItem = Category::where('is_deleted', false)->orderBy('position', 'desc')->first();
        $countAll = isset($maxItem) ? $maxItem->position : 0;
        if ($countAll > 0) $countAll++;

        $category = Category::create([
            'name'         => $params['name'],
            'slug'         => Helper::slug($params['name']),
            'user_id'      => $params['user_id'],
            'parent_id'    => $params['parent_id'],
            'address'      => $params['address'],
            'description'  => $params['description'],
            'start_date'   => $params['start_date'],
            'position'     => $countAll,
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'created_at'   => date('Y-m-d H:i:s'),
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        foreach ($params['workers'] as $pIt) {
            $projectUser = ProjectUser::create([
                'category_id' => $category->id,
                'user_id'     => $pIt['id'],
                'created_at'  => date('Y-m-d H:i:s'),
                'updated_at'  => date('Y-m-d H:i:s')
            ]);

            foreach ($pIt['address_list'] as $aIt) {
                Photo::create([
                    'project_id'      => $category->id,
                    'project_user_id' => $projectUser->id,
                    'code'            => rand(111111, 9999999),
                    'name'            => $aIt['address'],
                    'assigned_id'     => $pIt['id'],
                    'user_id'         => auth('api')->user()->id,
                    'status'          => 0,
                    'created_at'      => date('Y-m-d H:i:s'),
                    'updated_at'      => date('Y-m-d H:i:s')
                ]);
            }

            /*foreach ($pIt['address_list'] as $aIt) {
                ProjectUserDetail::create([
                    'project_user_id' => $projectUser->id,
                    'address'         => $aIt['address'],
                    'created_at'      => date('Y-m-d H:i:s'),
                    'updated_at'      => date('Y-m-d H:i:s')
                ]);
            }*/
        }

        return new CategoryResource($category);
    }

    public function update($id = 0, Request $request)
    {
        $validator = Validator::make($request->all(), ['name' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $category = Category::notDeleted()->where('id', $id)->first();
        if (!isset($category)) return response()->json(['errors' => 'Category is not valid'], 403);
        $params = $request->all();

        $category->update([
            'name'         => $params['name'],
            'slug'         => Helper::slug($params['name']),
            'user_id'      => $params['user_id'],
            'parent_id'    => $params['parent_id'],
            'address'      => $params['address'],
            'description'  => $params['description'],
            'start_date'   => $params['start_date'],
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        //Delete old Item

        /*$projectUserOld = ProjectUser::where('category_id', $category->id)->pluck('id');
        Photo::whereIn('project_user_id', $projectUserOld)->delete();
        ProjectUser::where('category_id', $category->id)->delete();*/

        $projectUserIds = [];
        $projectUserPhotoIds = [];

        foreach ($params['workers'] as $pIt) {
            $projectUser = ProjectUser::where('category_id', $category->id)->where('user_id', $pIt['id'])->first();

            if (!isset($projectUser) || !$projectUser) {
                $projectUser = ProjectUser::create([
                    'category_id' => $category->id,
                    'user_id'     => $pIt['id'],
                    'created_at'  => date('Y-m-d H:i:s'),
                    'updated_at'  => date('Y-m-d H:i:s')
                ]);
            }

            foreach ($pIt['address_list'] as $aIt) {
                $photo = Photo::where('id', $aIt['id'])->first();
                if (!isset($photo) || !$photo) {
                    $photo = Photo::create([
                        'project_id'      => $category->id,
                        'project_user_id' => $projectUser->id,
                        'code'            => rand(111111, 9999999),
                        'name'            => $aIt['address'],
                        'assigned_id'     => $pIt['id'],
                        'user_id'         => auth('api')->user()->id,
                        'status'          => 0,
                        'created_at'      => date('Y-m-d H:i:s'),
                        'updated_at'      => date('Y-m-d H:i:s')
                    ]);
                } else {
                    $photo->update([
                        'project_id'      => $category->id,
                        'project_user_id' => $projectUser->id,
                        'name'            => $aIt['address'],
                        'assigned_id'     => $pIt['id'],
                        'user_id'         => auth('api')->user()->id,
                        'updated_at'      => date('Y-m-d H:i:s')
                    ]);
                }

                $projectUserPhotoIds[] = $photo->id;
            }

            $projectUserIds[] = $projectUser->id;
        }

        /*Photo::where('project_id', $category->id)->whereNotIn('project_user_id', $projectUserIds)->delete();
        Photo::where('project_id', $category->id)
            ->whereIn('project_user_id', $projectUserIds)
            ->whereNotIn('id', $projectUserPhotoIds)
            ->delete();*/

        Photo::where('project_id', $category->id)
            ->where(function ($query) use ($projectUserIds, $projectUserPhotoIds) {
                $query->whereNotIn('project_user_id', $projectUserIds)
                    ->OrWhere(function ($subQuery) use ($projectUserIds, $projectUserPhotoIds) {
                        $subQuery->whereIn('project_user_id', $projectUserIds)
                            ->whereNotIn('id', $projectUserPhotoIds);
                    });
            })
            ->delete();

        ProjectUser::whereNotIn('id', $projectUserIds)->delete();

        return response()->json(null, 204);
    }

    public function destroy($id = 0)
    {
        $category = Category::notDeleted()->where('id', $id)->first();
        if (!isset($category)) response()->json(['error' => 'Ehhh! Can not delete this project'], 403);

        try {
            $category->update(['is_deleted' => true]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function destroyMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $categories = Category::notDeleted()->whereIn('id', $listIds)->get();
        if ($categories->count() <= 0) response()->json(['error' => 'Category is not valid.'], 403);
        try {
            Category::notDeleted()->whereIn('id', $listIds)->update(['is_deleted' => true]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function activateMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $categories = Category::notDeleted()->whereIn('id', $listIds)->get();
        if ($categories->count() <= 0) response()->json(['error' => 'Category is not valid.'], 403);
        try {
            Category::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => true]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function deactivateMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $categories = Category::notDeleted()->whereIn('id', $listIds)->get();
        if ($categories->count() <= 0) response()->json(['error' => 'Category is not valid.'], 403);
        try {
            Category::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function position(Request $request)
    {
        if (!$request->has('position')) return response()->json(['errors' => 'Data is invalid'], 403);
        $newIndexes = $request->position;
        if (is_array($newIndexes)) {
            foreach ($newIndexes as $item) {
                Category::where('id', $item['id'])->update(['position' => $item['order']]);
            }
        }

        return response()->json(null, 204);
    }
}
