<?php

namespace App\Http\Controllers;

use App\Order;
use App\Cart;
use Illuminate\Http\Request;
use Auth;
use Mail;
use Redirect;
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)
    {

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

        $shipping_data=array(
            "first_name_shipping"=>'',
            "last_name_shipping"=>'',
            "company_name_shipping"=>'',
            "email_shipping"=>'',
            "mobile_no_shipping"=>'',
            "country_shipping"=>'',
            "addreess_shipping"=>'',
            "street_address_shipping"=>'',
            "city_shipping"=>'',
            "state_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 : '';
        $today = date('YmdHi');
        $rand= rand(100,9999999999999);
        $order = new Order();
        $order->order_id = $today.$rand;
        $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->coupon_code = ($request->coupon_code)?$request->coupon_code:'';
        $order->coupon_discount = ($request->coupon_discount)?$request->coupon_discount: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->tracking_id = ($request->tracking_id)?$request->tracking_id:'';
        $order->bank_ref_no = ($request->bank_ref_no)?$request->bank_ref_no:'';
        $order->order_status = ($request->order_status)?$request->order_status:'';
        $order->failure_message = ($request->failure_message)?$request->failure_message:'';
        $order->payment_mode = ($request->payment_mode)?$request->payment_mode:'';
        $order->card_name = ($request->card_name)?$request->card_name:'';
        $order->status_message = ($request->status_message)?$request->status_message:'';
        $order->currency = ($request->shpping_cost)?$request->currency:'';
        $order->offer_type = ($request->offer_type)?$request->offer_type:'';
        $order->offer_code = ($request->offer_code)?$request->offer_code:'';
        $order->discount_value = ($request->discount_value)?$request->discount_value:'';
        $order->mer_amount = ($request->mer_amount)?$request->mer_amount:'';
        $order->billing_notes = ($request->billing_notes)?$request->billing_notes:'';
        $order->trans_date = ($request->trans_date)?$request->trans_date:'';

        $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);
            $url = 'http://buyonlineclasses.com/ionic?id='.$order->id.'&m='.$request->cart_total;
            // 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 );
            return Redirect::to($url);
        }


       // die;
    }
    public function response(Request $request)    
    {
      
        $id = $request->order_id;
        //
        $billing_name = ($request->billing_name) ? $request->billing_name : '';
        $billing_address = ($request->billing_address) ? $request->billing_address : '';
        $billing_city = ($request->billing_city) ? $request->billing_city : '';
        $billing_state = ($request->billing_state) ? $request->billing_state : '';
        $billing_zip = ($request->billing_zip) ? $request->billing_zip : '';
        $billing_country = ($request->billing_country) ? $request->billing_country : '';
        $billing_tel = ($request->billing_tel) ? $request->billing_tel : '';
        $billing_email = ($request->billing_email) ? $request->billing_email : '';
        $billing_data=array(
            "billing_name"=>$billing_name,
            "billing_address"=>$billing_address,
            "billing_city"=>$billing_city,
            "billing_state"=>$billing_state,
            "billing_zip"=>$billing_zip,
            "billing_country"=>$billing_country,
            "billing_tel"=>$billing_tel,
            "billing_email"=>$billing_email
        );
        $billing_data = json_encode($billing_data);
           
        $delivery_name = ($request->delivery_name) ? $request->delivery_name : '';
        $delivery_address = ($request->delivery_address) ? $request->delivery_address : '';
        $delivery_city = ($request->delivery_city) ? $request->delivery_city : '';
        $delivery_state = ($request->delivery_state) ? $request->delivery_state : '';
        $delivery_zip = ($request->delivery_zip) ? $request->delivery_zip : '';
        $delivery_country = ($request->delivery_country) ? $request->delivery_country : '';
        $delivery_tel = ($request->delivery_tel) ? $request->delivery_tel : '';
        $shipping_data=array(
            "delivery_name"=>$delivery_name,
            "delivery_address"=>$delivery_address,
            "delivery_city"=>$delivery_city,
            "delivery_state"=>$delivery_state,
            "delivery_zip"=>$delivery_zip,
            "delivery_country"=>$delivery_country,
            "delivery_tel"=>$delivery_tel
        );
        $shipping_data = json_encode($shipping_data);
       
        $order = Order::find($id);
        $order->shipping_address = $shipping_data;
        $order->billing_address = $billing_data;
        $order->order_notes = ($request->message)?$request->message:'';
        $order->tracking_id = ($request->tracking_id)?$request->tracking_id:'';
        $order->bank_ref_no = ($request->bank_ref_no)?$request->bank_ref_no:'';
        $order->order_status = ($request->order_status)?$request->order_status:'';
        $order->failure_message = ($request->failure_message)?$request->failure_message:'';
        $order->payment_mode = ($request->payment_mode)?$request->payment_mode:'';
        $order->card_name = ($request->card_name)?$request->card_name:'';
        $order->status_message = ($request->status_message)?$request->status_message:'';
        $order->currency = ($request->shpping_cost)?$request->currency:'';

        $order->payment_status = 0;
        $order->status = 1;
        $res = $order->save();
        if($res)
        {
            $data = array();
            $data = array(
                "order_id" =>$order->order_id,
                "name" =>$request->billing_name,
                "products" =>$order->products,
                "shipping_address" =>$shipping_data,
                "billing_address" =>$billing_data,
                "subtotal" =>$order->subtotal,
                "coupon_code" =>$order->coupon_code,
                "coupon_discount" => $order->coupon_discount,
                "grand_total" => $order->grand_total
            );
            if($order->order_status == 'Aborted ')
            {
                $to_name = 'Krative';
                $to_email = 'cutepie.keya@gmail.com';
                Mail::send('email.orderplace', $data, function($message) use ($to_name, $to_email) {
                    $message->to($to_email, $to_name)
                            ->subject('Order Cancel by user');
                    $message->from('keya.kreative@gmail.com','Buy Online Classes');
                });
                session()->flash('success', 'Order cancel by user.');
                return redirect()->route('user.pages.cancel');
            }
            else{
                $to_name = 'Krative';
                $to_email = 'cutepie.keya@gmail.com';
                Mail::send('email.orderplace', $data, function($message) use ($to_name, $to_email) {
                    $message->to($to_email, $to_name)
                            ->subject('New Order Placed');
                    $message->from('keya.kreative@gmail.com','Buy Online Classes');
                });

                // $to_name = 'Krative';
                // $to_email = $request->billing_email;
                // Mail::send('email.userorderplace', $data, function($message) use ($to_name, $to_email) {
                //     $message->to($to_email, $to_name)
                //             ->subject('Your Order Details');
                //     $message->from('keya.kreative@gmail.com','Buy Online Classes');
                // });


                session()->flash('success', 'Order cancel by user.');
                return redirect()->route('user.pages.thankyou');

            }
            
        }
       // die;
    
    }  
      /**
     * 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)
    {
        //
    }
}
