<?php

namespace App\Jobs;

use App\Components\MomoServices;
use App\Models_v2\Transaction;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class ProcessMomoConfirmPayAppRequest implements ShouldQueue {
	use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

	/**
	 * Create a new job instance.
	 *
	 * @return void
	 */
	protected $params;

	public function __construct( $params ) {
		//
		$this->params = $params;
	}

	/**
	 * Execute the job.
	 *
	 * @return void
	 */
	public function handle() {
		//
		$partnerRefId = $this->params['partner_ref_id'];
		$momoTransId  = $this->params['momo_trans_id'];

		$transaction = Transaction::query()
		                          ->where( 'wallet_trans_id', $momoTransId )
		                          ->where( 'status', Transaction::STATUS_NOT_PROCESS )
		                          ->first();

		if ( ! $transaction ) {
			return;
		}

		$requestLog = $transaction->request_log;
		if ( ! isset( $requestLog['customer_number'] ) ) {
			return;
		}

		$customerNumber = $requestLog['customer_number'];

		$momoClient = new MomoServices();
		$response   = $momoClient->confirmPayApp( [
			'partner_ref_id'  => $partnerRefId,
			'momo_trans_id'   => $momoTransId,
			'customer_number' => $customerNumber,
			'request_type'     => 'capture'
		] );

		\Log::info(json_encode($response));

		if ( $response['status'] == 0 ) {
			$transaction->user->increment( 'balance', $transaction->amount );
			$transaction->status = Transaction::STATUS_PROCESSED;
			$transaction->save();
		} else {
			$momoClient->confirmPayApp( [
				'partner_ref_id'  => $partnerRefId,
				'momo_trans_id'   => $momoTransId,
				'customer_number' => $customerNumber,
				'request_type'     => 'revertAuthorize'
			] );
		}
	}
}
