<?php
namespace PayCal\Modules\Bit;

defined('ABSPATH') || exit;

class BitAdminActions {
  public static function init(): void {
    add_action('add_meta_boxes', [__CLASS__, 'add_box']);
    add_action('admin_post_paycal_bit_mark_paid', [__CLASS__, 'handle_mark_paid']);
  }

  public static function add_box(): void {
    $screens = ['shop_order'];
    if (function_exists('wc_get_page_screen_id')) {
      $hpos_screen = wc_get_page_screen_id('shop-order');
      if ($hpos_screen && !in_array($hpos_screen, $screens, true)) {
        $screens[] = $hpos_screen;
      }
    }

    add_meta_box(
      'paycal_bit_box',
      'PayCal — Bit',
      [__CLASS__, 'render_box'],
      $screens,
      'side',
      'high'
    );
  }

  public static function render_box($post): void {
    $order = is_object($post) && class_exists('\WC_Order') && $post instanceof \WC_Order ? $post : null;
    if (!$order) {
      $order_id = is_object($post) && isset($post->ID) ? absint($post->ID) : 0;
      $order = $order_id ? wc_get_order($order_id) : null;
    }
    if (!$order) return;

    $status = $order->get_status();
    $phone = BitSettings::phone();

    echo '<p><strong>סטטוס:</strong> ' . esc_html($status) . '</p>';

    if ($status !== 'paycal-bit-pending') {
      echo '<p class="description">הכפתורים מופיעים רק להזמנות שממתינות לתשלום בביט.</p>';
      return;
    }

    // Payment page link
    $pay_url = method_exists($order, 'get_checkout_payment_url') ? $order->get_checkout_payment_url() : '';

    if ($phone) {
      echo '<p><strong>מספר ביט:</strong> <span id="paycalAdminBitPhone">' . esc_html($phone) . '</span></p>';
      echo '<p><button type="button" class="button" data-copy="#paycalAdminBitPhone">העתק מספר ביט</button></p>';
    }

    if ($pay_url) {
      echo '<p><a class="button" target="_blank" rel="noopener" href="'.esc_url($pay_url).'">פתח מסך תשלום</a></p>';
    }

    $url = wp_nonce_url(
      admin_url('admin-post.php?action=paycal_bit_mark_paid&order_id=' . $order->get_id()),
      'paycal_bit_mark_paid_' . $order->get_id()
    );

    echo '<hr style="margin:12px 0" />';
    echo '<p><a class="button button-primary" href="'.esc_url($url).'">סמן כשולם בביט</a></p>';
    echo '<p class="description">יעביר את ההזמנה ל-Processing ויתעד הערה להזמנה.</p>';
  }

  public static function handle_mark_paid(): void {
    $order_id = isset($_GET['order_id']) ? absint(wp_unslash($_GET['order_id'])) : 0;
    if (!$order_id) wp_die(esc_html__('Missing order', 'klamra-paycal-for-aspaclaria'));

    if (!current_user_can('manage_woocommerce')) wp_die(esc_html__('No permission', 'klamra-paycal-for-aspaclaria'));
    $nonce = isset($_GET['_wpnonce']) ? sanitize_text_field(wp_unslash($_GET['_wpnonce'])) : '';
    if (!wp_verify_nonce($nonce, 'paycal_bit_mark_paid_' . $order_id)) wp_die(esc_html__('Bad nonce', 'klamra-paycal-for-aspaclaria'));

    $order = wc_get_order($order_id);
    if (!$order) wp_die(esc_html__('Order not found', 'klamra-paycal-for-aspaclaria'));

    if ($order->get_status() !== 'paycal-bit-pending') {
      wp_safe_redirect(wp_get_referer() ?: self::orders_admin_url());
      exit;
    }

    $order->add_order_note('תשלום בביט אושר ידנית על ידי אדמין (PayCal).');
    $order->update_status('processing', 'עודכן אוטומטית לאחר אישור תשלום בביט.', true);

    wp_safe_redirect(wp_get_referer() ?: self::order_edit_url($order));
    exit;
  }

  private static function order_edit_url($order): string {
    return is_object($order) && method_exists($order, 'get_edit_order_url')
      ? $order->get_edit_order_url()
      : admin_url('post.php?post=' . absint($order->get_id()) . '&action=edit');
  }

  private static function orders_admin_url(): string {
    return class_exists('\Automattic\WooCommerce\Utilities\OrderUtil') && \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled()
      ? admin_url('admin.php?page=wc-orders')
      : admin_url('edit.php?post_type=shop_order');
  }
}
