<?php

namespace App\Http\Controllers\LoggedIn\StudentModule;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

use App\ReceivedStudentPayment;
use App\ReceivedStudentPaymentSubHead;
use App\PaymentAccount;
use App\StudentOnlinePayment;
use App\Student;
use App\User;
use App\GrandToken;

use Auth;
use DB;
use PDF;
use Validator;
use Carbon\Carbon;

class StudentOnlinePaymentController extends Controller
{
	public function bKashIndex()
	{
		$Data['PageTitle'] = 'Student Online Payment';

		$Data['studentID'] = Student::with(['class_info', 'group', 'section'])
			->select('student_id', 'system_generated_student_id', 'student_name', 'roll_no', 'class_id', 'section_id', 'stu_group', 'acc_year', 'institute_branch_version_id')
			->where('student_id', '=', Auth::user()->student_id)
			->first();

		$Data['paymentHead'] = DB::table('tbl_student_payment_sub_head_details')
			->select('student_payment_id', 'student_payment_name', 'thisTableID', 'payment_amount')
			->where('class_name', $Data['studentID']->class_id)
			->where('group_name', $Data['studentID']->stu_group)
			->where('institute_branch_version_id', $Data['studentID']->institute_branch_version_id)
			->where('student_payment_id', 1)
			->where('is_active', 1)
			->where('acc_year', date('Y'))
			->orderBy('student_payment_id')
			->get();

		$Data['receivedPaymentHead'] = DB::table("tbl_received_student_payment_sub_heads")
			->selectRaw('student_payment_id, month, year, SUM(payment_amount) as payment_amount')
			->where('student_id', Auth::user()->student_id)
			->where('student_payment_id', 1)
			->where('year', date('Y'))
			->where('is_active', 1)
			->where('class_id', $Data['studentID']->class_id)
			->where('group_id', $Data['studentID']->stu_group)
			->where('institute_branch_version_id', $Data['studentID']->institute_branch_version_id)
			->where('section_id', $Data['studentID']->section_id)
			->groupBy('month')
			->get();

		$Data['months'] = [1 => "Jan", "Feb", "Mar", "Apr", "May", "June", 'July', "Aug", "Sep", "Oct", "Nov", "Dec"];

		if (empty($Data['studentID'])) {
			echo '<h6 class="text-danger text-uppercase">No data found.</h6>';
			return;
		}

		return view('LoggedIn.StudentModule.StudentOnlinePayment.bKashIndex', $Data);
	}

	/**
	* Initializing student online payment using bKash payment getway
	**/
	public function InitiatePayment(Request $request)
	{
		$validator = Validator::make($request->all(), array(
			'student_payment_id' => 'required',
			'months' => 'required'
		));

		if ($validator->fails()) {
			return response()->json([
				'status' => 'failed',
				'message' => 'Please select a payment head and a month!'
			]);
		}

		// calculating head amount
		$months = count($request->months);
		$studentPaymentArray = explode('_', $request->student_payment_id);
		$studentPaymentId = $studentPaymentArray[0];
		$headPaymentAmount = $this->GetHeadValueByHeadId($studentPaymentId);
		$totalAmount = $headPaymentAmount * $months;
		$serviceCharge = ceil(($totalAmount / .985) - $totalAmount);
		$totalAmountWithCharge = $totalAmount + $serviceCharge;

		// validating the amount
		if ($totalAmountWithCharge != $request->amount) {
			return response()->json([
				'status' => 'failed',
				'message' => 'Amount did not match!'
			]);
		}

		// getting grand token that are requested within an hour
		$grandTokenDetails = GrandToken::where('created_at', '>', Carbon::now()->subHours(1)->toDateTimeString())->orderBy('id', 'desc')->first();

		if (empty($grandTokenDetails)) {
			// if no grand token found within an hour of time, requesting for new grand token
			$data = array(
				"app_key" => "5ghghccprp2asdsgki3mke7ttc",
				"app_secret" => "j16ut7bqfp4mh7ctlaen859qu16pkd6rfvpsfp64h04qmp45487"
			);
			$postData = json_encode($data);

			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL,"https://checkout.pay.bka.sh/v1.2.0-beta/checkout/token/grant");
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_HTTPHEADER, [
				"username: FRIDEALINST",
				"password: Fa@1iZu3rD9c",
				"Content-Type: application/json"
			]);
			$grandTokenResponse = curl_exec($ch);
			curl_close ($ch);

