<?php

namespace App\Http\Controllers\Admin;

use App\Category;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\QuoteDetail;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Quote;
use App\Http\Resources\Admin\QuoteResource;
use Validator;

/**
 * Class QuoteController
 *
 * @package App\Http\Controllers
 */
class QuoteController extends Controller
{
	const ITEM_PER_PAGE = 100;
	
	public function index(Request $request)
	{
		$searchParams = $request->all();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$type = Arr::get($searchParams, 'type', 0);
		$keyword = Arr::get($searchParams, 'keyword', '');
		$status = Arr::get($searchParams, 'status', '');
		$list = Quote::notDeleted()->where('type', $type);
		
		if (!empty($keyword)) {
			$list->where(function ($query) use ($keyword) {
				$query->where('code', 'LIKE', '%' . $keyword . '%')
					->orWhere('company', 'LIKE', '%' . $keyword . '%')
					->orWhere('estimated_date', 'LIKE', '%' . $keyword . '%');
			});
		}
		if ($status != '') {
			$list->where('is_activated', $status);
		}
		$list->orderBy('id', 'DESC');
		
		return QuoteResource::collection($list->paginate($limit));
	}
	
	public function all(Request $request)
	{
		$searchParams = $request->all();
		$limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
		$list = Quote::select('id', 'name', 'slug')->notDeleted()->orderBy('id');
		
		return QuoteResource::collection($list->paginate($limit));
	}
	
	public function available(Request $request)
	{
		$ignoreId = Arr::get($request->all(), 'ignoreId', '');
		$list = Quote::select('id', 'name')->isPublished();
		
		if ($ignoreId != null && $ignoreId != "") {
			$list->where('id', '!=', $ignoreId);
		}
		
		$list->orderBy('id');
		
		return QuoteResource::collection($list->get());
	}
	
	public function show($id = 0)
	{
		$quote = Quote::notDeleted()->where('id', $id)->first();
		if (!isset($quote)) return response()->json(['errors' => 'Quote is not valid'], 403);
		
		return new QuoteResource($quote);
	}
	
	public function store(Request $request)
	{
		$validator = Validator::make($request->all(), [
			'type'             => ['required'],
			'customer_id'      => ['required'],
			'estimated_amount' => ['required']
		]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		$params = $request->all();
		
		do {
			$code = rand(100000, 999999);
			$checkItem = Quote::where('code', $code)->count();
		} while ($checkItem > 0);
		
		$type = 0;
		if (in_array($params['type'], [0, 1])) {
			$type = $params['type'];
		}
		
		$quote = Quote::create([
			'type'                  => $type,
			'code'                  => $code,
			'customer_id'           => $params['customer_id'],
			'gender'                => $params['gender'],
			'company'               => $params['company'],
			'estimated_date'        => $params['estimated_date'],
			'estimated_amount'      => $params['estimated_amount'],
			'construction_name'     => $params['construction_name'],
			'construction_time'     => $params['construction_time'],
			'quote_expiration_date' => $params['quote_expiration_date'],
			'content'               => $params['content'],
			'template'              => $params['template'],
			'total_amount'          => $params['estimated_amount'],
			'user_id'               => auth('api')->user()->id,
			'is_new'                => 1,
			'is_activated'          => 0,
			'created_at'            => date('Y-m-d H:i:s'),
			'updated_at'            => date('Y-m-d H:i:s')
		]);
		
		if (isset($params['categories'])) {
			$headerData = [];
			foreach ($params['categories'] as $key => $item) {
				$category = Category::notDeleted()->where('name', $item)->first();
				if (!$category) {
					$category = Category::create([
						'name'         => $item,
						'slug'         => $item,
						'parent_id'    => 0,
						'position'     => 0,
						'is_activated' => 1,
						'is_deleted'   => 0,
						'created_at'   => date('Y-m-d H:i:s'),
						'updated_at'   => date('Y-m-d H:i:s')
					]);
				}
				
				$headerData[] = [
					'quote_id'    => $quote->id,
					'category_id' => $category->id,
					'col_id'      => $key,
					'row_id'      => 0,
					'row_val'     => $item,
					'type'        => 0,
					'created_at'  => date('Y-m-d H:i:s'),
					'updated_at'  => date('Y-m-d H:i:s')
				];
			}
			if (count($headerData) > 0) QuoteDetail::insert($headerData);
		}
		
		return new QuoteResource($quote);
	}
	
	public function update(Request $request, $id = 0)
	{
		$validator = Validator::make($request->all(), [
			'type'             => ['required'],
			'customer_id'      => ['required'],
			'estimated_amount' => ['required']
		]);
		if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
		$quote = Quote::notDeleted()->where('id', $id)->first();
		if (!isset($quote)) return response()->json(['errors' => 'Quote is not valid'], 403);
		$params = $request->all();
		$type = 0;
		if (in_array($params['type'], [0, 1])) {
			$type = $params['type'];
		}
		
		$quote->update([
			'type'                  => $type,
			'customer_id'           => $params['customer_id'],
			'gender'                => $params['gender'],
			'company'               => $params['company'],
			'estimated_date'        => $params['estimated_date'],
			'estimated_amount'      => $params['estimated_amount'],
			'construction_name'     => $params['construction_name'],
			'construction_time'     => $params['construction_time'],
			'quote_expiration_date' => $params['quote_expiration_date'],
			'content'               => $params['content'],
			'template'              => $params['template'],
			'total_amount'          => $params['estimated_amount'],
			'updated_at'            => date('Y-m-d H:i:s')
		]);
		
		QuoteDetail::where('quote_id', $quote->id)->delete();
		if (isset($params['categories'])) {
			$headerData = [];
			foreach ($params['categories'] as $key => $item) {
				$category = Category::notDeleted()->where('name', $item)->first();
				if (!$category) {
					$category = Category::create([
						'name'         => $item,
						'slug'         => $item,
						'parent_id'    => 0,
						'position'     => 0,
						'is_activated' => 1,
						'is_deleted'   => 0,
						'created_at'   => date('Y-m-d H:i:s'),
						'updated_at'   => date('Y-m-d H:i:s')
					]);
				}
				
				$headerData[] = [
					'quote_id'    => $quote->id,
					'category_id' => $category->id,
					'col_id'      => $key,
					'row_id'      => 0,
					'row_val'     => $item,
					'type'        => 0,
					'created_at'  => date('Y-m-d H:i:s'),
					'updated_at'  => date('Y-m-d H:i:s')
				];
			}
			if (count($headerData) > 0) QuoteDetail::insert($headerData);
		}
		
		return response()->json(null, 204);
	}
	
	public function destroy($id = 0)
	{
		$quote = Quote::notDeleted()->where('id', $id)->first();
		if (!isset($quote)) response()->json(['error' => 'Ehhh! Can not delete this quote'], 403);
		
		try {
			$quote->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', []);
		$quotes = Quote::notDeleted()->whereIn('id', $listIds)->get();
		if ($quotes->count() <= 0) response()->json(['error' => 'Quote is not valid.'], 403);
		try {
			Quote::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', []);
		$quotes = Quote::notDeleted()->whereIn('id', $listIds)->get();
		if ($quotes->count() <= 0) response()->json(['error' => 'Quote is not valid.'], 403);
		try {
			Quote::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', []);
		$quotes = Quote::notDeleted()->whereIn('id', $listIds)->get();
		if ($quotes->count() <= 0) response()->json(['error' => 'Quote is not valid.'], 403);
		try {
			Quote::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false]);
		} catch (\Exception $ex) {
			response()->json(['error' => $ex->getMessage()], 403);
		}
		
		return response()->json(null, 204);
	}
}
