<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\RequestMaterial;
use App\Models\MaterialResource;

class RequestMaterialController extends Controller
{
	private function sanitizeDecimal($number) {
		$number = str_replace(".","",$number);
		$number = str_replace(",",".",$number);
		return $number;
	}

	public function add(Request $request){
		$this->validate($request, [
			'proyek_id' => 'required',
			'description' => 'required',
			'required_date' => 'required',
			'qty' => 'required',
			'uom' => 'required',
			'fom_date' => 'required',
		]);

		$data = $request->all();
		$data['price'] = $this->sanitizeDecimal($data['price']);
		$data['qty'] = $this->sanitizeDecimal($data['qty']);
		$data['status'] = "fom";
		$data['created_by'] = $this->currentName;

		$result = RequestMaterial::create($data);

		if(!$result)
			return response()->json(['status'=>'failed','message'=>'Failed to add!','code'=> 500], 500);

		return response()->json(['status'=>'success','message'=>'Data added!', 'data'=>$result, 'code'=>200], 200);
	}

	public function edit($id){
		if(empty($id) || !is_int((int)$id))
			return response()->json(['status'=>'failed','message'=>'id is required!','code'=>400], 400);

		$result = RequestMaterial::find($id);

		if($result)
			return response()->json(['status'=>'success','code'=>200,'data'=>$result], 200);

		return response()->json(['status'=>'failed','message'=>'Data not found!','code'=> 404], 404);
	}

	public function delete($id)
	{
		$data = RequestMaterial::find($id);

		if($data)
			$delete = $data->delete();
		return response()->json(['status'=>'failed','message'=>'Data not found!','code'=>404], 404);

		if($delete)
			return response()->json(['status'=>'success','message'=>'Data deleted!','code'=>200], 200);

		return response()->json(['status'=>'failed','message'=>'Failed to delete!','code'=> 500], 500);
	}

	public function search(Request $request)
	{
		$payload = $request->all();
		$dataBuilder = $this->setUpPayload($payload, 'm_req_material');
		$builder = $dataBuilder['builder'];
		$countBuilder = $dataBuilder['count'];
		$dataGet = $builder->get();
		$totalRecord = $countBuilder->count();
		return response()->json(['status'=>'success','code'=>200,'data'=>$dataGet, 'totalRecord'=>$totalRecord], 200);
	}

	public function list()
	{
		$data = RequestMaterial::all();
		$countData = $data->count();

		if($data)
			return response()->json(['status'=>'success','code'=>200,'data'=>$data, 'totalRecord'=>$countData], 200);

		return response()->json(['status'=>'failed','message'=>'failed get list request material, please try again later!','code'=>400], 400);
	}

	public function update(Request $request, $id)
	{
		$dataForm = $request->all();
		if(empty($id) || !is_int((int)$id))
			return response()->json(['status'=>'failed','message'=>'id is required!','code'=>400], 400);

		$reqMaterial = RequestMaterial::find($id);
		if(!$reqMaterial)
			return response()->json(['status'=>'failed','message'=>'data request material not found!','code'=>400], 400);

		if(!isset($dataForm['status'])){
			if(!$reqMaterial->update($request->all()))
				return response()->json(['status'=>'failed','message'=>'request material failed updated!','code'=>400], 400);
			return response()->json(['status'=>'success','message'=>'request material successfully updated!','code'=>200], 200);
		}

		if($dataForm['status']=="receipt to warehouse"){
			$materialResource = MaterialResource::where('name', 'ilike', $reqMaterial->description)->first();
			if($materialResource){
				$reqMaterial->update($request->all());
				$payloadMQty = $materialResource->qty + $reqMaterial->qty_received;
				MaterialResource::where('id', $materialResource->id)->update(['qty' => $payloadMQty]);
				return response()->json(['status'=>'success', 'code'=>200], 200);
			}

			$reqMaterial->update($request->all());

			$preparedMaterialResource = array(
				"name"          => $dataForm['description'],
				"uom"           => $dataForm['uom'],
				"unit_price"    => 0,
				"description"   => $dataForm['description'],
				"qty"           => $reqMaterial->qty_received,
				"status"        => "Barang tersedia",
				"created_by"    => $this->currentName
			);

			if(!MaterialResource::create($preparedMaterialResource ))
				return response()->json(['status'=>'failed','message'=>'add data material resource failed!','code'=>400], 400);

			return response()->json(['status'=>'success','message'=>'add data material resource successfully!','code'=>200], 200);
		}

		if($dataForm['status']=="receipt to site"){
			$reqMaterial->update($request->all());

			$materialResource = MaterialResource::where('name', 'ilike', $reqMaterial->description)->first();
			if(!$materialResource)
				return response()->json(['status'=>'failed','message'=>'update status receipt to site request material resource failed, because material is not exist in warehouse!','code'=>400], 400);

			$reqMaterial->update($request->all());
			$payloadMQty = $materialResource->qty - $reqMaterial->qty_received;

			if($payloadMQty < 0)
				return response()->json(['status'=>'failed','message'=>'update status receipt to site request material resource failed, because material is not exist in warehouse!','code'=>400], 400);

			MaterialResource::where('id', $materialResource->id)->update(['qty' => $payloadMQty]);
			return response()->json(['status'=>'success', 'message'=>'request material status receipt to site successfully updated!','code'=>200], 200);
		}

		if(!$reqMaterial->update($request->all()))
			return response()->json(['status'=>'failed','message'=>'request material failed updated!','code'=>400], 400);

		return response()->json(['status'=>'success','message'=>'request material successfully updated!','code'=>200], 200);
	}

	private function curlReq($url, $token){
		$ch = curl_init();
		$headers = [
			'Authorization: '.$token
		];
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		$response = curl_exec($ch);
		if ($response === false)
			$response = curl_error($ch);
		curl_close($ch);

		return json_decode($response);
	}

	public function getMaterialIntegration(Request $request) {
		$search = null;
		if(empty($search))
			return response()->json(['status'=>'error', 'message'=>'Empty query string!'], 400);
		$url = str_replace("SEARCH", $search, config('api.adw').'/stock_master?name=SEARCH');
		$token = config('api.adw_token');
		$firstResponse = $this->curlReq($url, $token);

		if($firstResponse->total == 0)
			return response()->json(['status'=>'error', 'message' => 'Data not found!', 'code'=>404], 404);

		$data = $firstResponse->data;
		$currentPage = 1;

		if($firstResponse->last_page > 0) {
			do {
				$currentPage++;
				$response = $this->curlReq($url.'&page='.$currentPage, $token);
				foreach($response->data as $d){
					array_push($data, $d);
				}
			} while ($currentPage < 5);
			// let the user narrow down the search by themself
			// a searching action with 'cable' keyword could take minutes
			// because there are >1k items associated with that keyword
		}

		return response()->json(['status'=>'success', 'data'=> $data, 'total' => count($data), 'code'=>200], 200);
	}
}