<?php

namespace OfficeBrain\Bundle\PaymentBundle\Manager\Extended;

use OfficeBrain\Bundle\PaymentBundle\Manager\AbstractManager\PaymentAbstract;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Payum\Core\Request\Capture;
use Payum\Core\Request\SecuredCapture;
use Payum\Core\Security\SensitiveValue;
use Payum\Core\Model\ArrayObject;
use Payum\Core\Registry\RegistryInterface;
use Payum\Core\Security\GenericTokenFactoryInterface;
use Payum\Core\Request\BinaryMaskStatusRequest;
use Payum\Core\Request\GetHumanStatus;
use OfficeBrain\Bundle\PaymentBundle\Form\AuthorizedDotNetType;
use Symfony\Component\HttpFoundation\JsonResponse;

class AuthorizedDotNetExtended extends PaymentAbstract {
	
	public function __construct($entityManager, $requestManager, $sessionManager, $productDetailServiceManager, $payumManager, $payumSecurityTokenFactoryManager, $routerManager, $payumSecurityHttpRequestVerifierManager, $thirdPartyManager, $commonLibraryManager, $orderManager, $serviceGroupRuleManager, $coreLibraryManager) {
		parent::__construct($entityManager, $requestManager, $sessionManager, $productDetailServiceManager, $payumManager, $payumSecurityTokenFactoryManager, $routerManager, $payumSecurityHttpRequestVerifierManager, $thirdPartyManager, $commonLibraryManager, $orderManager, $serviceGroupRuleManager, $coreLibraryManager);
	}
	public function __destruct() {
		parent::__destruct();
	} 
	
	public function preparePayment($controllerObj) {
		$this->type = new AuthorizedDotNetType(true);
		$paymentName = 'authorize_net_payment';
		$paymentMethod = $this->requestManager->get('payment_type');
		$this->form = $controllerObj->createForm($this->type);
		$this->form->handleRequest($this->requestManager);
		$price=array();
		$total=0;
		if ($this->form->isValid())
		{
			$productData =  $this->getProductData();
			$formData = $this->form->getData();
			foreach($productData as $index=>$data)
			{
				$details['product_name'][$index]=$data['product_name'];
				$details['product_api_code'][$index] =$data['sku_code'];
				$details['product_desc'][$index] =$data['product_name']; 
				$details['quantity'][$index] =$data['total_qty'];
				$details['price'][$index] =$data['total_qty']*$data['unit_price'];
				if(count($data['charges'])>0 && array_key_exists('setup',$data['charges'])){
				$details['setupfee'][$index] = $data['charges']['setup'];
			}else{
				$details['setupfee'][$index] = 0;
			}
			$price[]=$data['total_qty']*$data['unit_price'];
			$total=$total+$data['total_qty']*$data['unit_price']+$details['setupfee'][$index];
			}
			$storage = $this->payumManager->getStorage('OfficeBrain\Bundle\PaymentBundle\Entity\PaymentDetails');
			$paymentDetails = $storage->create();
			$paymentDetails['productDetail'] = $details;
			$paymentDetails['holder'] = $formData['card']['holder'];
			$paymentDetails['currency_code']=$productData[0]['currency'];
			$paymentDetails['amount'] = $total;
			$paymentDetails['card_num'] = new SensitiveValue($formData['card']['number']);
			$paymentDetails['card_code'] = new SensitiveValue($formData['card']['securityCode']);
			$paymentDetails['exp_date'] = new SensitiveValue($formData["card"]["expireAt"]->format('m/Y'));
			$storage->update($paymentDetails);
			$this->sessionManager->set('paymentDetail',array('billing_id'=>$formData['option']['billing_id'],'po_number'=>$formData['option']['number']));
			$captureToken = $this->payumSecurityTokenFactoryManager->createCaptureToken($paymentName,$paymentDetails,'office_brain_paymentBundle_payment_authorizeresponse');
			$this->response['status']="CAPTURE_AIM";
			$this->response['payum_token']=$captureToken;
		}else{
			$this->response['status']="NOTVALIDATE";
			$this->response['notValid']=$this->commonLibraryManager->prepareFormJsonError($this->form);
		}
		return $this->response;
	}
	
	public function loadPaymentForm($controllerObj) {
		$paymentMethod = $this->requestManager->get('payment_type');
		$this->type = new AuthorizedDotNetType(false);
		$this->form = $controllerObj->createForm($this->type);
		$this->response['form']=$this->form->createView();
		$this->response['payment_type']=$paymentMethod;
		return $this->response;
	}
	

	public function captureDone($controllerObj) {
		$token = $this->payumSecurityHttpRequestVerifierManager->verify($this->requestManager);
		$paymentMethod=$token->getGatewayName();
		$payment = $this->payumManager->getGateway($token->getGatewayName());
		$payment->execute($status = new GetHumanStatus($token));
		if ($status->isCaptured()) {
			$data=$status->getModel()->offsetGet('productDetail');
			$data['transaction_id']=$status->getModel()->offsetGet('transaction_id');
			$data['method']=$paymentMethod;
			$data['totalAmt']=$status->getModel()->offsetGet('amount');
			$this->sessionManager->setFlashBagMessage('notice',array('transaction_id'=>$data['transaction_id'],'amount'=>$data['totalAmt']));
			$this->sessionManager->setFlashBagMessage('data',$data);
			$paymentDetail=$this->sessionManager->get('paymentDetail');
			$paymentDetail = array_merge($paymentDetail,array('transaction_id'=>$data['transaction_id'],'amount'=>$data['totalAmt'],'method'=>$data['method']));
			$this->sessionManager->set('paymentDetail',$paymentDetail);
			$this->response['url']=$controllerObj->generateUrl('office_brain_orderbundle_payment_paymentsuccess');
			$this->response['status']="SUCCESS";
	} else if ($status->isPending()) {
			$this->response['url']=$controllerObj->generateUrl('office_brain_orderbundle_payment_paymentfailed');
			if($this->sessionManager->has('paymentDetail')){ $this->sessionManager->remove('paymentDetail'); }
			$this->response['status']="FAILED";
	} else {
		$data['reason']=$status->getModel()->offsetGet('response_reason_text');
		$data['method']=$paymentMethod;
		if($this->sessionManager->has('paymentDetail')){ $this->sessionManager->remove('paymentDetail'); }
		$this->sessionManager->setFlashBagMessage('error',$data);
		$this->response['url']=$controllerObj->generateUrl('office_brain_orderbundle_payment_paymentfailed');
		$this->response['status']="FAILED";
	}
	return $this->response;
	}	
}