<?php

if (!defined('ABSPATH')) {
    exit;
}
abstract class WC_Abstract_Legacy_Order extends WC_Data
{
    public function add_coupon($code = array(), $discount = 0, $discount_tax = 0)
    {
        wc_deprecated_function('WC_Order::add_coupon', '3.0', 'a new WC_Order_Item_Coupon object and add to order with WC_Order::add_item()');
        $item = new WC_Order_Item_Coupon();
        $item->set_props(array('code' => $code, 'discount' => $discount, 'discount_tax' => $discount_tax, 'order_id' => $this->get_id()));
        $item->save();
        $this->add_item($item);
        wc_do_deprecated_action('woocommerce_order_add_coupon', array($this->get_id(), $item->get_id(), $code, $discount, $discount_tax), '3.0', 'woocommerce_new_order_item action instead.');
        return $item->get_id();
    }
    public function add_tax($tax_rate_id, $tax_amount = 0, $shipping_tax_amount = 0)
    {
        wc_deprecated_function('WC_Order::add_tax', '3.0', 'a new WC_Order_Item_Tax object and add to order with WC_Order::add_item()');
        $item = new WC_Order_Item_Tax();
        $item->set_props(array('rate_id' => $tax_rate_id, 'tax_total' => $tax_amount, 'shipping_tax_total' => $shipping_tax_amount));
        $item->set_rate($tax_rate_id);
        $item->set_order_id($this->get_id());
        $item->save();
        $this->add_item($item);
        wc_do_deprecated_action('woocommerce_order_add_tax', array($this->get_id(), $item->get_id(), $tax_rate_id, $tax_amount, $shipping_tax_amount), '3.0', 'woocommerce_new_order_item action instead.');
        return $item->get_id();
    }
    public function add_shipping($shipping_rate)
    {
        wc_deprecated_function('WC_Order::add_shipping', '3.0', 'a new WC_Order_Item_Shipping object and add to order with WC_Order::add_item()');
        $item = new WC_Order_Item_Shipping();
        $item->set_props(array('method_title' => $shipping_rate->label, 'method_id' => $shipping_rate->id, 'total' => wc_format_decimal($shipping_rate->cost), 'taxes' => $shipping_rate->taxes, 'order_id' => $this->get_id()));
        foreach ($shipping_rate->get_meta_data() as $key => $value) {
            $item->add_meta_data($key, $value, true);
        }
        $item->save();
        $this->add_item($item);
        wc_do_deprecated_action('woocommerce_order_add_shipping', array($this->get_id(), $item->get_id(), $shipping_rate), '3.0', 'woocommerce_new_order_item action instead.');
        return $item->get_id();
    }
    public function add_fee($fee)
    {
        wc_deprecated_function('WC_Order::add_fee', '3.0', 'a new WC_Order_Item_Fee object and add to order with WC_Order::add_item()');
        $item = new WC_Order_Item_Fee();
        $item->set_props(array('name' => $fee->name, 'tax_class' => $fee->taxable ? $fee->tax_class : 0, 'total' => $fee->amount, 'total_tax' => $fee->tax, 'taxes' => array('total' => $fee->tax_data), 'order_id' => $this->get_id()));
        $item->save();
        $this->add_item($item);
        wc_do_deprecated_action('woocommerce_order_add_fee', array($this->get_id(), $item->get_id(), $fee), '3.0', 'woocommerce_new_order_item action instead.');
        return $item->get_id();
    }
    public function update_product($item, $product, $args)
    {
        wc_deprecated_function('WC_Order::update_product', '3.0', 'an interaction with the WC_Order_Item_Product class');
        if (is_numeric($item)) {
            $item = $this->get_item($item);
        }
        if (!is_object($item) || !$item->is_type('line_item')) {
            return false;
        }
        if (!$this->get_id()) {
            $this->save();
        }
        if (isset($args['totals'])) {
            foreach ($args['totals'] as $key => $value) {
                if ('tax' === $key) {
                    $args['total_tax'] = $value;
                } elseif ('tax_data' === $key) {
                    $args['taxes'] = $value;
                } else {
                    $args[$key] = $value;
                }
            }
        }
        if (isset($args['qty'])) {
            if ($product->backorders_require_notification() && $product->is_on_backorder($args['qty'])) {
                $item->add_meta_data(apply_filters('woocommerce_backordered_item_meta_name', __('Backordered', 'woocommerce'), $item), $args['qty'] - max(0, $product->get_stock_quantity()), true);
            }
            $args['subtotal'] = $args['subtotal'] ? $args['subtotal'] : wc_get_price_excluding_tax($product, array('qty' => $args['qty']));
            $args['total'] = $args['total'] ? $args['total'] : wc_get_price_excluding_tax($product, array('qty' => $args['qty']));
        }
        $item->set_order_id($this->get_id());
        $item->set_props($args);
        $item->save();
        do_action('woocommerce_order_edit_product', $this->get_id(), $item->get_id(), $args, $product);
        return $item->get_id();
    }
    public function update_coupon($item, $args)
    {
        wc_deprecated_function('WC_Order::update_coupon', '3.0', 'an interaction with the WC_Order_Item_Coupon class');
        if (is_numeric($item)) {
            $item = $this->get_item($item);
        }
        if (!is_object($item) || !$item->is_type('coupon')) {
            return false;
        }
        if (!$this->get_id()) {
            $this->save();
        }
        if (isset($args['discount_amount'])) {
            $args['discount'] = $args['discount_amount'];
        }
        if (isset($args['discount_amount_tax'])) {
            $args['discount_tax'] = $args['discount_amount_tax'];
        }
        $item->set_order_id($this->get_id());
        $item->set_props($args);
        $item->save();
        do_action('woocommerce_order_update_coupon', $this->get_id(), $item->get_id(), $args);
        return $item->get_id();
    }
    public function update_shipping($item, $args)
    {
        wc_deprecated_function('WC_Order::update_shipping', '3.0', 'an interaction with the WC_Order_Item_Shipping class');
        if (is_numeric($item)) {
            $item = $this->get_item($item);
        }
        if (!is_object($item) || !$item->is_type('shipping')) {
            return false;
        }
        if (!$this->get_id()) {
            $this->save();
        }
        if (isset($args['cost'])) {
            $args['total'] = $args['cost'];
        }
        $item->set_order_id($this->get_id());
        $item->set_props($args);
        $item->save();
        $this->calculate_shipping();
        do_action('woocommerce_order_update_shipping', $this->get_id(), $item->get_id(), $args);
        return $item->get_id();
    }
    public function update_fee($item, $args)
    {
        wc_deprecated_function('WC_Order::update_fee', '3.0', 'an interaction with the WC_Order_Item_Fee class');
        if (is_numeric($item)) {
            $item = $this->get_item($item);
        }
        if (!is_object($item) || !$item->is_type('fee')) {
            return false;
        }
        if (!$this->get_id()) {
            $this->save();
        }
        $item->set_order_id($this->get_id());
        $item->set_props($args);
        $item->save();
        do_action('woocommerce_order_update_fee', $this->get_id(), $item->get_id(), $args);
        return $item->get_id();
    }
    public function update_tax($item, $args)
    {
        wc_deprecated_function('WC_Order::update_tax', '3.0', 'an interaction with the WC_Order_Item_Tax class');
        if (is_numeric($item)) {
            $item = $this->get_item($item);
        }
        if (!is_object($item) || !$item->is_type('tax')) {
            return false;
        }
        if (!$this->get_id()) {
            $this->save();
        }
        $item->set_order_id($this->get_id());
        $item->set_props($args);
        $item->save();
        do_action('woocommerce_order_update_tax', $this->get_id(), $item->get_id(), $args);
        return $item->get_id();
    }
    public function get_product_from_item($item)
    {
        wc_deprecated_function('WC_Abstract_Legacy_Order::get_product_from_item', '4.4.0', '$item->get_product()');
        if (is_callable(array($item, 'get_product'))) {
            $product = $item->get_product();
        } else {
            $product = false;
        }
        return apply_filters('woocommerce_get_product_from_item', $product, $item, $this);
    }
    public function set_address($address, $type = 'billing')
    {
        foreach ($address as $key => $value) {
            update_post_meta($this->get_id(), "_{$type}_" . $key, $value);
            if (is_callable(array($this, "set_{$type}_{$key}"))) {
                $this->{"set_{$type}_{$key}"}($value);
            }
        }
    }
    public function legacy_set_total($amount, $total_type = 'total')
    {
        if (!in_array($total_type, array('shipping', 'tax', 'shipping_tax', 'total', 'cart_discount', 'cart_discount_tax'))) {
            return false;
        }
        switch ($total_type) {
            case 'total':
                $amount = wc_format_decimal($amount, wc_get_price_decimals());
                $this->set_total($amount);
                update_post_meta($this->get_id(), '_order_total', $amount);
                break;
            case 'cart_discount':
                $amount = wc_format_decimal($amount);
                $this->set_discount_total($amount);
                update_post_meta($this->get_id(), '_cart_discount', $amount);
                break;
            case 'cart_discount_tax':
                $amount = wc_format_decimal($amount);
                $this->set_discount_tax($amount);
                update_post_meta($this->get_id(), '_cart_discount_tax', $amount);
                break;
            case 'shipping':
                $amount = wc_format_decimal($amount);
                $this->set_shipping_total($amount);
                update_post_meta($this->get_id(), '_order_shipping', $amount);
                break;
            case 'shipping_tax':
                $amount = wc_format_decimal($amount);
                $this->set_shipping_tax($amount);
                update_post_meta($this->get_id(), '_order_shipping_tax', $amount);
                break;
            case 'tax':
                $amount = wc_format_decimal($amount);
                $this->set_cart_tax($amount);
                update_post_meta($this->get_id(), '_order_tax', $amount);
                break;
        }
        return true;
    }
    public function __isset($key)
    {
        $legacy_props = array('completed_date', 'id', 'order_type', 'post', 'status', 'post_status', 'customer_note', 'customer_message', 'user_id', 'customer_user', 'prices_include_tax', 'tax_display_cart', 'display_totals_ex_tax', 'display_cart_ex_tax', 'order_date', 'modified_date', 'cart_discount', 'cart_discount_tax', 'order_shipping', 'order_shipping_tax', 'order_total', 'order_tax', 'billing_first_name', 'billing_last_name', 'billing_company', 'billing_address_1', 'billing_address_2', 'billing_city', 'billing_state', 'billing_postcode', 'billing_country', 'billing_phone', 'billing_email', 'shipping_first_name', 'shipping_last_name', 'shipping_company', 'shipping_address_1', 'shipping_address_2', 'shipping_city', 'shipping_state', 'shipping_postcode', 'shipping_country', 'customer_ip_address', 'customer_user_agent', 'payment_method_title', 'payment_method', 'order_currency');
        return $this->get_id() ? in_array($key, $legacy_props) || metadata_exists('post', $this->get_id(), '_' . $key) : false;
    }
    public function __get($key)
    {
        wc_doing_it_wrong($key, 'Order properties should not be accessed directly.', '3.0');
        if ('completed_date' === $key) {
            return $this->get_date_completed() ? gmdate('Y-m-d H:i:s', $this->get_date_completed()->getOffsetTimestamp()) : '';
        } elseif ('paid_date' === $key) {
            return $this->get_date_paid() ? gmdate('Y-m-d H:i:s', $this->get_date_paid()->getOffsetTimestamp()) : '';
        } elseif ('modified_date' === $key) {
            return $this->get_date_modified() ? gmdate('Y-m-d H:i:s', $this->get_date_modified()->getOffsetTimestamp()) : '';
        } elseif ('order_date' === $key) {
            return $this->get_date_created() ? gmdate('Y-m-d H:i:s', $this->get_date_created()->getOffsetTimestamp()) : '';
        } elseif ('id' === $key) {
            return $this->get_id();
        } elseif ('post' === $key) {
            return get_post($this->get_id());
        } elseif ('status' === $key) {
            return $this->get_status();
        } elseif ('post_status' === $key) {
            return get_post_status($this->get_id());
        } elseif ('customer_message' === $key || 'customer_note' === $key) {
            return $this->get_customer_note();
        } elseif (in_array($key, array('user_id', 'customer_user'))) {
            return $this->get_customer_id();
        } elseif ('tax_display_cart' === $key) {
            return get_option('woocommerce_tax_display_cart');
        } elseif ('display_totals_ex_tax' === $key) {
            return 'excl' === get_option('woocommerce_tax_display_cart');
        } elseif ('display_cart_ex_tax' === $key) {
            return 'excl' === get_option('woocommerce_tax_display_cart');
        } elseif ('cart_discount' === $key) {
            return $this->get_total_discount();
        } elseif ('cart_discount_tax' === $key) {
            return $this->get_discount_tax();
        } elseif ('order_tax' === $key) {
            return $this->get_cart_tax();
        } elseif ('order_shipping_tax' === $key) {
            return $this->get_shipping_tax();
        } elseif ('order_shipping' === $key) {
            return $this->get_shipping_total();
        } elseif ('order_total' === $key) {
            return $this->get_total();
        } elseif ('order_type' === $key) {
            return $this->get_type();
        } elseif ('order_currency' === $key) {
            return $this->get_currency();
        } elseif ('order_version' === $key) {
            return $this->get_version();
        } elseif (is_callable(array($this, "get_{$key}"))) {
            return $this->{"get_{$key}"}();
        } else {
            return get_post_meta($this->get_id(), '_' . $key, true);
        }
    }
    public function has_meta($order_item_id)
    {
        global $wpdb;
        wc_deprecated_function('WC_Order::has_meta( $order_item_id )', '3.0', 'WC_Order_item::get_meta_data');
        return $wpdb->get_results($wpdb->prepare("SELECT meta_key, meta_value, meta_id, order_item_id\n\t\t\tFROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE order_item_id = %d\n\t\t\tORDER BY meta_id", absint($order_item_id)), ARRAY_A);
    }
    public function display_item_meta($item)
    {
        wc_deprecated_function('WC_Order::display_item_meta', '3.0', 'wc_display_item_meta');
        $product = $item->get_product();
        $item_meta = new WC_Order_Item_Meta($item, $product);
        $item_meta->display();
    }
    public function display_item_downloads($item)
    {
        wc_deprecated_function('WC_Order::display_item_downloads', '3.0', 'wc_display_item_downloads');
        $product = $item->get_product();
        if ($product && $product->exists() && $product->is_downloadable() && $this->is_download_permitted()) {
            $download_files = $this->get_item_downloads($item);
            $i = 0;
            $links = array();
            foreach ($download_files as $download_id => $file) {
                $i++;
                $prefix = count($download_files) > 1 ? sprintf(__('Download %d', 'woocommerce'), $i) : __('Download', 'woocommerce');
                $links[] = '<small class="download-url">' . esc_html($prefix) . ': <a href="' . esc_url($file['download_url']) . '" target="_blank">' . esc_html($file['name']) . '</a></small>' . "\n";
            }
            echo '<br/>' . implode('<br/>', $links);
        }
    }
    public function get_download_url($product_id, $download_id)
    {
        wc_deprecated_function('WC_Order::get_download_url', '3.0', 'WC_Order_Item_Product::get_item_download_url');
        return add_query_arg(array('download_file' => $product_id, 'order' => $this->get_order_key(), 'email' => urlencode($this->get_billing_email()), 'key' => $download_id), trailingslashit(home_url()));
    }
    public function get_item_downloads($item)
    {
        wc_deprecated_function('WC_Order::get_item_downloads', '3.0', 'WC_Order_Item_Product::get_item_downloads');
        if (!$item instanceof WC_Order_Item) {
            if (!empty($item['variation_id'])) {
                $product_id = $item['variation_id'];
            } elseif (!empty($item['product_id'])) {
                $product_id = $item['product_id'];
            } else {
                return array();
            }
            $item = new WC_Order_Item_Product();
            $item->set_product(wc_get_product($product_id));
            $item->set_order_id($this->get_id());
        }
        return $item->get_item_downloads();
    }
    public function get_total_shipping()
    {
        return $this->get_shipping_total();
    }
    public function get_item_meta($order_item_id, $key = '', $single = false)
    {
        wc_deprecated_function('WC_Order::get_item_meta', '3.0', 'wc_get_order_item_meta');
        return get_metadata('order_item', $order_item_id, $key, $single);
    }
    public function get_item_meta_array($order_item_id)
    {
        wc_deprecated_function('WC_Order::get_item_meta_array', '3.0', 'WC_Order_Item::get_meta_data() (note the format has changed)');
        $item = $this->get_item($order_item_id);
        $meta_data = $item->get_meta_data();
        $item_meta_array = array();
        foreach ($meta_data as $meta) {
            $item_meta_array[$meta->id] = $meta;
        }
        return $item_meta_array;
    }
    public function get_used_coupons()
    {
        wc_deprecated_function('get_used_coupons', '3.7', 'WC_Abstract_Order::get_coupon_codes');
        return $this->get_coupon_codes();
    }
    public function expand_item_meta($item)
    {
        wc_deprecated_function('WC_Order::expand_item_meta', '3.0');
        return $item;
    }
    protected function init($order)
    {
        wc_deprecated_function('WC_Order::init', '3.0', 'Logic moved to constructor');
        if (is_numeric($order)) {
            $this->set_id($order);
        } elseif ($order instanceof WC_Order) {
            $this->set_id(absint($order->get_id()));
        } elseif (isset($order->ID)) {
            $this->set_id(absint($order->ID));
        }
        $this->set_object_read(false);
        $this->data_store->read($this);
    }
    public function get_order($id = 0)
    {
        wc_deprecated_function('WC_Order::get_order', '3.0');
        if (!$id) {
            return false;
        }
        $result = get_post($id);
        if ($result) {
            $this->populate($result);
            return true;
        }
        return false;
    }
    public function populate($result)
    {
        wc_deprecated_function('WC_Order::populate', '3.0');
        $this->set_id($result->ID);
        $this->set_object_read(false);
        $this->data_store->read($this);
    }
    public function cancel_order($note = '')
    {
        wc_deprecated_function('WC_Order::cancel_order', '3.0', 'WC_Order::update_status');
        WC()->session->set('order_awaiting_payment', false);
        $this->update_status('cancelled', $note);
    }
    public function record_product_sales()
    {
        wc_deprecated_function('WC_Order::record_product_sales', '3.0', 'wc_update_total_sales_counts');
        wc_update_total_sales_counts($this->get_id());
    }
    public function increase_coupon_usage_counts()
    {
        wc_deprecated_function('WC_Order::increase_coupon_usage_counts', '3.0', 'wc_update_coupon_usage_counts');
        wc_update_coupon_usage_counts($this->get_id());
    }
    public function decrease_coupon_usage_counts()
    {
        wc_deprecated_function('WC_Order::decrease_coupon_usage_counts', '3.0', 'wc_update_coupon_usage_counts');
        wc_update_coupon_usage_counts($this->get_id());
    }
    public function reduce_order_stock()
    {
        wc_deprecated_function('WC_Order::reduce_order_stock', '3.0', 'wc_reduce_stock_levels');
        wc_reduce_stock_levels($this->get_id());
    }
    public function send_stock_notifications($product, $new_stock, $qty_ordered)
    {
        wc_deprecated_function('WC_Order::send_stock_notifications', '3.0');
    }
    public function email_order_items_table($args = array())
    {
        wc_deprecated_function('WC_Order::email_order_items_table', '3.0', 'wc_get_email_order_items');
        return wc_get_email_order_items($this, $args);
    }
    public function get_order_currency()
    {
        wc_deprecated_function('WC_Order::get_order_currency', '3.0', 'WC_Order::get_currency');
        return apply_filters('woocommerce_get_order_currency', $this->get_currency(), $this);
    }
}