<?php

namespace BWDK\API;

use Automattic\WooCommerce\Enums\OrderStatus;
use BWDK\Enums\BWDK_OrderStatus;
use BWDK\Integrations\Digify\Client;
use BWDK\Integrations\Digify\OrderPusher;
use BWDK\Woo\Order\OrderService;
use Exception;
use WC_Order;
use WP_Error;

class AjaxHandler
{
    public function register(): void
    {
        add_action('wp_ajax_bwdk_get_cart', [$this, 'create_order']);
        add_action('wp_ajax_nopriv_bwdk_get_cart', [$this, 'create_order']);

        add_action('wp_ajax_bwdk_refund_digipay', [$this, 'refund_digipay']);
        add_action('wp_ajax_nopriv_bwdk_refund_digipay', [$this, 'refund_digipay']);
    }

    public function create_order()
    {

        $data = [
            'terms' => 0,
            'terms-field' => 0,
            'createaccount' => 0,
            'payment_method' => 'پرداخت امن دیجیکالا',
            'shipping_method' => '',
            'ship_to_different_address' => false,
            'woocommerce_checkout_update_totals' => false,
            'billing_first_name' => '',
            'billing_country' => '',
            'billing_state' => '',
            'billing_city' => '',
            'billing_address_1' => '',
            'billing_address_2' => '',
            'billing_postcode' => '',
            'billing_phone' => '',
            'billing_email' => '',
            'order_comments' => '',
        ];
        try {

            $callback_url = $_POST["callback_url"] ?? "";

            if (!empty($_POST['payload'])) {
                $incoming = is_array($_POST['payload']) ? $_POST['payload'] : json_decode(stripslashes((string)$_POST['payload']), true);
                if (is_array($incoming)) {
                    $data = array_merge($data, $incoming);
                }
            }

            $service = new OrderService();
            $order = $service->createFromCurrentCart($data);
            $pusher = new Client();
            $assign_url = null;
            $uuid = null;

            if ($pusher) {
                $res = $pusher->createRemoteOrder($order);
                if ($res['ok']) {
                    $assign_url = $res['order_start_url'] ?? null;
                    $uuid = $res['order_uuid'] ?? null;

                    if (!empty($uuid)) {
                        $order->update_meta_data(\BWDK\Support\Constant::META_BWDK_UUID, $uuid);
                    }

                    if (!empty($assign_url)) {
                        $order->update_meta_data(\BWDK\Support\Constant::META_BWDK_ASSIGN_URL, $assign_url);
                    }

                    if (!empty($callback_url)) {
                        $order->update_meta_data(\BWDK\Support\Constant::META_BWDK_CB_URL, $callback_url);
                    }

                    $order->set_payment_method_title('پرداخت امن دیجیکالا');
                    $order_id = $order->save();

                    do_action('woocommerce_checkout_update_order_meta', $order_id, $data);
                    do_action('woocommerce_checkout_order_created', $order);
                } else {
                    error_log('[BWDK] Digify createRemoteOrder failed for order #' . $order->get_id() . ' code: ' . ($res['code'] ?? 0) . ' err: ' . ($res['error'] ?? 'unknown'));
                    wp_send_json_error(['message' => 'متاسفانه در حال حاضر امکان خرید با دیجیکالا در دسترس نمی‌باشد.'], 400);
                }
            }

            wp_send_json_success([
                'order_id' => $order->get_id(),
                'order_key' => $order->get_order_key(),
                'status' => $order->get_status(),
                'order_start_url' => $assign_url,
                'order_uuid' => $uuid,
            ]);


        } catch (Exception $e) {
            if (isset($order) && $order instanceof WC_Order) {
                wc_release_coupons_for_order($order);
                do_action('woocommerce_checkout_order_exception', $order);
            }
            wp_send_json_error(['message' => $e->getMessage()], 400);
            return new WP_Error('checkout-error', $e->getMessage());
        }
    }

    public function refund_digipay()
    {

        $order_uuid = $_POST["order_uuid"] ?? "";
        $order_id = $_POST["order_id"] ?? "";
        $order = wc_get_order($order_id);
        $raw_json =  $order->get_meta(\BWDK\Support\Constant::META_BWDK_JSON_CB);



        try {
            $pusher = new Client();
            if ($pusher) {
                $res = $pusher->refundOrder($order_uuid);





                if ($res) {
                    if ($res['status'] == BWDK_OrderStatus::REFUND_BY_MERCHANT) {

                        if (!empty($uuid)) {
                            $order->update_meta_data(\BWDK\Support\Constant::META_BWDK_REFUND_STATUS, $res);
                        }
                        $order->set_status("wc-refunded");
                        $raw_json["status"] = BWDK_OrderStatus::REFUND_BY_MERCHANT;
                        $raw_json["status_display"] = BWDK_OrderStatus::label( BWDK_OrderStatus::REFUND_BY_MERCHANT);
                        $raw = $raw_json ?? [];
                        $order->update_meta_data(\BWDK\Support\Constant::META_BWDK_JSON_CB, $raw);
                        $order->save();
                        wp_send_json_success([
                            'status' => true,
                            'message' => "ادمین گرامی، ازانجایی که مبلغ این سفارش با شما تسویه نشده است،  درخواست استرداد به دیجی پی ارسال شد و این مجموعه جهت تسویه حساب با کاربر طی چند روز کاری آتی اقدام خواهد کرد. لطفا مبلغی به کاربر پرداخت نفرمایید.",
                        ]);
                    }elseif(count($res['non_field_errors'])>0){
                        wp_send_json_success([
                            'status' => false,
                            'message' => $res['non_field_errors'][0],
                        ]);
                    }
                }
                error_log('[BWDK] Digify refund failed for order #' . $order->get_id() . ' message: ' . ($res['message'] ?? 0) . ' refund_reason: ' . ($res['refund_reason'] ?? 'unknown'));
                wp_send_json_error([
                    'status' => false,
                    'message' => 'ادمین گرامی ،دیجی پی مبلغ این سفارش را با شما تسویه کرده است. لطفا جهت استرداد مبلغ سفارش با کاربر، شخصا اقدام نمایید و پرداختی به کاربر انجام دهید'
                ]);
            }
        } catch (Exception $e) {
            wp_send_json_error([
                'status' => false,
                'message' => $e->getMessage()
            ]);
            return new WP_Error('refund-error', $e->getMessage());
        }

        return false;
    }
}
