<?php namespace App\Http\Controllers\paypal;

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

use Illuminate\Http\Request;
use Paypal;
use App\Models\teamstore\TeamStoreModel;
use App\Models\user\UserModel;
use App\Models\paypal\PayPalModel;
use Auth;
use Session;
use Redirect;
use Mail;



class PaypalController extends Controller {

	private $_apiContext;


    public function __construct()
    {
        $this->_apiContext = PayPal::ApiContext(
            config('services.paypal.client_id'),
            config('services.paypal.secret'));


        $this->_apiContext->setConfig(array(
            'mode' => 'sandbox',
            'service.EndPoint' => 'https://api.sandbox.paypal.com',
            'http.ConnectionTimeOut' => 30,
            'log.LogEnabled' => true,
            'log.FileName' => storage_path('logs/paypal.log'),
            'log.LogLevel' => 'FINE'
		));
		
		// live 
		// $this->_apiContext->setConfig(array(
        //     'mode' => 'live',
        //     'service.EndPoint' => 'https://api.paypal.com',
        //     'http.ConnectionTimeOut' => 30,
        //     'log.LogEnabled' => true,
        //     'log.FileName' => storage_path('logs/paypal.log'),
        //     'log.LogLevel' => 'FINE'
        // ));
    }


    public function payPremium()
    {
    	return view('payPremium');
    }


    public function getCheckout(Request $request)
	{

		if(Auth::guest()){

			Session::flash('msg', 'Please login to proceed.');
			return Redirect::back();
		}

	    $payer = PayPal::Payer();
	    $payer->setPaymentMethod('paypal');

		

		$m		 = new TeamStoreModel;
		$paypal_model		 = new PayPalModel;
		$last_id 		= $paypal_model->getLastIdPaymentDetails();
		$invoice_num 	= str_pad($last_id[0]->Id, 4,'0',STR_PAD_LEFT);
		$cartKey 		= $request->session()->get('cartkey');
		
		$items 	 		= $m->myCart($cartKey);
		$getSubtotal 	= $m->getSubtotal($cartKey);

		// var_dump($getSubtotal[0]->Subtotal);

		$order_subtotal = $getSubtotal[0]->Subtotal;
		$order_grandtotal = $getSubtotal[0]->Subtotal;

		$tax = $order_grandtotal * 0.10;

		$order_items = array();
		
		foreach($items as $key => $item){
			if($item->Order == "Jersey"){

				$itemOrder    = " (Jersey Only)";
			
			}elseif ($item->Order == "Shorts"){

				$itemOrder = " (Shorts Only)";
		
			}else{
				$itemOrder = " (w/ Shorts)";
			}

			// $descriptions = "Name: " . $item->Name . " Number: " . $item->Number . " Size: " . $item->Size;"?"
 
			$order_items[$key] = PayPal::Item();
			$order_items[$key]->setName($item->ProductName);
			$order_items[$key]->setCurrency('USD');
			$order_items[$key]->setQuantity($item->Quantity);
			// $order_items[$key]->setDescription($descriptions);
			// $order_items[$key]->setTax(10);
			$order_items[$key]->setPrice($item->Price);
			
		}
		
		$item_list = PayPal::ItemList();
		$item_list->setItems($order_items);
		

		$amount_details = PayPal::Details();
		$amount_details->setSubtotal($order_subtotal);
		$amount_details->setTax($tax);

		$amount = PayPal::Amount();
		$amount->setCurrency('USD');
		$amount->setDetails($amount_details);
		$amount->setTotal($order_grandtotal + $tax);
		
		$transaction = PayPal::Transaction();
		$transaction->setAmount($amount);
		$transaction->setItemList($item_list);
		
		// $transaction->setDescription('Your transaction description');
		$transaction->setInvoiceNumber(date('Ymd') . '-' . $invoice_num);
		
	    $redirectUrls = PayPal:: RedirectUrls();
	    $redirectUrls->setReturnUrl(route('getDone'));
	    $redirectUrls->setCancelUrl(route('getCancel'));


	    $payment = PayPal::Payment();
	    $payment->setIntent('sale');
	    $payment->setPayer($payer);
	    $payment->setRedirectUrls($redirectUrls);
	    $payment->setTransactions(array($transaction));


	    $response = $payment->create($this->_apiContext);
	    $redirectUrl = $response->links[1]->href;


	    return redirect()->to( $redirectUrl );
	}

	public function getDoneTest()
	{
		// $paymentId= "PAY-66Y799521H279203PLOP2X4Y";
		// $payment = PayPal::getById($paymentId, $this->_apiContext);

		// $obj = json_decode($payment);
		// // var_dump($obj);

		// $total = $obj->transactions[0]->amount->total;
		// $currency = $obj->transactions[0]->amount->currency;
		// $invoice_number  = $obj->transactions[0]->invoice_number;

		// return view('paypal.get_done')
		// 							->with('currency', $currency)
		// 							->with('total', $total);
		// try {
		// 	$invoice = PayPal::Invoice();
		// 	echo $number = $invoice->generateNumber($this->_apiContext);
		// } catch (Exception $ex) {
		// 	echo $ex;
		// }

		
	}

