<?php

namespace App\Http\Controllers\Admin;

use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\MaterialCategory;
use App\Http\Resources\Admin\MaterialCategoryResource;
use Validator;

/**
 * Class MaterialCategoryController
 *
 * @package App\Http\Controllers
 */
class MaterialCategoryController extends Controller
{
	const ITEM_PER_PAGE = 100;
	
	public function index(Request $request)
	{
		$searchParams = $request->all();
		$list = MaterialCategory::notDeleted();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$keyword = Arr::get($searchParams, 'keyword', '');
		$status = Arr::get($searchParams, 'status', '');
		
		if (!empty($keyword)) {
			$list->where('name', 'LIKE', '%' . $keyword . '%');
		}
		if ($status != '') {
			$list->where('is_activated', $status);
		}
		$list->orderBy('id');
		
		return MaterialCategoryResource::collection($list->paginate($limit));
	}
	
	public function all(Request $request)
	{
		$searchParams = $request->all();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$list = MaterialCategory::select('id', 'name', 'slug')->notDeleted()->orderBy('id');
		
		return MaterialCategoryResource::collection($list->paginate($limit));
	}
	
	public function allNested(Request $request)
	{
		$ignoreId = Arr::get($request->all(), 'ignoreId', '');
		$parentId = Arr::get($request->all(), 'parentId', 0);
		
		$query = MaterialCategory::select('id', 'name', 'parent_id')
			->where('parent_id', $parentId)
			->where('is_activated', true)
			->where('is_deleted', false);
		
		if ($ignoreId != null && $ignoreId != "") {
			$query->where('id', '!=', $ignoreId);
		}
		
		$list = $query->orderBy('id')->get();
		
		$result = $list->map(function ($item) {
			return [
				'id'          => $item->id,
				'label'       => $item->name,
				'hasChildren' => $item->children()->exists()
			];
		});
		
		return response()->json(['data' => $result], 200);
	}
	
	public function getChildren($id)
	{
		$children = MaterialCategory::select('id', 'name', 'parent_id')
			->where('parent_id', $id)
			->where('is_activated', true)
			->where('is_deleted', false)
			->orderBy('id')
			->get()
			->map(function ($item) {
				return [
					'id' => $item->id,
					'label' => $item->name,
					'hasChildren' => $item->children()->exists()
				];
			});
		
		return response()->json(['data' => $children], 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(Request $request)
	{
		$ignoreId = Arr::get($request->all(), 'ignoreId', '');
		$list = MaterialCategory::select('id', 'name')->isPublished();
		
		if ($ignoreId != null && $ignoreId != "") {
			$list->where('id', '!=', $ignoreId);
		}
		
		$list->orderBy('id');
		
		return MaterialCategoryResource::collection($list->get());
	}
	
	public function show($id = 0)
	{
		$material = MaterialCategory::notDeleted()->where('id', $id)->first();
		if (!isset($material)) return response()->json(['errors' => 'Material is not valid'], 403);
		
		return new MaterialCategoryResource($material);
	}
	
	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();
		
		$parentId = 0;
		if (is_array($params['parent_id']) && isset($params['parent_id'][array_key_last($params['parent_id'])])) {
			$parentId = $params['parent_id'][array_key_last($params['parent_id'])];
		}
		
		$material = MaterialCategory::create([
			'name'         => $params['name'],
			'slug'         => Helper::slug($params['name']),
			'parent_id'    => $parentId,
			'unit'         => $params['unit'],
			'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')
		]);
		
		return new MaterialCategoryResource($material);
	}
	
	public function update(Request $request, $id = 0)
	{
		$validator = Validator::make($request->all(), ['name' => ['required'], 'is_activated' => ['required']]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		$material = MaterialCategory::notDeleted()->where('id', $id)->first();
		if (!isset($material)) return response()->json(['errors' => 'Material is not valid'], 403);
		$params = $request->all();
		
		$parentId = 0;
		if (is_array($params['parent_id']) && isset($params['parent_id'][array_key_last($params['parent_id'])])) {
			$parentId = $params['parent_id'][array_key_last($params['parent_id'])];
		}
		
		$material->update([
			'name'         => $params['name'],
			'slug'         => Helper::slug($params['name']),
			'parent_id'    => $parentId,
			'unit'         => $params['unit'],
			'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
			'updated_at'   => date('Y-m-d H:i:s')
		]);
		
		return response()->json(null, 204);
	}
	
	public function destroy($id = 0)
	{
		$material = MaterialCategory::notDeleted()->where('id', $id)->first();
		if (!isset($material)) response()->json(['error' => 'Ehhh! Can not delete this material'], 403);
		
		try {
			$material->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', []);
		$materials = MaterialCategory::notDeleted()->whereIn('id', $listIds)->get();
		if ($materials->count() <= 0) response()->json(['error' => 'Material is not valid.'], 403);
		try {
			MaterialCategory::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', []);
		$materials = MaterialCategory::notDeleted()->whereIn('id', $listIds)->get();
		if ($materials->count() <= 0) response()->json(['error' => 'Material is not valid.'], 403);
		try {
			MaterialCategory::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', []);
		$materials = MaterialCategory::notDeleted()->whereIn('id', $listIds)->get();
		if ($materials->count() <= 0) response()->json(['error' => 'Material is not valid.'], 403);
		try {
			MaterialCategory::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false]);
		} catch (\Exception $ex) {
			response()->json(['error' => $ex->getMessage()], 403);
		}
		
		return response()->json(null, 204);
	}
}
