<?php

namespace BWDK\Support;

use WC_Order;

trait OrderNoteHelper
{
    /**
     * Safely add a private order note once.
     *
     * @param WC_Order $order
     * @param string   $message
     * @param string|null $flag
     */
    protected function bwdk_add_note(WC_Order $order, string $message, ?string $flag = null): void
    {
        if (!$order instanceof WC_Order) {
            return;
        }

        $message = trim($message);
        if ($message === '') {
            return;
        }

        $meta_key = '_bwdk_note_' . ($flag ? sanitize_key($flag) : md5($message));

        if ((int) $order->get_meta($meta_key) === 1) {
            return;
        }

        $sanitized_message = wp_kses_post($message);
        $comment_id = $order->add_order_note($sanitized_message, false);
        if ($comment_id) {
            BwdkOrderNote::mark_note((int) $comment_id);
        }
        $order->update_meta_data($meta_key, 1);

        if (method_exists($order, 'save_meta_data')) {
            $order->save_meta_data();
        } else {
            $order->save();
        }
    }

    /**
     * ثبت نوت شروع فرایند خرید با BWDK
     *
     * @param WC_Order $order
     * @param array $context ['flow' => 'cart|single', 'source' => 'cart|checkout|single']
     */
    protected function bwdk_note_started(WC_Order $order, array $context = []): void
    {
        $flow = $context['flow'] ?? 'cart';
        $source = $context['source'] ?? 'checkout';

        $flow_label = ($flow === 'single') ? 'تک محصول' : 'سبد خرید';
        $source_label = ($source === 'single') ? 'صفحه محصول' : (($source === 'cart') ? 'سبد خرید' : 'صفحه تسویه');

        $message = sprintf(
            'شروع فرایند خرید با BWDK — جریان: %s — منبع: %s',
            $flow_label,
            $source_label
        );

        $this->bwdk_add_note($order, $message, 'started');
    }

    /**
     * ثبت نوت انصراف قبل از ورود/عضویت
     *
     * @param WC_Order $order
     */
    protected function bwdk_note_userCanceledBeforeLogin(WC_Order $order): void
    {
        $message = 'انصراف از خرید — مشتری قبل از ورود یا عضویت برگشت';
        $this->bwdk_add_note($order, $message, 'cancel_before_login');
    }

    /**
     * ثبت نوت انصراف بعد از ورود/عضویت
     *
     * @param WC_Order $order
     */
    protected function bwdk_note_userCanceledAfterLogin(WC_Order $order): void
    {
        $message = 'انصراف از خرید — مشتری بعد از ورود/عضویت انصراف داد';
        $this->bwdk_add_note($order, $message, 'cancel_after_login');
    }

    /**
     * ثبت نوت انصراف/عدم تکمیل در درگاه بانکی
     *
     * @param WC_Order $order
     * @param string $gateway_name
     */
    protected function bwdk_note_gatewayCanceled(WC_Order $order, string $gateway_name = ''): void
    {
        $gw = $gateway_name !== '' ? $gateway_name : 'درگاه پرداخت';
        $message = sprintf('انصراف از پرداخت در درگاه %s', $gw);
        $this->bwdk_add_note($order, $message, 'gateway_canceled');
    }

    /**
     * ثبت نوت پرداخت موفق با دیجی‌پی
     *
     * @param WC_Order $order
     * @param string $mode wallet|credit|installment
     * @param string $invoice_id
     * @param string $reference_code
     */
    protected function bwdk_note_digipayPaid(WC_Order $order, string $mode = '', string $invoice_id = '', string $reference_code = ''): void
    {
        $mode_labels = [
            'wallet' => 'کیف پول',
            'credit' => 'اعتباری',
            'installment' => 'اقساطی',
        ];

        $mode_label = $mode_labels[$mode] ?? 'دیجی‌پی';
        $message = sprintf('پرداخت با دیجی‌پی انجام شد (%s)', $mode_label);

        $parts = [];
        if ($invoice_id !== '') {
            $parts[] = 'Invoice ID: ' . $invoice_id;
        }
        if ($reference_code !== '') {
            $parts[] = 'Ref: ' . $reference_code;
        }

        if (!empty($parts)) {
            $message .= ' — ' . implode(' — ', $parts);
        }

        $this->bwdk_add_note($order, $message, 'digipay_paid');
    }

