<?php

namespace App\Http\Controllers\Admin;

use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Project;
use App\Http\Resources\Admin\ProjectResource;
use Validator;
use DB;

/**
 * Class ProjectController
 *
 * @package App\Http\Controllers
 */
class ProjectController extends Controller
{
	const ITEM_PER_PAGE = 20;
	
	public function index(Request $request)
	{
		$searchParams = $request->all();
		$list = Project::notDeleted();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$keyword = Arr::get($searchParams, 'keyword', '');
		$siteId = Arr::get($searchParams, 'site_id', '');
		$status = Arr::get($searchParams, 'status', '');
		$orderBy = Arr::get($searchParams, 'orderBy', '');
		
		if (!empty($keyword)) {
			$list->where('name', 'LIKE', '%' . $keyword . '%');
		}
		if ($status != '') {
			$list->where('is_activated', $status);
		}
		if ($siteId != '') {
			$list->where('site_id', $siteId);
		}
		if ($orderBy != '') {
			$list->orderBy('site_id', 'ASC');
		}
		$list->orderBy('position')->orderBy('id');
		
		return ProjectResource::collection($list->paginate($limit));
	}
	
	public function all(Request $request)
	{
		$searchParams = $request->all();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$list = Project::select('*')->notDeleted()->orderBy('position')->orderBy('id');
		
		return ProjectResource::collection($list->paginate($limit));
	}
	
	public function show($id = 0)
	{
		$project = Project::notDeleted()->where('id', $id)->first();
		if (!isset($project)) return response()->json(['errors' => 'Project is not valid'], 403);
		
		return new ProjectResource($project);
	}
	
	public function store(Request $request)
	{
		$validator = Validator::make($request->all(), ['name' => ['required'], 'site_id' => ['required'], 'is_activated' => ['required']]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		$params = $request->all();
		
		$check = Project::where('is_deleted', false)
			->where('site_id', $params['site_id'])
			->where('name', $params['name'])
			->count();
		if ($check) return response()->json(['errors' => 'Project already exists.'], 403);
		
		$maxItem = Project::where('is_deleted', false)->orderBy('position', 'desc')->first();
		$countAll = isset($maxItem) ? $maxItem->position : 0;
		if ($countAll > 0) $countAll++;
		
		$project = Project::create([
			'site_id'      => $params['site_id'],
			'name'         => $params['name'],
			'slug'         => Helper::slug($params['name']),
			'description'  => $params['description'],
			'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')
		]);
		
		return new ProjectResource($project);
	}
	
	public function update(Request $request, $id = 0)
	{
		$validator = Validator::make($request->all(), ['name' => ['required'], 'site_id' => ['required'], 'is_activated' => ['required']]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		$project = Project::notDeleted()->where('id', $id)->first();
		if (!isset($project)) return response()->json(['errors' => 'Project is not valid'], 403);
		$params = $request->all();
		
		$check = Project::where('is_deleted', false)
			->where('site_id', $params['site_id'])
			->where('id', '!=', $project->id)
			->where('name', $params['name'])
			->count();
		if ($check) return response()->json(['errors' => 'Project already exists.'], 403);
		
		$project->update([
			'site_id'      => $params['site_id'],
			'name'         => $params['name'],
			'slug'         => Helper::slug($params['name']),
			'description'  => $params['description'],
			'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)
	{
		$project = Project::notDeleted()->where('id', $id)->first();
		if (!isset($project)) response()->json(['error' => 'Ehhh! Can not delete this project'], 403);
		
		try {
			$project->update(['is_deleted' => true, 'updated_at' => date('Y-m-d H:i:s')]);
		} 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', []);
		$projects = Project::notDeleted()->whereIn('id', $listIds)->get();
		if ($projects->count() <= 0) response()->json(['error' => 'Project is not valid.'], 403);
		try {
			Project::notDeleted()->whereIn('id', $listIds)->update(['is_deleted' => true, 'updated_at' => date('Y-m-d H:i:s')]);
		} 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', []);
		$projects = Project::notDeleted()->whereIn('id', $listIds)->get();
		if ($projects->count() <= 0) response()->json(['error' => 'Project is not valid.'], 403);
		try {
			Project::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => true, 'updated_at' => date('Y-m-d H:i:s')]);
		} 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', []);
		$projects = Project::notDeleted()->whereIn('id', $listIds)->get();
		if ($projects->count() <= 0) response()->json(['error' => 'Project is not valid.'], 403);
		try {
			Project::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false, 'updated_at' => date('Y-m-d H:i:s')]);
		} 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) {
				Project::where('id', $item['id'])->update(['position' => $item['order'], 'updated_at' => date('Y-m-d H:i:s')]);
			}
		}
		
		return response()->json(null, 204);
	}
	
	/**
	 * Get members of a project
	 *
	 * @param Request $request
	 * @return \Illuminate\Http\JsonResponse
	 */
	public function getMember(Request $request)
	{
		$searchParams = $request->all();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$projectId = Arr::get($searchParams, 'project_id', null);
		
		if (!$projectId) {
			return response()->json(['error' => 'Project ID is required'], 403);
		}
		
		$userIds = DB::table('user_projects')
			->join('user_project_members', 'user_projects.id', '=', 'user_project_members.user_project_id')
			->select('user_project_members.user_id')
			//->where('user_projects.user_id', $this->_user->id)
			->where('user_projects.project_id', $projectId)
			->pluck('user_id')
			->toArray();
		
		$members = User::select('id', 'name', 'full_name', 'furigana_name')
			->where('is_deleted', false)
			->where('is_activated', true)
			->where('is_leader', 0)
			->whereIn('id', $userIds)
			->orderBy('id')
			->limit($limit)
			->get();
		
		return response()->json([
			'data'  => $members,
			'links' => [
				'next' => null
			]
		]);
	}
}
