<?php

namespace App\Http\Controllers;

use App\Order;
use App\Cart;
use Illuminate\Http\Request;
use Auth;
use Softon\Indipay\Facades\Indipay;  

class OrderController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $carts = Cart::all()->where( 'user_id' , Auth::user()->id);
        return view('user.pages.checkout')->withCarts($carts);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create(Request $request)
    {
        //

    }
    /**
     * CCAvenue Encrypt Function
     *
     * @param $plainText
     * @param $key
     * @return string
     */
    protected function encrypt($plainText,$key)
    {
        $secretKey = $this->hextobin(md5($key));
        $initVector = pack("C*", 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f);
        $openMode = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '','cbc', '');
        $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, 'cbc');
        $plainPad = $this->pkcs5_pad($plainText, $blockSize);
        if (mcrypt_generic_init($openMode, $secretKey, $initVector) != -1)
        {
            $encryptedText = mcrypt_generic($openMode, $plainPad);
            mcrypt_generic_deinit($openMode);

        }
        return bin2hex($encryptedText);
    }
        /**
     * @param $hexString
     * @return string
     */
    protected function hextobin($hexString)
    {
        $length = strlen($hexString);
        $binString="";
        $count=0;
        while($count<$length)
        {
            $subString =substr($hexString,$count,2);
            $packedString = pack("H*",$subString);
            if ($count==0)
            {
                $binString=$packedString;
            }

            else
            {
                $binString.=$packedString;
            }

            $count+=2;
        }
        return $binString;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
        $first_name_billing = $request->first_name_billing;
        $last_name_billing = $request->last_name_billing;
        $company_name_billing =( $request->company_name_billing) ?  $request->company_name_billing : '';
        $email_billing = $request->email_billing;
        $mobile_no_billing = $request->mobile_no_billing;
        $country_billing = $request->country_billing;
        $addreess_billing = $request->addreess_billing;
        $street_address_billing = $request->street_address_billing;
        $city_billing = $request->city_billing;
        $state_billing = $request->state_billing;
        $postcode_billing = $request->postcode_billing;

        $billing_data=array(
            "first_name_billing"=>$first_name_billing,
            "last_name_billing"=>$last_name_billing,
            "company_name_billing"=>$company_name_billing,
            "email_billing"=>$email_billing,
            "mobile_no_billing"=>$mobile_no_billing,
            "country_billing"=>$country_billing,
            "addreess_billing"=>$addreess_billing,
            "street_address_billings"=>$street_address_billing,
            "city_billing"=>$city_billing,
            "state_billing"=>$state_billing,
            "postcode_billing"=>$postcode_billing
        );
        $billing_data = json_encode($billing_data);

        $first_name_shipping = $request->first_name_shipping;
        $last_name_shipping = $request->last_name_shipping;
        $company_name_shipping =( $request->company_name_shipping) ?  $request->company_name_shipping : '';
        $email_shipping = $request->email_shipping;
        $mobile_no_shipping = $request->mobile_no_shipping;
        $country_shipping = $request->country_shipping;
        $addreess_shipping = $request->addreess_shipping;
        $street_address_shipping = $request->street_address_shipping;
        $city_shipping = $request->city_shipping;
        $state_shipping = $request->state_shipping;
        $postcode_shipping = $request->postcode_shipping;

        $shipping_data=array(
            "first_name_shipping"=>$first_name_shipping,
            "last_name_shipping"=>$last_name_shipping,
            "company_name_shipping"=>$company_name_shipping,
            "email_shipping"=>$email_shipping,
            "mobile_no_shipping"=>$mobile_no_shipping,
            "country_shipping"=>$country_shipping,
            "addreess_shipping"=>$addreess_shipping,
            "street_address_shipping"=>$street_address_shipping,
            "city_shipping"=>$city_shipping,
            "state_shipping"=>$state_shipping,
            "postcode_shipping"=>$postcode_shipping
        );

        $shipping_data = json_encode($shipping_data);

        $carts = Cart::all()->where( 'user_id' , Auth::user()->id);

        $cart_data = json_encode( $carts );
        $message =( $request->message) ?  $request->message : '';
        $cart_subtotal =( $request->cart_subtotal) ?  $request->cart_subtotal : '';
        $cart_total =( $request->cart_total) ?  $request->cart_total : '';

        $order = new Order();
        $order->user_id = Auth::user()->id;
        $order->products = $cart_data;
        $order->shipping_address = $shipping_data;
        $order->billing_address = $billing_data;
        $order->subtotal = ($request->cart_subtotal)?$request->cart_subtotal:0;
        $order->shpping_cost = ($request->shpping_cost)?$request->shpping_cost:0;
        $order->grand_total = ($request->cart_total)?$request->cart_total:0;
        $order->order_notes = ($request->message)?$request->message:'';
        $order->payment_status = 0;
        $order->status = 1;
        $res = $order->save();
        if($res)
        {
            $accessCode = 'AVBQ82FL23AW59QBWA';
            $workingKey = 'A56C1D8119DADA67085D479B920E9FCA';
            //$parameters['merchantId'] = '201290';
           
            $parameters['redirect_url'] = url('/').'/return/';
            $parameters['cancel_url']= url('/').'/return/';
            $parameters['currency'] = 'INR';
            $parameters['language'] = 'EN';
            $parameters['merchant_id']= '201290';
            $parameters['order_id'] = '1232212';
            $parameters['amount'] = $request->cart_total;
            $testEndPoint = 'https://secure.ccavenue.com/transaction/transaction.do?command=initiateTransaction';
            $merchantData='';
            foreach( $parameters as $key=>$value) {
                $merchantData .= $key.'='.$value.'&';
            }

  
            $encRequest = $this->encrypt($merchantData,$workingKey);
            // print_r($parameters);
            // print_r( $encRequest );
            
            // View::make('indipay::ccavenue')->with('encRequest',$this->encRequest)
            //              ->with('accessCode',$this->accessCode)
            //              ->with('endPoint',$this->getEndPoint());
                         
            return view('ccavenue')->with('encRequest', $encRequest)
                         ->with('accessCode', $accessCode)
                         ->with('endPoint',$testEndPoint );
        }


       // die;
    }
    public function response(Request $request)
    
    {
        print_r($_POST);
       print_r($request->encResp);
        echo "test";
        //die;
        $workingKey = 'A56C1D8119DADA67085D479B920E9FCA';
       $encResponse = $request->encResp;
       

        $rcvdString = $this->decrypt($encResponse,$workingKey);
        echo $rcvdString;
        parse_str($rcvdString, $decResponse);
        die();
        return $decResponse;
    
    }  
      /**
     * CCAvenue Decrypt Function
     *
     * @param $encryptedText
     * @param $key
     * @return string
     */
    protected function decrypt($encryptedText,$key)
    {
        $secretKey = $this->hextobin(md5($key));
        $initVector = pack("C*", 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f);
        $encryptedText=$this->hextobin($encryptedText);
        $openMode = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '','cbc', '');
        mcrypt_generic_init($openMode, $secretKey, $initVector);
        $decryptedText = mdecrypt_generic($openMode, $encryptedText);
        $decryptedText = rtrim($decryptedText, "\0");
        mcrypt_generic_deinit($openMode);
        return $decryptedText;

    }

      /**
     * @param $plainText
     * @param $blockSize
     * @return string
     */
    protected function pkcs5_pad($plainText, $blockSize)
    {
        $pad = $blockSize - (strlen($plainText) % $blockSize);
        return $plainText . str_repeat(chr($pad), $pad);
    }


    /**
     * Display the specified resource.
     *
     * @param  \App\Order  $order
     * @return \Illuminate\Http\Response
     */
    public function show(Order $order)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Order  $order
     * @return \Illuminate\Http\Response
     */
    public function edit(Order $order)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Order  $order
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Order $order)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Order  $order
     * @return \Illuminate\Http\Response
     */
    public function destroy(Order $order)
    {
        //
    }
}