    /**
     * ثبت نوت پرداخت موفق نقدی/آنلاین (غیر دیجی‌پی)
     *
     * @param WC_Order $order
     * @param string $gateway_name
     * @param string $invoice_id
     * @param string $reference_code
     */
    protected function bwdk_note_cashPaid(WC_Order $order, string $gateway_name = '', string $invoice_id = '', string $reference_code = ''): void
    {
        $gw = $gateway_name !== '' ? $gateway_name : 'درگاه پرداخت';
        $message = sprintf('پرداخت به صورت نقدی با درگاه پرداخت %s انجام گردید', $gw);

        $parts = [];
        if ($invoice_id !== '') {
            $parts[] = 'Invoice ID: ' . $invoice_id;
        }
        if ($reference_code !== '') {
            $parts[] = 'Ref: ' . $reference_code;
        }

        if (!empty($parts)) {
            $message .= ' — ' . implode(' — ', $parts);
        }

        $this->bwdk_add_note($order, $message, 'cash_paid');
    }

    /**
     * ثبت نوت درخواست مرجوعی
     *
     * @param WC_Order $order
     * @param array $api_response
     */
    protected function bwdk_note_refundRequested(WC_Order $order, array $api_response = []): void
    {
        $message = 'درخواست استرداد سفارش ارسال شد';
        
        if (!empty($api_response)) {
            $debug_data = wp_json_encode($api_response, JSON_UNESCAPED_UNICODE);
            $message .= ' — ' . $debug_data;
        }

        $this->bwdk_add_note($order, $message, 'refund_requested');
    }

    /**
     * ثبت نوت وضعیت مرجوعی
     *
     * @param WC_Order $order
     * @param string $status_string
     * @param array $detail_array
     */
    protected function bwdk_note_refundStatus(WC_Order $order, string $status_string = '', array $detail_array = []): void
    {
        $status = $status_string !== '' ? $status_string : 'نامشخص';
        $message = sprintf('وضعیت استرداد: %s', $status);

        if (!empty($detail_array)) {
            $debug_data = wp_json_encode($detail_array, JSON_UNESCAPED_UNICODE);
            $message .= ' — ' . $debug_data;
        }

        $this->bwdk_add_note($order, $message, 'refund_status');
    }

    /**
     * ثبت نوت وضعیت از وب‌هوک/کالبک
     *
     * @param WC_Order $order
     * @param array $payload
     */
    protected function bwdk_note_webhookStatus(WC_Order $order, array $payload): void
    {
        if (empty($payload)) {
            return;
        }

        $status_display = (string) ($payload['status_display'] ?? '');
        $status = (int) ($payload['status'] ?? 0);
        
        if ($status_display === '' && $status > 0) {
            $status_display = 'وضعیت ' . $status;
        }

        if ($status_display === '') {
            $status_display = 'نامشخص';
        }

        $message = sprintf('وضعیت از کالبک/وب‌هوک: %s', $status_display);

        $parts = [];
        $reference_code = (string) ($payload['reference_code'] ?? '');
        if ($reference_code !== '') {
            $parts[] = 'Ref: ' . $reference_code;
        }

        $payment = $payload['payment'] ?? null;
        if (is_array($payment)) {
            $gateway_name = (string) ($payment['gateway_name'] ?? '');
            if ($gateway_name !== '') {
                $parts[] = 'Gateway: ' . $gateway_name;
            }
        }

        if (!empty($parts)) {
            $message .= ' — ' . implode(' — ', $parts);
        }

        $this->bwdk_add_note($order, $message, 'webhook_status');
    }

    /**
     * ثبت نوت دیباگ در نقاط حساس
     *
     * @param WC_Order $order
     * @param string $title
     * @param mixed $data
     */
    protected function bwdk_note_debug(WC_Order $order, string $title, $data = null): void
    {
        $message = '[DEBUG] ' . $title;

        if ($data !== null) {
            if (is_array($data) || is_object($data)) {
                $debug_data = wp_json_encode($data, JSON_UNESCAPED_UNICODE);
            } else {
                $debug_data = (string) $data;
            }
            $message .= ' — ' . $debug_data;
        }

        // Debug notes don't use flags to allow multiple entries
        $this->bwdk_add_note($order, $message, null);
    }
}

