<?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\Accessory;
use App\AccessoryCategory;
use App\Http\Resources\Admin\AccessoryResource;
use Validator;

/**
 * Class AccessoryController
 *
 * @package App\Http\Controllers\Admin
 */
class AccessoryController extends Controller
{
	const ITEM_PER_PAGE = 100;
	
	public function index(Request $request)
	{
		$searchParams = $request->all();
		$list = Accessory::with('accessoryCategory')->notDeleted();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$keyword = Arr::get($searchParams, 'keyword', '');
		$status = Arr::get($searchParams, 'status', '');
		$categoryId = Arr::get($searchParams, 'accessory_category_id', '');
		
		if (!empty($keyword)) {
			$list->where(function ($query) use ($keyword) {
				$query->where('name', 'LIKE', '%' . $keyword . '%')
					->orWhere('code', 'LIKE', '%' . $keyword . '%');
			});
		}
		if ($status != '') {
			$list->where('is_activated', $status);
		}
		if ($categoryId != '') {
			$list->where('accessory_category_id', $categoryId);
		}
		$list->orderBy('id', 'DESC');
		
		return AccessoryResource::collection($list->paginate($limit));
	}
	
	public function all(Request $request)
	{
		$searchParams = $request->all();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$categoryId = Arr::get($searchParams, 'category_id', '');
		
		$list = Accessory::select('id', 'name', 'code', 'accessory_category_id')->notDeleted()->orderBy('id');
		
		if ($categoryId != '') {
			$list->where('accessory_category_id', $categoryId);
		}
		
		return AccessoryResource::collection($list->paginate($limit));
	}
	
	public function available(Request $request)
	{
		$categoryId = Arr::get($request->all(), 'category_id', '');
		
		$list = Accessory::select('id', 'name', 'code', 'accessory_category_id')->isPublished()
			->orderBy('id');
		
		if ($categoryId != '') {
			$list->where('accessory_category_id', $categoryId);
		}
		
		return AccessoryResource::collection($list->get());
	}
	
	public function show($id = 0)
	{
		$accessory = Accessory::with('accessoryCategory')->notDeleted()->where('id', $id)->first();
		if (!isset($accessory)) return response()->json(['errors' => 'アクセサリは無効です。'], 403);
		
		return new AccessoryResource($accessory);
	}
	
	public function store(Request $request)
	{
		$validator = Validator::make($request->all(), [
			'accessory_category_id' => ['required'],
			'code'                  => ['required'],
			'name'                  => ['required']
		]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		
		$params = $request->all();
		$code = str_replace(' ', '', $params['code']);
		
		$checkAccessory = Accessory::where('code', $code)->first();
		if (isset($checkAccessory)) return response()->json(['errors' => 'コードが存在します。'], 403);
		
		$accessory = Accessory::create([
			'accessory_category_id' => $params['accessory_category_id'],
			'code'                  => $code,
			'name'                  => $params['name'],
			'description'           => $params['description'],
			'image'                 => $params['image'] ?? null,
			'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 AccessoryResource($accessory);
	}
	
	public function update(Request $request, $id = 0)
	{
		$validator = Validator::make($request->all(), [
			'accessory_category_id' => ['required'],
			'name'                  => ['required'],
			'name'                  => ['required']
		]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		
		$accessory = Accessory::notDeleted()->where('id', $id)->first();
		if (!isset($accessory)) return response()->json(['errors' => 'アクセサリは無効です。'], 403);
		
		$params = $request->all();
		$code = str_replace(' ', '', $params['code']);
		
		$checkAccessory = Accessory::where('code', $code)->where('id', '!=', $id)->first();
		if (isset($checkAccessory)) return response()->json(['errors' => 'コードが存在します。'], 403);
		
		$accessory->update([
			'accessory_category_id' => $params['accessory_category_id'],
			'code'                  => str_replace(' ', '', $params['code']),
			'name'                  => $params['name'],
			'description'           => $params['description'],
			'image'                 => $params['image'] ?? null,
			'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)
	{
		$accessory = Accessory::notDeleted()->where('id', $id)->first();
		if (!isset($accessory)) response()->json(['error' => 'このアクセサリを削除することはできません。'], 403);
		
		try {
			$accessory->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', []);
		$accessories = Accessory::notDeleted()->whereIn('id', $listIds)->get();
		if ($accessories->count() <= 0) response()->json(['error' => 'アクセサリは無効です。'], 403);
		
		try {
			Accessory::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', []);
		$accessories = Accessory::notDeleted()->whereIn('id', $listIds)->get();
		if ($accessories->count() <= 0) response()->json(['error' => 'アクセサリは無効です。'], 403);
		
		try {
			Accessory::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', []);
		$accessories = Accessory::notDeleted()->whereIn('id', $listIds)->get();
		if ($accessories->count() <= 0) response()->json(['error' => 'アクセサリは無効です。'], 403);
		
		try {
			Accessory::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false]);
		} catch (\Exception $ex) {
			response()->json(['error' => $ex->getMessage()], 403);
		}
		
		return response()->json(null, 204);
	}
}