<?php

namespace WeDevs\DokanPro\Modules\RMA;

use DateTimeZone;
use Exception;
use WC_Coupon;

/**
* Ajax handling class
*/
class Ajax {

    /**
     * Load automatically when class initiate
     *
     * @since 1.0.0
     */
    public function __construct() {
        add_action( 'wp_ajax_dokan-update-return-request', [ $this, 'update_status' ], 10 );
        add_action( 'wp_ajax_dokan-get-refund-order-data', [ $this, 'get_order_data' ], 10 );
        add_action( 'wp_ajax_dokan-get-coupon-order-data', [ $this, 'get_order_data' ], 10 );
        add_action( 'wp_ajax_dokan-send-refund-request', [ $this, 'send_refund_request' ], 10 );
        add_action( 'wp_ajax_dokan-send-coupon-request', [ $this, 'send_coupon_request' ], 10 );
    }

    /**
     * Update request status
     *
     * @since 1.0.0
     *
     * @return void
     */
    public function update_status() {
        if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'dokan_rma_nonce' ) ) {
            wp_send_json_error( __( 'Invalid nonce', 'dokan' ) );
        }

        if ( ! isset( $_POST['formData'] ) ) {
            wp_send_json_error( __( 'Something went wrong!', 'dokan' ) );
        }

        parse_str( $_POST['formData'], $data ); //phpcs:ignore.

        $request = new WarrantyRequest();
        $updated = $request->update( wc_clean( $data ) );

        if ( is_wp_error( $updated ) ) {
            wp_send_json_error( $updated->get_error_message() );
        }

        wp_send_json_success( [ 'message' => __( 'Status changed successfully', 'dokan' ) ] );
    }

    /**
     * Get order data for refund
     *
     * @since 1.0.0
     *
     * @return void
     */
    public function get_order_data() {
        if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'dokan_rma_nonce' ) ) {
            wp_send_json_error( __( 'Invalid nonce', 'dokan' ) );
        }

        if ( empty( $_POST['request_id'] ) ) {
            wp_send_json_error( __( 'Order id not found', 'dokan' ) );
        }

        $warranty_request = new WarrantyRequest();
        $request = $warranty_request->get( absint( $_POST['request_id'] ) );

        if ( ! $request ) {
            wp_send_json_error( __( 'Invalid Request', 'dokan' ) );
        }

        $wc_tax_enabled = ! empty( array_sum( wp_list_pluck( $request['items'], 'tax' ) ) );
        $price_placeholder = '0' . wc_get_price_decimal_separator() . '00'; // 0.00 or 0,00

        if ( ! empty( $request['items'] ) ) {
            ob_start();
            ?>
                <table class="dokan-table dokan-refund-item-list-table">
                    <thead>
                        <tr>
                            <th style="width:30%"><?php esc_html_e( 'Product', 'dokan' ); ?></th>
                            <th style="width:10%"><?php esc_html_e( 'Qty', 'dokan' ); ?></th>

                            <?php if ( $wc_tax_enabled ) : ?>
                                <th style="width:10%"><?php esc_html_e( 'Tax', 'dokan' ); ?></th>
                            <?php endif; ?>

                            <th style="width:15%"><?php esc_html_e( 'Total', 'dokan' ); ?></th>

                            <?php if ( $wc_tax_enabled ) : ?>
                                <th style="width:15%"><?php esc_html_e( 'Tax Refund', 'dokan' ); ?></th>
                            <?php endif; ?>

                            <th style="width:20%"><?php esc_html_e( 'Total Refund', 'dokan' ); ?></th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ( $request['items'] as $key => $item ) : ?>
                            <tr>
                                <td><a href="<?php echo esc_url( $item['url'] ); ?>"><?php echo esc_html( $item['title'] ); ?></a></td>
                                <td><?php echo esc_html( $item['quantity'] ); ?></td>

                                <?php if ( $wc_tax_enabled ) : ?>
                                    <td><?php echo wc_price( $item['tax'] * $item['quantity'] ); ?></td>
                                <?php endif; ?>

                                <td><?php echo wc_price( $item['price'] * $item['quantity'] ); ?></td>

                                <?php if ( $wc_tax_enabled ) : ?>
                                    <td>
                                        <div style="position: relative;">
                                            <input type="text" data-max="<?php echo esc_attr( $item['tax'] * $item['quantity'] ); ?>" name="refund_tax[]" class="wc_input_price refund_item_amount dokan-w12 dokan-text-right" placeholder="<?php echo esc_attr( $price_placeholder ); ?>">
                                        </div>
                                    </td>
                                <?php endif; ?>
                                <td>
                                    <input type="hidden" name="item_id[]" value="<?php echo $item['item_id']; ?>">
                                    <div style="position: relative;">
                                        <input type="text" data-max="<?php echo esc_attr( $item['price'] * $item['quantity'] ); ?>" name="refund_amount[]" class="wc_input_price refund_item_amount dokan-w12 dokan-text-right" placeholder="<?php echo esc_attr( $price_placeholder ); ?>">
                                    </div>
                                    <input type="hidden" name="line_item_qtys[]" value="<?php echo esc_attr( $item['quantity'] ); ?>">
                                </td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
                <input type="hidden" name="refund_total_amount" value="0">
                <input type="hidden" name="request_id" value="<?php echo $request['id']; ?>">
                <input type="hidden" name="refund_order_id" value="<?php echo esc_attr( $request['order_id'] ); ?>">
                <input type="hidden" name="refund_vendor_id" value="<?php echo esc_attr( $request['vendor']['store_id'] ); ?>">
                <div class="dokan-popup-total-refund-amount dokan-right"><?php esc_html_e( 'Total Amount : ', 'dokan' ); ?> <strong><span><?php echo get_woocommerce_currency_symbol(); ?></span><span class="amount"><?php echo esc_html( $price_placeholder ); ?></span></strong></div>
                <div class="dokan-clearfix"></div>
            <?php
            $data = ob_get_clean();
            wp_send_json_success( $data );
        }

        wp_send_json_error( __( 'No Item found', 'dokan' ) );
    }

    /**
     * Send refund request
     *
     * @since 1.0.0
     *
     * @return void
     */
    public function send_refund_request() {
        list( $data, $order, $request_data, $line_item_qty_array, $line_item_total_array, $line_item_tax_total_array ) = $this->validate_request();

        if ( dokan_pro()->refund->has_pending_request( absint( $data['refund_order_id'] ) ) ) {
            wp_send_json_error( __( 'You have already a processing refund request for this order.', 'dokan' ) );
        }

        $postdata = [
            'order_id'               => $data['refund_order_id'],
            'seller_id'              => $data['refund_vendor_id'],
            'refund_amount'          => $data['refund_total_amount'],
            // translators: 1:RMA request id.
            'refund_reason'          => sprintf( __( 'Warranty Request from Customer for RMA request #%1$s', 'dokan' ), $data['request_id'] ),
            'line_item_qtys'         => json_encode( $line_item_qty_array ), //phpcs:ignore.
            'line_item_totals'       => json_encode( $line_item_total_array ), //phpcs:ignore.
            'line_item_tax_totals'   => json_encode( $line_item_tax_total_array ), //phpcs:ignore.
            'api_refund'             => '1', // if the payment gateway supports then the Refund will be via API.
            'restock_refunded_items' => null,
            'status'                 => 0,
        ];

        try {
            $refund = \WeDevs\DokanPro\Refund\Ajax::create_refund_request( $postdata );
            do_action( 'dokan_rma_requested', absint( $data['refund_order_id'] ), $postdata );
            do_action( 'dokan_rma_requested_amount', $postdata['order_id'], $postdata['refund_amount'], $postdata );
            wp_send_json_success( __( 'Refund request successfully sent for admin approval.', 'dokan' ) );
        } catch ( Exception $e ) {
            \WeDevs\DokanPro\Refund\Ajax::wc_ajax_request_error_handler( $e );
        }
    }

    /**
     * Send coupon to customer
     *
     * @since 1.0.0
     *
     * @return void
     */
    public function send_coupon_request() {
        list( $data, $order, $request_data, $line_item_qty_array, $line_item_total_array, $line_item_tax_total_array ) = $this->validate_request();

        try {
            // Create coupon
            Utils::create_coupon( $order, $data );

            wp_send_json_success( __( 'Coupon has been created successfully and send to customer email', 'dokan' ) );
        } catch ( Exception $exception ) {
            wp_send_json_error( __( 'Something is wrong, Please try again', 'dokan' ) );
        }
    }

    /**
     * Validate form submit request for rma refund or coupon form
     *
     * @since 3.4.0
     *
     * @return array
     */
    protected function validate_request() {
        if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'dokan_rma_nonce' ) ) {
            wp_send_json_error( __( 'Invalid nonce', 'dokan' ) );
        }

        if ( ! isset( $_POST['formData'] ) ) {
            wp_send_json_error( __( 'Something went wrong!', 'dokan' ) );
        }

        parse_str( $_POST['formData'], $data ); //phpcs:ignore.

        if ( empty( $data['refund_order_id'] ) ) {
            wp_send_json_error( __( 'No order found', 'dokan' ) );
        }

        $order = wc_get_order( absint( $data['refund_order_id'] ) );

        if ( ! $order ) {
            wp_send_json_error( __( 'No order found', 'dokan' ) );
        }

        if ( empty( $data['refund_vendor_id'] ) ) {
            wp_send_json_error( __( 'No vendor found', 'dokan' ) );
        }

        if ( absint( $data['refund_vendor_id'] ) !== dokan_get_current_user_id() ) {
            wp_send_json_error( __( 'Error! This is not your request.', 'dokan' ) );
        }

        if ( wc_format_decimal( $data['refund_total_amount'] ) <= 0 ) {
            wp_send_json_error( __( 'Refund amount must be greater than 0', 'dokan' ) );
        }

        $warranty_request          = new WarrantyRequest();
        $request_data              = $warranty_request->get( absint( $data['request_id'] ) );
        $line_item_qty_array       = array();
        $line_item_total_array     = array();
        $line_item_tax_total_array = array();

        foreach ( $data['item_id'] as $key => $single_item_id ) {
            $single_item_id   = absint( $single_item_id );
            $line_item        = $request_data['items'][ $key ];
            $requested_qty    = $data['line_item_qtys'][ $key ];
            $requested_amount = ! empty( $data['refund_amount'][ $key ] ) ? wc_format_decimal( $data['refund_amount'][ $key ] ) : 0;
            $requested_tax    = ! empty( $data['refund_tax'][ $key ] ) ? wc_format_decimal( $data['refund_tax'][ $key ] ) : 0;
            $allowed_amount   = wc_format_decimal( (float) $line_item['price'] * absint( $line_item['quantity'] ), '' );
            $allowed_tax      = wc_format_decimal( (float) $line_item['tax'] * absint( $line_item['quantity'] ), '' );

            if ( $requested_amount > $allowed_amount ) {
                // translators: Product name.
                wp_send_json_error( sprintf( __( 'Invalid subtotal refund amount for product %s', 'dokan' ), $line_item['title'] ) );
            }

            if ( $requested_tax > $allowed_tax ) {
                // translators: Product name.
                wp_send_json_error( sprintf( __( 'Invalid tax refund amount for product %s', 'dokan' ), $line_item['title'] ) );
            }

            $line_item_qty_array[ $single_item_id ]       = absint( $requested_qty );
            $line_item_total_array[ $single_item_id ]     = $requested_amount;
            $line_item_tax_total_array[ $single_item_id ] = array( 1 => $requested_tax ); // need to revisit for multiple tax class support

            unset( $line_item, $requested_qty, $requested_amount, $requested_tax );
        }

        return array( $data, $order, $request_data, $line_item_qty_array, $line_item_total_array, $line_item_tax_total_array );
    }
}