	public function getDone(Request $request)
	{
	    $id = $request->get('paymentId');
	    $token = $request->get('token');
	    $payer_id = $request->get('PayerID');


	    $payment = PayPal::getById($id, $this->_apiContext);

		$paymentExecution = PayPal::PaymentExecution();

	    $paymentExecution->setPayerId($payer_id);
	    $executePayment = $payment->execute($paymentExecution, $this->_apiContext);

		// print_r($executePayment);
		// if ($executePayment->getState() == 'approved') { 
            
        //     /** it's all right **/
        //     /** Here Write your database logic like that insert record or value in database if you want **/

        //     // \Session::put('success','Payment success');
		// 	// return Redirect::route('paywithpaypal');
		// 	echo 'Payment success';
		// }
		$obj = json_decode($executePayment);

	
		$line2 = null;
		
		//details
		$total = $obj->transactions[0]->amount->total;
		$sub_total = $obj->transactions[0]->amount->details->subtotal;
		$tax = $obj->transactions[0]->amount->details->tax;

		$currency = $obj->transactions[0]->amount->currency;
		$invoice_number  = $obj->transactions[0]->invoice_number;

		//shipping address details
		$recipient_name = $obj->transactions[0]->item_list->shipping_address->recipient_name;
		$line1 	= $obj->transactions[0]->item_list->shipping_address->line1;
		if(isset($obj->transactions[0]->item_list->shipping_address->line2)){
			$line2 	= $obj->transactions[0]->item_list->shipping_address->line2;
		}
		$city 	= $obj->transactions[0]->item_list->shipping_address->city;
		$state 	= $obj->transactions[0]->item_list->shipping_address->state;
		$postal_code = $obj->transactions[0]->item_list->shipping_address->postal_code;
		$country_code = $obj->transactions[0]->item_list->shipping_address->country_code;

		// payer info
		$payment_method = $obj->payer->payment_method;
		$email = $obj->payer->payer_info->email;
		$first_name = $obj->payer->payer_info->first_name;
		$last_name = $obj->payer->payer_info->last_name;
		$_payer_id = $obj->payer->payer_info->payer_id;
			
		/// end paypal codes

		$paypal_model		 = new PayPalModel;
		$m		 = new TeamStoreModel;
		$cartKey = $request->session()->get('cartkey');
		$userId = Auth::user()->id;
		$user_email = Auth::user()->email;

		$items 	 		= $m->myCart($cartKey); // item from cart_tmp
		$getSubtotal 	= $m->getSubtotal($cartKey);

		$payment_details = array(

								'UserId'		=> $userId,
								'CartKey'		=> $cartKey,
								'PaymentId' 	=> $id,
								'Token' 		=> $token,
								'PayerId'	 	=> $payer_id,
								'InvoiceNumber'	=> $invoice_number,
								'Currency'	 	=> $currency,
								'Total'	 		=> $total,
								'SubTotal'	 	=> $sub_total,
								'Tax'	 		=> $tax,
								'Payer_Email'	 	=> $email,
								'Payer_Firstname'	=> $first_name,
								'Payer_Lastname'	=> $last_name,
								'PaymentMethod' 	=>$payment_method

							);

		$p_id 	= 	$paypal_model->insertToPaypalDetails($payment_details);

		$shipping_address = array(
			'PaymentDetail_Id' => $p_id,
			'recipient_name' => $recipient_name,
			'line1' => $line1,
			'line2' => $line2,
			'city' => $city,
			'state' => $state,
			'postal_code' => $postal_code,
			'country_code' => $country_code,
		);
		// iinsert shipping address 
		$paypal_model->insertShippingAddress($shipping_address);
	
		// insert order from cart_tmp to orders table
		$l = $paypal_model->insertToOrders($cartKey); // insert to orders table

		//email sending
		$newUserModel 			= new UserModel;
		$order_item_array 		= $newUserModel->selectOrderItem($cartKey);
		$item_goup_array 		= $newUserModel->itemGroup($cartKey);
		$item_thumbs 			= $newUserModel->selectDisplayItemThumb();
		$array_payment_details 	= $newUserModel->selectPaymentDetails('CartKey', $cartKey);


		$data = array(
			'order_item_array' => $order_item_array,
			'item_goup_array' => $item_goup_array,
			'img_thumb' => $item_thumbs,
			'array_payment_details' => $array_payment_details,
			'receiver'   => $user_email,
			'subject' => 'Order Details',
		);
		
		Mail::send('emails.orders', $data, function($message) use ($data) {
			
			$message->from('no-reply@crewsportswear.com', 'CREW Sportswear');
			$message->cc('orders@crewsportswear.com', 'Orders From CREW Sportswear');
			$message->to($data['receiver'])->subject('Order Details');

		});
		// end email sending

		$request->session()->forget('cartkey'); // clear session for cartkey
		
		// redirect to thank you page.
		return view('paypal.get_done')
								->with('currency', $currency)
								->with('total', $total);

	}


	public function getCancel()
	{
	    return redirect()->route('cart');
	}

}
