<?php
/**
 * @package WordPress
 * @subpackage Traveler
 * @since 1.0
 *
 * Class STGatewayZpal
 *
 * ZPal (Zibal) Payment Gateway for Traveler Theme
 * Supports Zibal Payment Gateway API
 */
if (!class_exists('STGatewayZpal')) {
    class STGatewayZpal extends STAbstactPaymentGateway
    {
        static private $_ints;

        private $_gateway_id = 'st_zpal';

        function __construct()
        {
            add_filter('st_payment_gateway_st_zpal_name', array($this, 'get_name'));
        }

        static function instance()
        {
            if (!self::$_ints) {
                self::$_ints = new self();
            }
            return self::$_ints;
        }

        static function add_payment($payment)
        {
            $payment['st_zpal'] = self::instance();
            return $payment;
        }

        function html()
        {
            echo st()->load_template('gateways/zpal');
        }

        /**
         * Pre-checkout validation
         */
        function _pre_checkout_validate()
        {
            $merchant_id = st()->get_option('zpal_merchant_id', '');
            if (empty($merchant_id)) {
                STTemplate::set_message(__('مرچنت آیدی زیبال (ZPal) تنظیم نشده است.', 'traveler'), 'danger');
                return false;
            }
            return true;
        }

        /**
         * Process checkout - create payment request and redirect to ZPal
         */
        function do_checkout($order_id)
        {
            $merchant_id = st()->get_option('zpal_merchant_id', '');
            $sandbox = st()->get_option('zpal_enable_sandbox', 'off');
            $description = st()->get_option('zpal_description', __('پرداخت رزرو', 'traveler'));

            if (empty($merchant_id)) {
                return array(
                    'status' => false,
                    'message' => __('مرچنت آیدی زیبال (ZPal) تنظیم نشده است.', 'traveler')
                );
            }

            $total = get_post_meta($order_id, 'total_price', true);
            $total = floatval($total);

            if ($total <= 0) {
                return array(
                    'status' => false,
                    'message' => __('مبلغ پرداخت نامعتبر است.', 'traveler')
                );
            }

            // Convert to Toman (ZPal expects amount in Toman/RIAL)
            $currency = TravelHelper::get_current_currency('name');
            $amount = $this->convert_amount($total, $currency);

            $callback_url = $this->get_return_url($order_id);

            $api_url = 'https://gateway.zibal.ir/v1/request';

            $params = array(
                'merchant' => sanitize_text_field($merchant_id),
                'amount' => intval($amount),
                'callbackUrl' => esc_url_raw($callback_url),
                'description' => sanitize_text_field($description),
            );

            // Add mobile and email if available from order
            $order_email = get_post_meta($order_id, 'st_email', true);
            if (!empty($order_email)) {
                $params['orderId'] = $order_id;
            }

            $args = array(
                'body' => json_encode($params),
                'headers' => array(
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json'
                ),
                'timeout' => 30,
                'sslverify' => false
            );

            $response = wp_remote_post($api_url, $args);

            if (is_wp_error($response)) {
                return array(
                    'status' => false,
                    'message' => $response->get_error_message()
                );
            }

            $body = wp_remote_retrieve_body($response);
            $result = json_decode($body, true);

            if (empty($result) || !isset($result['trackId'])) {
                $message = isset($result['message']) ? sanitize_text_field($result['message']) : __('پاسخ نامعتبر از زیبال.', 'traveler');
                return array(
                    'status' => false,
                    'message' => $message
                );
            }

            if (isset($result['result']) && $result['result'] == 100) {
                $track_id = sanitize_text_field($result['trackId']);
                
                // Save trackId to order meta for verification
                update_post_meta($order_id, 'zpal_track_id', $track_id);
                update_post_meta($order_id, 'zpal_amount', $amount);

                $start_url = 'https://gateway.zibal.ir/start/' . $track_id;
                
                // Add sandbox parameter if in sandbox mode
                if ($sandbox == 'on') {
                    $start_url .= '/zibal';
                }

                return array(
                    'status' => true,
                    'redirect' => $start_url
                );
            } else {
                $message = isset($result['message']) ? sanitize_text_field($result['message']) : __('درخواست پرداخت ناموفق بود.', 'traveler');
                return array(
                    'status' => false,
                    'message' => $message
                );
            }
        }

        /**
         * Verify payment after callback from ZPal
         */
        function check_complete_purchase($order_id)
        {
            $track_id = isset($_GET['trackId']) ? sanitize_text_field($_GET['trackId']) : '';
            $success = isset($_GET['success']) ? sanitize_text_field($_GET['success']) : '';
            $status = isset($_GET['status']) ? sanitize_text_field($_GET['status']) : '';

            if (empty($track_id)) {
                return array(
                    'status' => false,
                    'message' => __('شناسه پیگیری (Track ID) یافت نشد.', 'traveler')
                );
            }

            // Check if payment was cancelled
            if ($success !== '1' || $status == '0') {
                return array(
                    'status' => false,
                    'message' => st()->get_option('zpal_failure_message', __('پرداخت لغو یا ناموفق بود.', 'traveler'))
                );
            }

            $saved_track_id = get_post_meta($order_id, 'zpal_track_id', true);
            if ($saved_track_id !== $track_id) {
                return array(
                    'status' => false,
                    'message' => __('عدم تطابق شناسه پیگیری.', 'traveler')
                );
            }

            $merchant_id = st()->get_option('zpal_merchant_id', '');
            $amount = get_post_meta($order_id, 'zpal_amount', true);

            $api_url = 'https://gateway.zibal.ir/v1/verify';

            $params = array(
                'merchant' => sanitize_text_field($merchant_id),
                'trackId' => $track_id
            );

            $args = array(
                'body' => json_encode($params),
                'headers' => array(
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json'
                ),
                'timeout' => 30,
                'sslverify' => false
            );

            $response = wp_remote_post($api_url, $args);

            if (is_wp_error($response)) {
                return array(
                    'status' => false,
                    'message' => $response->get_error_message()
                );
            }

            $body = wp_remote_retrieve_body($response);
            $result = json_decode($body, true);

            if (empty($result)) {
                return array(
                    'status' => false,
                    'message' => __('پاسخ تایید نامعتبر است.', 'traveler')
                );
            }

            // Successful verification: result = 100 (paid) or 201 (already verified)
            if (isset($result['result']) && ($result['result'] == 100 || $result['result'] == 201)) {
                $ref_number = isset($result['refNumber']) ? sanitize_text_field($result['refNumber']) : '';
                $card_number = isset($result['cardNumber']) ? sanitize_text_field($result['cardNumber']) : '';
                $paid_at = isset($result['paidAt']) ? sanitize_text_field($result['paidAt']) : '';
                
                update_post_meta($order_id, 'zpal_ref_number', $ref_number);
                update_post_meta($order_id, 'zpal_card_number', $card_number);
                update_post_meta($order_id, 'zpal_paid_at', $paid_at);
                update_post_meta($order_id, 'zpal_payment_status', 'completed');

                return array(
                    'status' => true
                );
            } else {
                $message = isset($result['message']) ? sanitize_text_field($result['message']) : __('تاییدیه پرداخت ناموفق بود.', 'traveler');
                return array(
                    'status' => false,
                    'message' => $message
                );
            }
        }

        /**
         * Convert amount to currency accepted by ZPal
         * ZPal accepts amount in Toman (IRT) or Rial
         */
        private function convert_amount($amount, $currency)
        {
            $currency = strtoupper($currency);
            
            // If currency is already IRT or TOMAN, return as-is
            if (in_array($currency, array('IRT', 'TOMAN'))) {
                return $amount;
            }
            
            // If currency is IRR (Rial), divide by 10
            if ($currency == 'IRR') {
                return $amount / 10;
            }
            
            // For other currencies, you may need to implement a conversion rate
            // Default: assume amount is in Toman
            return $amount;
        }

        /**
         * Package checkout support
         */
        function package_do_checkout($order_id)
        {
            return $this->do_checkout($order_id);
        }

        function package_completed_checkout($order_id)
        {
            return $this->check_complete_purchase($order_id);
        }

        function get_name()
        {
            $name = st()->get_option('zpal_name', '');
            return !empty($name) ? $name : __('زیبال (ZPal)', 'traveler');
        }

        function get_option_fields()
        {
            return array(
                array(
                    'id' => 'zpal_name',
                    'label' => __('نام درگاه', 'traveler'),
                    'desc' => __('نامی که در صفحه پرداخت نمایش داده می‌شود', 'traveler'),
                    'type' => 'text',
                    'section' => 'option_pmgateway',
                    'std' => __('زیبال (ZPal)', 'traveler'),
                    'condition' => 'pm_gway_' . $this->_gateway_id . '_enable:is(on)'
                ),
                array(
                    'id' => 'zpal_logo',
                    'label' => __('لوگو', 'traveler'),
                    'desc' => __('آپلود تصویر لوگوی درگاه', 'traveler'),
                    'type' => 'upload',
                    'section' => 'option_pmgateway',
                    'condition' => 'pm_gway_' . $this->_gateway_id . '_enable:is(on)'
                ),
                array(
                    'id' => 'zpal_merchant_id',
                    'label' => __('مرچنت آیدی', 'traveler'),
                    'desc' => __('مرچنت آیدی زیبال خود را وارد کنید', 'traveler'),
                    'type' => 'text',
                    'section' => 'option_pmgateway',
                    'condition' => 'pm_gway_' . $this->_gateway_id . '_enable:is(on)'
                ),
                array(
                    'id' => 'zpal_enable_sandbox',
                    'label' => __('حالت تست (سندباکس)', 'traveler'),
                    'desc' => __('فعال کردن حالت تست برای بررسی (از مرچنت تست زیبال استفاده می‌کند)', 'traveler'),
                    'type' => 'on-off',
                    'section' => 'option_pmgateway',
                    'std' => 'off',
                    'condition' => 'pm_gway_' . $this->_gateway_id . '_enable:is(on)'
                ),
                array(
                    'id' => 'zpal_description',
                    'label' => __('توضیحات پرداخت', 'traveler'),
                    'desc' => __('توضیحاتی که در صفحه پرداخت زیبال نمایش داده می‌شود', 'traveler'),
                    'type' => 'text',
                    'section' => 'option_pmgateway',
                    'std' => __('پرداخت رزرو', 'traveler'),
                    'condition' => 'pm_gway_' . $this->_gateway_id . '_enable:is(on)'
                ),
                array(
                    'id' => 'zpal_success_message',
                    'label' => __('پیام موفقیت', 'traveler'),
                    'desc' => __('پیامی که بعد از پرداخت موفق نمایش داده می‌شود', 'traveler'),
                    'type' => 'text',
                    'section' => 'option_pmgateway',
                    'std' => __('پرداخت شما با موفقیت انجام شد.', 'traveler'),
                    'condition' => 'pm_gway_' . $this->_gateway_id . '_enable:is(on)'
                ),
                array(
                    'id' => 'zpal_failure_message',
                    'label' => __('پیام خطا', 'traveler'),
                    'desc' => __('پیامی که بعد از پرداخت ناموفق یا لغو شده نمایش داده می‌شود', 'traveler'),
                    'type' => 'text',
                    'section' => 'option_pmgateway',
                    'std' => __('پرداخت لغو یا ناموفق بود. لطفاً دوباره تلاش کنید.', 'traveler'),
                    'condition' => 'pm_gway_' . $this->_gateway_id . '_enable:is(on)'
                ),
            );
        }

        function get_default_status()
        {
            return false;
        }

        function get_logo()
        {
            $logo = st()->get_option('zpal_logo', '');
            if (!empty($logo)) {
                return $logo;
            }
            return ST_TRAVELER_URI . '/img/gateway/nm-logo.png';
        }

        function is_check_complete_required()
        {
            return true;
        }

        function getGatewayId()
        {
            return $this->_gateway_id;
        }

        /**
         * Check payment method for all items or specific is enable
         */
        function is_available($item_id = false)
        {
            $result = false;
            if (st()->get_option('pm_gway_st_zpal_enable') == 'on') {
                $result = true;
            }
            if ($item_id) {
                $meta = get_post_meta($item_id, 'is_meta_payment_gateway_st_zpal', true);
                if ($meta == 'off') {
                    $result = false;
                } else {
                    $result = true;
                }
            }
            return $result;
        }
    }

    add_filter('st_payment_gateways', array('STGatewayZpal', 'add_payment'));
}