			// saving the new grand token to database
			GrandToken::insert([
				'api_response' => $grandTokenResponse,
				'created_at' => Carbon::now()
			]);

			$grandTokenResult = json_decode($grandTokenResponse);
		} else {
			$grandTokenResult = json_decode($grandTokenDetails->api_response);
		}

		// requesting for create payment with requested amount
		$data = array(
			"amount" => $request->amount,
			"currency" => "BDT",
			"intent" => "sale",
			"merchantInvoiceNumber" => time(),
		);
		$postData = json_encode($data);

		// initiating the payment
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL,"https://checkout.pay.bka.sh/v1.2.0-beta/checkout/payment/create");
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, [
			"authorization: " . $grandTokenResult->id_token,
			"x-app-key: 5ghghccprp2asdsgki3mke7ttc",
			"Content-Type: application/json",
			"Accept: application/json"
		]);
		$createPaymentResponse = curl_exec($ch);
		curl_close ($ch);
		$createPaymentResult = json_decode($createPaymentResponse);

		return response()->json([
			'create_payment_response' => $createPaymentResult
		]);
	}

	public function executePaymentRequest(Request $request)
	{
		// getting grand token that are requested within an hour
		$grandTokenDetails = GrandToken::where('created_at', '>', Carbon::now()->subHours(1)->toDateTimeString())->orderBy('id', 'desc')->first();
		$grandTokenResult = json_decode($grandTokenDetails->api_response);

		// executing the payment
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, "https://checkout.pay.bka.sh/v1.2.0-beta/checkout/payment/execute/" . $request->paymentID);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, [
			"authorization: " . $grandTokenResult->id_token,
			"x-app-key: 5ghghccprp2asdsgki3mke7ttc",
			"Content-Type: application/json",
			"Accept: application/json"
		]);

		$paymentExecuteResponse = curl_exec($ch);
		curl_close ($ch);
		$paymentStatus = json_decode($paymentExecuteResponse);

		return response()->json([
			'payment_execute_response' => $paymentStatus
		]);
	}

	public function storePaymentDetails(Request $request)
	{
		$studentPaymentArray = explode('_', $request->student_payment_id);
		$studentPaymentId = $studentPaymentArray[1];
		$studentDetails = Student::where('student_id', Auth::user()->student_id)->first();

		$studentOnlinePaymentArray = [];
		foreach ($request->months as $key => $month) {
			array_push($studentOnlinePaymentArray, [
				'student_id' => $studentDetails->student_id,
				'payment_amount' => $request->head_amount,
				'payment_done' => 1,
				'payment_details' => json_encode($request->paymentExecuteResponse),
				'student_payment_id' => $studentPaymentId,
				'invoice_id' => $request->paymentExecuteResponse['trxID'],
				'month' => $month,
				'year' => date('Y'),
				'created_at' => date('Y-m-d H:i:s'),
			]);
		}

		if (!empty($studentOnlinePaymentArray)) {
			DB::table('student_online_payments')->insert($studentOnlinePaymentArray);
		}

		$receivedPayment = new ReceivedStudentPayment();
		$receivedPayment->invoice_id = $request->paymentExecuteResponse['trxID'];
		$receivedPayment->payment_method = 'bKash';
		$receivedPayment->student_id = $studentDetails->student_id;
		$receivedPayment->system_generated_student_id = $studentDetails->system_generated_student_id;
		$receivedPayment->school_branch_id = $studentDetails->branch;
		$receivedPayment->generated_month = date('m');
		$receivedPayment->student_roll = $studentDetails->roll_no;
		$receivedPayment->institute_branch_version_id = $studentDetails->institute_branch_version_id;
		$receivedPayment->class_id = $studentDetails->class_id;
		$receivedPayment->section_id = $studentDetails->section_id;
		$receivedPayment->group_id = $studentDetails->stu_group;
		$receivedPayment->received_amount_by_bank = $request->totalAmount;
		$receivedPayment->online_payment_service_charge = $request->service_charge;
		$receivedPayment->received_time = date('Y-m-d H:i:s');
		$receivedPayment->confirm_time = date('Y-m-d H:i:s');
		$receivedPayment->is_active = 1;
		$receivedPayment->bank_id = 1;
		$receivedPayment->bank_branch_id = 1;
		$receivedPayment->confirm_by_bank_admin = 1;
		$receivedPayment->confirm_by_school_user_id = Auth::user()->user_id;
		$receivedPayment->bank_user_id = Auth::user()->user_id;
		$receivedPayment->create_time = date('Y-m-d H:i:s');
		$receivedPayment->create_user_id = Auth::user()->user_id;
		$receivedPayment->create_logon_id = session('sessLogonId');
		$receivedPayment->last_action = 'INSERT';

		if ($receivedPayment->save()) {
			$receivedStudentPaymentSubHeadArray = [];

			foreach ($request->months as $key => $month) {
				array_push($receivedStudentPaymentSubHeadArray, [
					'invoice_id' => $request->paymentExecuteResponse['trxID'],
					'received_student_payment_id' => $receivedPayment->received_student_payment_id,
					'student_payment_id' => $studentPaymentId,
					'student_payment_name' => $request->student_payment_name,
					'payment_amount' => $request->head_amount,
					'student_id' => $studentDetails->student_id,
					'system_generated_student_id' => $studentDetails->system_generated_student_id,
					'school_branch_id' => $studentDetails->branch,
					'institute_branch_version_id' => $studentDetails->institute_branch_version_id,
					'class_id' => $studentDetails->class_id,
					'group_id' => $studentDetails->stu_group,
					'section_id' => $studentDetails->section_id,
					'month' => $month,
					'year' => date('Y'),
					'is_active' => 1,
					'create_time' => date('Y-m-d H:i:s'),
					'create_user_id' => Auth::user()->user_id,
					'create_logon_id' => session('sessLogonId'),
					'last_action' => 'INSERT',
					'pay_status' => 1,
					'received_time' => date('Y-m-d H:i:s')
				]);
			}

			if (!empty($receivedStudentPaymentSubHeadArray)) {
				$inserted = DB::table('tbl_received_student_payment_sub_heads')->insert($receivedStudentPaymentSubHeadArray);

				if ($inserted) {
					return response()->json([
						'status' => "success"
					]);
				} else {
					return response()->json([
						'status' => "failed"
					]);
				}
			} else {
				return response()->json([
					'status' => "failed"
				]);
			}
		} else {
			return response()->json([
				'status' => "failed"
			]);
		}
	}

	public function queryPaymentDetails(Request $request)
	{
		// getting grand token that are requested within an hour
		$grandTokenDetails = GrandToken::where('created_at', '>', Carbon::now()->subHours(1)->toDateTimeString())->orderBy('id', 'desc')->first();
		$grandTokenResult = json_decode($grandTokenDetails->api_response);

		// querying the payment by payment id
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, "https://checkout.pay.bka.sh/v1.2.0-beta/checkout/payment/query/" . $request->paymentID);
		curl_setopt($ch, CURLOPT_POST, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, [
			"authorization: " . $grandTokenResult->id_token,
			"x-app-key: 5ghghccprp2asdsgki3mke7ttc",
			"Content-Type: application/json",
			"Accept: application/json"
		]);
		$queryResponse = curl_exec($ch);
		curl_close ($ch);
		$queryResult = json_decode($queryResponse);

		return response()->json([
			'queryResult' => $queryResult
		]);
	}

	/******************* Get Head Value ********************** */
	public function GetHeadValueByHeadId($headId)
	{
		$studentOffers = DB::table('tbl_students AS si')
			->where('student_id', Auth::user()->student_id)
			->value("free_payment_view_id");

		$comma_seperator = explode(',', $studentOffers);
		$free_payment = DB::table('tbl_stu_free_payment_view')
			->whereIn('free_payment_view_id', $comma_seperator)
			->lists('amount', 'head_id');

		$HeadAmount = DB::table('tbl_student_payment_sub_head_details')
			->select('student_payment_id', 'payment_amount')
			->where('thisTableID', $headId)
			->where('is_active', 1)
			->first();

		$specialOffer = 0;
		if (isset($free_payment[$HeadAmount->student_payment_id])) {
			$specialOffer = $free_payment[$HeadAmount->student_payment_id];
		}

		$paymentAmount = $HeadAmount->payment_amount - $specialOffer;
		return $paymentAmount;
	}
}
