<?php
namespace BooklyPro\Lib\Payment;

use Bookly\Lib\Entities\Payment;
use Bookly\Lib\Utils\Common;

/**
 * Class Payir
 * @package BooklyPro\Lib\Payment
 */
class Payir
{
	const TYPE_EXPRESS_CHECKOUT  = 'ec';
    const TYPE_PAYMENTS_STANDARD = 'ps';

    //const URL_POSTBACK_IPN_LIVE = 'https://www.paypal.com/cgi-bin/webscr';
    //const URL_POSTBACK_IPN_SANDBOX = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
	
    // Array for cleaning PayPal request
    static public $remove_parameters = array( 'bookly_action', 'bookly_fid', 'error_msg', 'token', 'PayerID',  'type' );

    /** @var  string */
    private $error;

    /**
     * The array of products for checkout
     *
     * @var \stdClass
     */
    protected $product;

    /** @var  float */
    protected $tax = 0;
    /**
     * Send the Express Checkout NVP request
     *
     * @param $form_id
     */
    public function sendECRequest( $form_id )
    {
		$current_url = Common::getCurrentPageURL();
		
        if ( !session_id() ) {
            @session_start();
        }
        $sandbox =get_option( 'bookly_pmt_payir_sandbox' )==1;
		$soapurl = get_option( 'bookly_pmt_payir_url' );
        $total = 0;
        //foreach ( $this->products as $index => $product ) {
            $total += ( $this->product->qty * $this->product->price ) + $this->tax;
       // }
        $_SESSION["price".$form_id] =  $total; 

        $api = $sandbox? 'test':get_option( 'bookly_pmt_payir_merchantid' );
        $amount = $total;
		$mobile = '';
        $description = 'پرداخت هزینه وقت ملاقات';
        $redirect = add_query_arg( array( 'bookly_action' => 'payir-ec-return', 'bookly_fid' => $form_id ), $current_url );

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $soapurl);
		curl_setopt($ch, CURLOPT_POSTFIELDS,"api=$api&amount=$amount&factorNumber=$form_id&redirect=$redirect&mobile=$mobile&description=$description");
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		$res = curl_exec($ch);
		curl_close($ch);
		
		$result = $res;
		$result = json_decode($result);
		if($result->status) {
			$go = "https://pay.ir/payment/gateway/$result->transId";
			header("Location: $go");
			exit;
		} else {
			header( 'Location: ' . wp_sanitize_redirect( add_query_arg( array( 'bookly_action' => 'payir-ec-error', 'bookly_fid' => $form_id, 'error_msg' => urlencode($this->description_Request($result->errorCode) ) ), $current_url ) ) );
            exit;
		}       
        
    }

    /**
     * Send the NVP Request to the PayPal
     *
     * @param       $method
     * @param array $data
     * @return array
     */
    public function sendNvpRequest( $method, array $data )
    {
        $sandbox =get_option( 'bookly_pmt_payir_sandbox' )==1;
        $soapurl = get_option( 'bookly_pmt_payir_url_verify' );
        $PayPalResponse = array("code"=>-1,"msg"=>$this->description_Verification(-5),"refid"=>"");
		
        if( isset($_POST['status']) && isset($_POST['transId']) ){
            $orderid=$refID=$_POST["transId"];
			
			$api = $sandbox? 'test':get_option( 'bookly_pmt_payir_merchantid' );
			$transId = $orderid;
			
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $soapurl);
			curl_setopt($ch, CURLOPT_POSTFIELDS, "api=$api&transId=$transId");
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
			$res = curl_exec($ch);
			curl_close($ch);
			
			$result = $res;
			$result = json_decode($result);
			
			if ( $result->status ) {
				$PayPalResponse= array("code"=>$result->status,"msg"=>$result->amount,"refid"=>$transId);
			} else {
				$PayPalResponse= array("code"=>$result->errorCode,"msg"=>$result->errorMessage,"refid"=>"0");
			}
           
        }
        return $PayPalResponse;
    }

    public static function renderECForm( $form_id )
    {
        $replacement = array(
            '%form_id%' => $form_id,
            '%gateway%' => Payment::TYPE_PAYIR,
            '%back%'    => Common::getTranslatedOption( 'bookly_l10n_button_back' ),
            '%next%'    => Common::getTranslatedOption( 'bookly_l10n_step_payment_button_next' ),
			'%align_class%' => get_option( 'bookly_app_align_buttons_left' ) ? 'bookly-left' : 'bookly-right',
        );
        $form = '<form method="post" class="bookly-%gateway%-form">
                <input type="hidden" name="bookly_fid" value="%form_id%"/>
                <input type="hidden" name="bookly_action" value="payir-ec-init"/>
                <button class="bookly-back-step bookly-js-back-step bookly-btn ladda-button" data-style="zoom-in" style="margin-right: 10px;" data-spinner-size="40"><span class="ladda-label">%back%</span></button>
                <button class="bookly-next-step bookly-js-next-step bookly-btn ladda-button"" data-style="zoom-in" data-spinner-size="40"><span class="ladda-label">%next%</span></button>
             </form>';
        echo strtr( $form, $replacement );
    }

    /**
     * Add the Product for payment
     *
     * @param \stdClass $product
     */
    public function setProduct( \stdClass $product )
    {
        $this->product = $product;
    }
	
	/**
     * @param float $tax
     */
    public function setTotalTax( $tax )
    {
        $this->tax = $tax;
    }

    function description_Request($code){
        switch(intval($code)){
            case -1: return "ارسال api الزامی می باشد";
            case -2: return "ارسال مبلغ الزامی می باشد";
            case -3: return "مبلغ باید به صورت عددی باشد";
            case -4: return "مبلغ نباید کمتر از 1000 باشد";
			case -5: return "ارسال آدرس بازگشتی الزامی می باشد";
			case -6: return "درگاه پرداختی با api ارسالی یافت نشد و یا غیر فعال می باشد";
			case -7: return "فروشنده غیر فعال می باشد";
			case -8: return "آدرس بازگشتی با آدرس درگاه پرداخت ثبت شده همخوانی ندارد";
			case -12: return "طول فیلد description بیشتر از 255 کاراکتر می باشد";
            default:
                return "تراکنش با خطا مواجه شد";
        }
    }
    function description_Verification($code){
        switch(intval($code)){
            case -1: return "ارسال api الزامی می باشد";
            case -2: return "ارسال transId الزامی می باشد";
            case -3: return "درگاه پرداختی با api ارسالی یافت نشد و یا غیر فعال می باشد";
            case -4: return "فروشنده غیر فعال می باشد";
            case -5: return "تراکنش با خطا مواجه شده است";
            default:
                return "عملیات پرداخت بطورکامل انجام نشد. (کد 0)";
        }
    }
    
}