<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

use Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController;

class WC_Advanced_Shipment_Tracking_Actions {

	/**
	 * Instance of this class.
	 *
	 * @var object Class Instance
	 */
	private static $instance;
	public $table;
	public $providers;
	public $providers_for_app;
	
	public function __construct() {
		
		global $wpdb;
		if ( is_multisite() ) {			
			
			if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
				require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
			}
			
			if ( is_plugin_active_for_network( 'woo-advanced-shipment-tracking/woocommerce-advanced-shipment-tracking.php' ) ) {
				$main_blog_prefix = $wpdb->get_blog_prefix( BLOG_ID_CURRENT_SITE );			
				$this->table = $main_blog_prefix . 'woo_shippment_provider';	
			} else {
				$this->table = $wpdb->prefix . 'woo_shippment_provider';
			}			
		} else {
			$this->table = $wpdb->prefix . 'woo_shippment_provider';	
		}
	}

	/**
	 * Get the class instance
	 *
	 * @return WC_Advanced_Shipment_Tracking_Actions
	*/
	public static function get_instance() {

		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}
	
	/**
	 * Get shipping providers from database
	 */
	public function get_providers() {
		
		if ( empty( $this->providers ) ) {
			$this->providers = array();

			global $wpdb;
			$wpdb->hide_errors();
			$results = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM %1s', $this->table ) );
			
			if ( ! empty( $results ) ) {
				
				foreach ( $results as $row ) {										
					$provider_name = !empty( $row->custom_provider_name ) ? $row->custom_provider_name : $row->provider_name;
					$shippment_providers[ $row->ts_slug ] = array(
						'provider_name'=> $provider_name,
						'provider_url' => $row->provider_url,
						'trackship_supported' => $row->trackship_supported,						
					);
				}

				$this->providers = $shippment_providers;
			}
		}
		return $this->providers;
		
	}
	
	/**
	 * Get shipping providers from database for WooCommerce App
	 */
	public function get_providers_for_app() {
		
		if ( empty( $this->providers_for_app ) ) {
			$this->providers_for_app = array();

			global $wpdb;
			$WC_Countries = new WC_Countries();
			$wpdb->hide_errors();
			
			$shippment_countries = $wpdb->get_results( $wpdb->prepare( 'SELECT shipping_country FROM %1s WHERE display_in_order = 1 GROUP BY shipping_country', $this->table ) );
			
			$results = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM %1s GROUP BY shipping_country', $this->table ) );
			
			
			foreach ( $shippment_countries as $s_c ) {
				
				$country_name = ( 'Global' != $s_c->shipping_country ) ? esc_attr( $WC_Countries->countries[ $s_c->shipping_country ] ) : 'Global';
				$country = $s_c->shipping_country;
				$shippment_providers_by_country = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM %1s WHERE shipping_country = %s AND display_in_order = 1', $this->table, $country ) );				
								
				$providers_array = array();
				$new_provider = array();
				
				foreach ( $shippment_providers_by_country as $providers ) {	
					$new_provider = array(
						$providers->provider_name => $providers->provider_url,	
					);	
					$providers_array = array_merge( $providers_array, $new_provider );
				}
				
				$shippment_providers[ $country_name ] = $providers_array;				
					
				$this->providers_for_app = $shippment_providers;				
			}						
		}
		return $this->providers_for_app;
		
	}

	/**
	 * Load admin styles.
	 */
	public function admin_styles() {
		$plugin_url  = wc_shipment_tracking()->plugin_url;
		wp_enqueue_style( 'ast_styles', $plugin_url . '/assets/css/admin.css', array(), wc_shipment_tracking()->version );				
	}

	/**
	 * Define shipment tracking column in admin orders list.
	 *
	 * @since 1.6.1
	 *
	 * @param array $columns Existing columns
	 *
	 * @return array Altered columns
	 */
	public function shop_order_columns( $columns ) {
		$columns['woocommerce-advanced-shipment-tracking'] = __( 'Shipment Tracking', 'woo-advanced-shipment-tracking' );
		return $columns;
	}

	/**
	 * Render shipment tracking in custom column.
	 *
	 * @since 1.6.1
	 *
	 * @param string $column Current column
	 */
	public function render_shop_order_columns( $column ) {
		global $post;
		if ( 'woocommerce-advanced-shipment-tracking' === $column ) {
			echo wp_kses_post( $this->get_shipment_tracking_column( $post->ID ) );
		}
	}

	public function render_woocommerce_page_orders_columns( $column_name, $order ) {
		if ( 'woocommerce-advanced-shipment-tracking' === $column_name ) {
			echo wp_kses_post( $this->get_shipment_tracking_column( $order->get_id() ) );
		}
	}

	/**
	 * Get content for shipment tracking column.
	 *
	 * @since 1.6.1
	 *
	 * @param int $order_id Order ID
	 *
	 * @return string Column content to render
	 */
	public function get_shipment_tracking_column( $order_id ) {
		ob_start();

		$tracking_items = $this->get_tracking_items( $order_id, true );		

		if ( count( $tracking_items ) > 0 ) {
			
			echo '<ul class="wcast-tracking-number-list">';

			foreach ( $tracking_items as $tracking_item ) {

				if ( '' != $tracking_item[ 'formatted_tracking_provider' ] ) {
					$provider_name = $tracking_item[ 'formatted_tracking_provider' ];
				} else {                    
					$provider_name = '';
					if ( '' != $tracking_item[ 'tracking_provider' ] ) {
						$provider_name = $tracking_item[ 'tracking_provider' ];
					} elseif ( '' != $tracking_item[ 'custom_tracking_provider' ] ) {
						$provider_name = $tracking_item[ 'custom_tracking_provider' ];
					}
				}
				
				$tracking_id = isset( $tracking_item['tracking_id'] ) ? $tracking_item['tracking_id'] : '';

				$user_display = '';
				if ( isset( $tracking_item['user_id'] ) ) {
					$user_info = get_userdata( $tracking_item['user_id'] );
					if ( $user_info ) {
						$user_display = $user_info->display_name;
					}
				}

				$source_label = '';
				if ( isset( $tracking_item['source'] ) && ! empty( $tracking_item['source'] ) ) {
					$source_readable = str_replace( '_', ' ', $tracking_item['source'] );
					/* translators: 1: source (e.g., CSV, REST API) */
					$source_label = $source_readable;
				}

				if ( $tracking_item['ast_tracking_link'] ) {
					printf(
						'<li id="tracking-item-%s" class="tracking-item-%s"><div><b>%s</b></div><a href="%s" target="_blank" class="ft11">%s</a><a href="#" class="inline_tracking_delete" rel="%s" data-order="%s" data-nonce="%s"><span class="dashicons dashicons-trash"></span></a>
						<p class="tracking_meta_date">
							%s
						</p>
						</li>',
						esc_attr( $tracking_id ),
						esc_attr( $tracking_id ),
						esc_html( $provider_name ),
						esc_url( $tracking_item['ast_tracking_link'] ),
						esc_html( isset( $tracking_item['tracking_number'] ) ? $tracking_item['tracking_number'] : '' ),
						esc_attr( $tracking_id ),
						esc_attr( $order_id ),
						esc_html( wp_create_nonce( 'delete-tracking-item' ) ),
						sprintf(
							/* translators: 1: shipping date, 2: source info */
							__( 'Shipped on %1$s%2$s ', 'woo-advanced-shipment-tracking' ),
							date_i18n( get_option( 'date_format' ), isset( $tracking_item['date_shipped'] ) ? $tracking_item['date_shipped'] : '' ),
							( ! empty( $user_display ) )
							? sprintf(
								// translators: 1: user name, 2: source name
								__( ' by %1$s%2$s ', 'woo-advanced-shipment-tracking' ),
								esc_html( $user_display ),
								! empty( $source_label ) ? sprintf( __( ' (Added via %s) ', 'woo-advanced-shipment-tracking' ), esc_html( $source_label ) ) : ''
							)
							: ''
						)
					);
				} else {
						printf(
						'<li id="tracking-item-%s" class="tracking-item-%s"><div><b>%s</b></div>%s<a href="#" class="inline_tracking_delete" rel="%s" data-order="%s" data-nonce="' . esc_html( wp_create_nonce( 'delete-tracking-item' ) ) . '"><span class="dashicons dashicons-trash"></span></a>
						<p class="tracking_meta_date">
							%s
						</p>
						</li>',
						esc_attr( $tracking_id ),
						esc_attr( $tracking_id ),
						esc_html( $provider_name ),
						esc_html( isset( $tracking_item['tracking_number'] ) ? $tracking_item['tracking_number'] : '' ),
						esc_attr( $tracking_id ),
						esc_attr( $order_id ),
						sprintf(
							/* translators: 1: shipping date, 2: source info */
							__( 'Shipped on %1$s%2$s ', 'woo-advanced-shipment-tracking' ),
							date_i18n( get_option( 'date_format' ), isset( $tracking_item['date_shipped'] ) ? $tracking_item['date_shipped'] : '' ),
							( ! empty( $user_display ) )
							? sprintf(
								// translators: 1: user name, 2: source name
								__( ' by %1$s%2$s ', 'woo-advanced-shipment-tracking' ),
								esc_html( $user_display ),
								! empty( $source_label ) ? sprintf( __( ' (Added via %s) ', 'woo-advanced-shipment-tracking' ), esc_html( $source_label ) ) : ''
							)
							: ''
						)
					);
				}
			}			
			echo '</ul>';
		} else {
			echo '–';			
		}		
		return apply_filters( 'woocommerce_shipment_tracking_get_shipment_tracking_column', ob_get_clean(), $order_id, $tracking_items );
	}	

	/**
	 * Add the meta box for shipment info on the order page
	 */
	public function add_meta_box() {
		
		if ( class_exists( 'Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController' ) ) {
			$screen = wc_get_container()->get( CustomOrdersTableController::class )->custom_orders_table_usage_is_enabled() ? wc_get_page_screen_id( 'shop-order' ) : 'shop_order';	
		} else {
			$screen = 'shop_order';
		}
		
		add_meta_box( 'woocommerce-advanced-shipment-tracking', __( 'Shipment Tracking', 'woo-advanced-shipment-tracking' ), array( $this, 'meta_box' ), $screen, 'side', 'high' );
	}

	/**
	 * Returns a HTML node for a tracking item for the admin meta box
	 */
	public function display_html_tracking_item_for_meta_box( $order_id, $item ) {
			
		global $wpdb;
		
		$formatted = $this->get_formatted_tracking_item( $order_id, $item );

		if ( '' != $formatted[ 'formatted_tracking_provider' ] ) {
			$shipping_provider = $formatted[ 'formatted_tracking_provider' ];
		} else {
			$shipping_provider = '';
			if ( '' != $item[ 'tracking_provider' ] ) {
				$shipping_provider = $item[ 'tracking_provider' ];
			} elseif ( '' != $item[ 'custom_tracking_provider' ] ) {
				$shipping_provider = $item[ 'custom_tracking_provider' ];
			}
		}
		
		?>
		<div class="tracking-item" id="tracking-item-<?php echo esc_attr( $item['tracking_id'] ); ?>">
			<div class="tracking-content">
				<div class="tracking-content-div">
					<strong><?php echo esc_html( $shipping_provider ); ?></strong>						
					<?php if ( strlen( $formatted['ast_tracking_link'] ) > 0 ) { ?>
						- 
						<?php 							
						// echo sprintf( '<a href="%s" target="_blank" title="' . esc_attr( __( 'Track Shipment', 'woo-advanced-shipment-tracking' ) ) . '">' . esc_html( $item['tracking_number'] ) . '</a>', esc_url( $formatted['ast_tracking_link'] ) ); 
						echo sprintf(
							'<a href="%s" target="_blank" title="%s">%s</a>',
							esc_url( $formatted['ast_tracking_link'] ),
							esc_attr__( 'Track Shipment', 'woo-advanced-shipment-tracking' ),
							esc_html( $item['tracking_number'] )
						);
						
						?>
					<?php } else { ?>
						<span> - <?php echo esc_html( $item['tracking_number'] ); ?></span>
					<?php } ?>
				</div>					
				<?php 
				do_action(	'ast_after_tracking_number', $order_id, $item['tracking_id'] );
				do_action(	'ast_shipment_tracking_end', $order_id, $item ); 
				?>
			</div>
			<p class="meta">
				<?php 
				/* translators: 1: shipping date */
				$shipped_date = date_i18n( get_option( 'date_format' ), $item['date_shipped'] );
				echo esc_html( sprintf( __( 'Shipped on %1s ', 'woo-advanced-shipment-tracking' ), $shipped_date ) );

				// Check if there's a user ID associated with this tracking item
				if ( isset( $item['user_id'] ) ) {

					// Get user info from the user ID
					$user_info = get_userdata( $item['user_id'] );

					if ( $user_info ) {
						// Get the display name of the user
						$display_name = $user_info->display_name;

						// Default to no source info
						$source_label = '';

						// Check if a source is set and not empty (e.g., 'csv', 'api', 'manual')
						if ( ! empty( $item['source'] ) ) {
							// Convert source to human-readable format (e.g., 'csv_upload' → 'Csv Upload')
							$source_label = sprintf( 
								__( ' (Added via %s) ', 'woo-advanced-shipment-tracking' ), 
								str_replace( '_', ' ', $item['source'] )
							);
						}

						// Display "by John Doe (Added via Source)"
						/* translators: 1: display name, 2: source text */
						echo esc_html( sprintf( __( ' by %1s%2s ', 'woo-advanced-shipment-tracking' ), $display_name, $source_label ) );
					}
				}
				?>
				<a href="#" class="delete-tracking" rel="<?php echo esc_attr( $item['tracking_id'] ); ?>" data-nonce="<?php echo esc_html( wp_create_nonce( 'delete-tracking-item' ) ); ?>"><?php esc_html_e( 'Delete', 'woocommerce' ); ?></a>                    
			</p>
		</div>
		<?php
	}		

	/**
	 * Show the meta box for shipment info on the order page
	 */
	public function meta_box( $post_or_order_object ) {
		global $wpdb;			
		
		$order = ( $post_or_order_object instanceof WP_Post ) ? wc_get_order( $post_or_order_object->ID ) : $post_or_order_object;
		$order_id = $order->get_id();
		$WC_Countries = new WC_Countries();
		$tracking_items = $this->get_tracking_items( $order_id );
		
		$shippment_countries = $wpdb->get_results( $wpdb->prepare( 'SELECT shipping_country FROM %1s WHERE display_in_order = 1 GROUP BY shipping_country', $this->table ) );
		
		$shippment_providers = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM %1s', $this->table ) );
		
		$default_provider = get_option( 'wc_ast_default_provider' );

		echo '<div id="tracking-items">';
		if ( count( $tracking_items ) > 0 ) {
			foreach ( $tracking_items as $tracking_item ) {				
				$this->display_html_tracking_item_for_meta_box( $order_id, $tracking_item );
			}
		}
		echo '</div>';
		echo '<a class="button button-primary btn_ast2 btn_full add_tracking_inside" style="line-height: 32px;margin-top: 10px;text-align: center;" href="javascript:void(0)">' . esc_html__( 'Add Tracking Info', 'woo-advanced-shipment-tracking' ) . '</a>';
		?>
		<div id="" class="slidout_container add_inside_tracking_popup">
			<div class="slidout_header">
				<div class="slidout_header_title">
					<h3 class="slidout_title"><?php esc_html_e( 'Add Tracking - order	', 'woo-advanced-shipment-tracking'); ?> - #<?php esc_html_e( $order->get_order_number() ); ?></h3>
				</div>	
				<div class="slidout_header_action">
					<span class="dashicons dashicons-no-alt popup_close_icon slidout_close"></span>
				</div>	
			</div>
			<div class="slidout_body">				
				<?php do_action( 'ast_tracking_form_between_form', $order_id, 'inline' ); ?>
				<p class="form-field tracking_number_field">
					<label for="tracking_number"><?php esc_html_e( 'Tracking number:', 'woo-advanced-shipment-tracking'); ?></label>
					<input type="text" class="short" name="tracking_number" id="tracking_number" value="" autocomplete="off"> 
				</p>
				<p class="form-field">
					<label for="tracking_number"><?php esc_html_e( 'Shipping Provider:', 'woo-advanced-shipment-tracking'); ?></label>
					<select class="chosen_select tracking_provider_dropdown" id="tracking_provider" name="tracking_provider">
						<option value=""><?php esc_html_e( 'Shipping Provider:', 'woo-advanced-shipment-tracking' ); ?></option>
						<?php 
							
						foreach ( $shippment_countries as $s_c ) {
							
							if ( 'Global' != $s_c->shipping_country ) {
								$country_name = esc_attr( $WC_Countries->countries[ $s_c->shipping_country ] );
							} else {
								$country_name = 'Global';
							}
							
							echo '<optgroup label="' . esc_html( $country_name ) . '">';
							
							$country = $s_c->shipping_country;				
							$shippment_providers_by_country = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM %1s WHERE shipping_country = %s AND display_in_order = 1', $this->table, $country ) );
							
							foreach ( $shippment_providers_by_country as $providers ) {
								$selected = ( esc_attr( $providers->id ) == $default_provider ) ? 'selected' : '';
								echo '<option value="' . esc_attr( $providers->ts_slug ) . '" ' . esc_html( $selected ) . '>' . esc_html( $providers->provider_name ) . '</option>';
							}
							
							echo '</optgroup>';
						}
						?>
					</select>
				</p>	
				<p class="form-field date_shipped_field">
					<label for="date_shipped"><?php esc_html_e( 'Date shipped:', 'woo-advanced-shipment-tracking'); ?></label>
					<input type="text" class="ast-date-picker-field" name="date_shipped" id="date_shipped" value="<?php echo esc_html( date_i18n( __( 'Y-m-d', 'woo-advanced-shipment-tracking' ), current_time( 'timestamp' ) ) ); ?>" placeholder="<?php echo esc_html( date_i18n( __( 'Y-m-d', 'woo-advanced-shipment-tracking' ), time() ) ); ?>">						
				</p>								
				<?php do_action( 'ast_after_tracking_field', $order_id ); ?>					
				<?php wc_advanced_shipment_tracking()->actions->mark_order_as_fields_html(); ?>						
				<hr>
				<p class="fulfill_order_btn_sidebar">		
					<?php wp_nonce_field( 'wc_ast_inline_tracking_form', 'wc_ast_inline_tracking_form_nonce' ); ?>
					<input type="hidden" name="order_id" id="order_id" value="<?php esc_html_e( $order_id ); ?>">
					<input type="button" value="<?php esc_html_e( 'Fulfill Order', 'woo-advanced-shipment-tracking' ); ?>" class="button-primary btn_green add_inside_tracking_button">        
				</p>
				<!-- <p class="preview_tracking_link"><?php //esc_html_e( 'Preview:', 'woo-advanced-shipment-tracking' ); ?>&nbsp;<a href="" target="_blank"><?php //esc_html_e( 'Track Shipment', 'woo-advanced-shipment-tracking' ); ?></a></p>					 -->
			</div>			
		</div>
		<?php
		
		$provider_array = array();

		foreach ( $shippment_providers as $provider ) {
			$provider_array[ $provider->ts_slug ] = urlencode( $provider->provider_url );
		}
		
		$js = "
			jQuery( 'p.custom_tracking_link_field, p.custom_tracking_provider_field ').hide();

			jQuery( 'input#tracking_number, #tracking_provider' ).change( function() {

				var tracking  = jQuery( 'input#tracking_number' ).val();
				var provider  = jQuery( '#tracking_provider' ).val();
				var providers = jQuery.parseJSON( '" . json_encode( $provider_array ) . "' );

				var postcode = jQuery( '#_shipping_postcode' ).val();

				if ( ! postcode.length ) {
					postcode = jQuery( '#_billing_postcode' ).val();
				}

				postcode = encodeURIComponent( postcode );

				var link = '';

				if ( providers[ provider ] ) {
					link = providers[provider];
					link = link.replace( '%25number%25', tracking );
					link = link.replace( '%252%24s', postcode );
					link = decodeURIComponent( link );

					jQuery( 'p.custom_tracking_link_field, p.custom_tracking_provider_field' ).hide();
				} else {
					jQuery( 'p.custom_tracking_link_field, p.custom_tracking_provider_field' ).show();

					link = jQuery( 'input#custom_tracking_link' ).val();
				}

				if ( link ) {
					jQuery( 'p.preview_tracking_link a' ).attr( 'href', link );
					jQuery( 'p.preview_tracking_link' ).show();
				} else {
					jQuery( 'p.preview_tracking_link' ).hide();
				}

			} ).change();";

		if ( defined( 'WC_VERSION' ) && version_compare( WC_VERSION, '10.4.0', '>=' ) ) {
			wp_add_inline_script( 'woocommerce-advanced-shipment-tracking-js', $js );
		} elseif ( function_exists( 'wc_enqueue_js' ) ) {
			wc_enqueue_js( $js );
		} else {
			WC()->add_inline_js( $js );
		}
		
		wp_enqueue_style( 'ast_styles', wc_advanced_shipment_tracking()->plugin_dir_url() . 'assets/css/admin.css', array(), wc_advanced_shipment_tracking()->version );
		wp_enqueue_style( 'ast_slideout_styles', wc_advanced_shipment_tracking()->plugin_dir_url() . 'assets/css/slideout.css', array(), wc_advanced_shipment_tracking()->version );				
		wp_enqueue_script( 'woocommerce-advanced-shipment-tracking-js', wc_advanced_shipment_tracking()->plugin_dir_url() . 'assets/js/admin.js', array(), wc_advanced_shipment_tracking()->version );
		wp_localize_script(
			'woocommerce-advanced-shipment-tracking-js',
			'ast_orders_params',
			array(
				'order_nonce' => wp_create_nonce( 'ast-order-list' ),
			)
		);
		?>
		<script>
			jQuery(document).on("change", "#tracking_provider", function(){	
				var selected_provider = jQuery(this).val();			
				if(selected_provider == 'nz-couriers' || selected_provider == 'post-haste' || selected_provider == 'castle-parcels' || selected_provider == 'dx-mail' || selected_provider == 'now-couriers'){
					jQuery('.tracking_product_code_field').show();
				} else{
					jQuery('.tracking_product_code_field').hide();
				}			
			});
		</script>
		<?php
		do_action( 'ast_tracking_form_end_meta_box' );
	}
	
	/*
	* Function for mark order as html
	*/
	public function mark_order_as_fields_html() {
		
		$wc_ast_status_shipped = get_ast_settings( 'ast_general_settings', 'wc_ast_status_shipped', 0 );
		$shipped_label = ( 1 == $wc_ast_status_shipped ) ? __( 'Shipped', 'woo-advanced-shipment-tracking' ) : __( 'Completed', 'woo-advanced-shipment-tracking' );
		
		$wc_ast_default_mark_shipped	= apply_filters( 'wc_ast_default_mark_shipped', 1 );
		$wc_ast_status_partial_shipped	= get_ast_settings( 'ast_general_settings', 'wc_ast_status_partial_shipped', '' );
		
		$order_status_array = apply_filters( 'mark_order_as_fields_data' , array(
				'change_order_to_shipped' => array(					
					'name'		=> 'change_order_to_shipped',
					'class'		=> 'mark_shipped_checkbox',
					'label'		=> $shipped_label,
					'checked'	=> ( 1 == $wc_ast_default_mark_shipped ) ? true : false,
					'show'		=> true,
				),
				'change_order_to_partial_shipped' => array(					
					'name'		=> 'change_order_to_shipped',
					'class'		=> 'mark_shipped_checkbox',
					'label'		=> __( 'Partially Shipped', 'woo-advanced-shipment-tracking'),
					'checked'	=> false,
					'show'		=> ( 1 == $wc_ast_status_partial_shipped ) ? true : false		
				),
			)	
		);
		?>
		
		<fieldset class="form-field change_order_to_shipped_field">
			<span><?php esc_html_e( 'Mark order as:', 'woo-advanced-shipment-tracking'); ?></span>
			<ul class="wc-radios">
				<?php 
				foreach ( $order_status_array as $value => $data ) {
					if ( isset( $data['show'] ) && true == $data['show'] ) {
						$checked = $data['checked'] ? 'checked' : '';	
						?>
						<li>
							<label>
								<input name="<?php esc_html_e( $data['name'] ); ?>" value="<?php esc_html_e( $value ); ?>" type="checkbox" class="select short mark_shipped_checkbox" <?php esc_html_e( $checked ); ?>><?php esc_html_e( $data['label'] ); ?>
							</label>
						</li>
					<?php 
					} 
				}
				?>
			</ul>
		</fieldset>	
		<?php		
	}

	/*
	* Function for add tracking button in order details page
	*/
	public function ast_add_tracking_btn() {
		echo '<button class="button button-primary btn_ast2 btn_full button-show-tracking-form" type="button">' . esc_html__( 'Add Tracking Info', 'woo-advanced-shipment-tracking' ) . '</button>';
	}	

	/**
	 * Order Tracking Get All Order Items AJAX
	 *
	 * Function for getting all tracking items associated with the order
	 */
	public function get_meta_box_items_ajax() {
		
		check_ajax_referer( 'get-tracking-item', 'security', true );

		$order_id = isset( $_POST['order_id'] ) ? wc_clean( $_POST['order_id'] ) : '';
		$tracking_items = $this->get_tracking_items( $order_id );

		foreach ( $tracking_items as $tracking_item ) {
			$this->display_html_tracking_item_for_meta_box( $order_id, $tracking_item );
		}
		die();
	}
	
	/**
	 * Get shipping provider custom name or name	 
	 */
	public function get_ast_provider_name_callback( $provider_name, $results ) {
		
		if ( !empty( $results ) ) {
			$provider_name = ( null != $results->custom_provider_name ) ? $results->custom_provider_name : $results->provider_name;			
		}
		
		return $provider_name;
	}
	
	/**
	 * Get shipping provider image src 
	 */
	public function get_shipping_provdider_src_callback( $results ) {
		
		if ( !empty( $results ) ) {
			
			$upload_dir   = wp_upload_dir();	
			$ast_directory = $upload_dir['baseurl'] . '/ast-shipping-providers/';
			$src = $ast_directory . '' . esc_html( $results->ts_slug ) . '.png?v=' . wc_advanced_shipment_tracking()->version;			
		} else {
			$src = wc_advanced_shipment_tracking()->plugin_dir_url() . 'assets/images/icon-default.png';
		}
		return $src;
	}

	/**
	 * Order Tracking Save
	 *
	 * Function for saving tracking items
	 */
	public function save_meta_box( $post_id, $post ) {
		
		// Check the nonce.
		if ( empty( $_POST['woocommerce_meta_nonce'] ) || ! wp_verify_nonce( wp_unslash( wc_clean( $_POST['woocommerce_meta_nonce'] ) ), 'woocommerce_save_data' ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			return;
		}
		
		$tracking_provider = isset( $_POST['tracking_provider'] ) ? wc_clean( $_POST['tracking_provider'] ) : '';
		$tracking_number = isset( $_POST['tracking_number'] ) ? wc_clean( $_POST['tracking_number'] ) : '';

		// If the RouteApp plugin is active, disable its tracking meta-update hooks
		if ( is_plugin_active( 'routeapp/routeapp.php' ) ) {
			// Access the RouteApp public class instance
			global $routeapp_public;
			// Remove RouteApp handler from added_post_meta
			remove_action( 'added_post_meta', array( $routeapp_public, 'routeapp_update_tracking_order_api' ), 20, 3 );
			
			// Remove RouteApp handler from updated_post_meta
			remove_action( 'updated_post_meta', array( $routeapp_public, 'routeapp_update_tracking_order_api' ), 20, 3 );
		}
		
		if ( strlen( $tracking_number ) > 0 && '' != $tracking_provider ) {	
			
			$tracking_product_code = isset( $_POST['tracking_product_code'] ) ? wc_clean( $_POST['tracking_product_code'] ) : '';
			$date_shipped = isset( $_POST['date_shipped'] ) ? wc_clean( $_POST['date_shipped'] ) : '';
			$tracking_number = isset( $_POST['tracking_number'] ) ? wc_clean( $_POST['tracking_number'] ) : '';
			$tracking_provider = isset( $_POST['tracking_provider'] ) ? wc_clean( $_POST['tracking_provider'] ) : '';
			$order = new WC_Order($post_id);
			
			$args = array(
				'tracking_provider'        => $tracking_provider,
				'tracking_number'          => $tracking_number,
				'tracking_product_code'    => $tracking_product_code,
				'date_shipped'             => $date_shipped,
			);
			
			$args = apply_filters( 'tracking_info_args', $args, $_POST, $post_id );
			
			if ( isset( $_POST['change_order_to_shipped'] ) ) {
				if ( 'change_order_to_shipped' == $_POST['change_order_to_shipped'] ) {
					$args['status_shipped'] = 1;														
				} elseif ( 'change_order_to_partial_shipped' == $_POST['change_order_to_shipped'] ) {
					$args['status_shipped'] = 2;	
				}
			} else {
				$args['status_shipped'] = 0;
			}
			
			$this->add_tracking_item( $post_id, $args );							
		}
	}
	
	/**
	 * Order Tracking Save AJAX
	 *
	 * Function for saving tracking items via AJAX
	 */
	public function save_meta_box_ajax() {
		
		check_ajax_referer( 'wc_ast_inline_tracking_form', 'security', true );
		
		$tracking_provider = isset( $_POST['tracking_provider'] ) ? wc_clean( $_POST['tracking_provider'] ) : '';
		$tracking_number = isset( $_POST['tracking_number'] ) ? wc_clean( $_POST['tracking_number'] ) : '';
		//$tracking_number = str_replace( ' ', '', $tracking_number );	
		
		// If the RouteApp plugin is active, disable its tracking meta-update hooks
		if ( is_plugin_active( 'routeapp/routeapp.php' ) ) {
			// Access the RouteApp public class instance
			global $routeapp_public;
			// Remove RouteApp handler from added_post_meta
			remove_action( 'added_post_meta', array( $routeapp_public, 'routeapp_update_tracking_order_api' ), 20, 3 );
			
			// Remove RouteApp handler from updated_post_meta
			remove_action( 'updated_post_meta', array( $routeapp_public, 'routeapp_update_tracking_order_api' ), 20, 3 );
		}
		
		if ( strlen( $tracking_number ) > 0 && '' != $tracking_provider ) {	
	
			$order_id = isset( $_POST['order_id'] ) ? wc_clean( $_POST['order_id'] ) : '';
			$order = new WC_Order( $order_id );
			$tracking_product_code = isset( $_POST['tracking_product_code'] ) ? wc_clean( $_POST['tracking_product_code'] ) : '';
			$date_shipped = isset( $_POST['date_shipped'] ) ? wc_clean( $_POST['date_shipped'] ) : '';
			
			$args = array(
				'tracking_provider'        => $tracking_provider,
				'tracking_number'          => $tracking_number,
				'tracking_product_code'    => $tracking_product_code,	
				'date_shipped'             => $date_shipped,
			);
			
			$args = apply_filters( 'tracking_info_args', $args, $_POST, $order_id );
			
			$change_order_to_shipped = isset( $_POST[ 'change_order_to_shipped' ] ) ? wc_clean( $_POST[ 'change_order_to_shipped' ] ) : '';
			
			if ( 'change_order_to_shipped' == $change_order_to_shipped ) {  						
				$args['status_shipped'] = 1;																
			} elseif ( 'change_order_to_partial_shipped' == $change_order_to_shipped ) {	
				$args['status_shipped'] = 2;	
			}
			$args['source'] = 'edit_order';
			$tracking_item = $this->add_tracking_item( $order_id, $args );

			$wc_ast_enable_log = get_ast_settings( 'ast_general_settings', 'wc_ast_enable_log', 0 );
			 
			if ( 1 == $wc_ast_enable_log ) {
				$log_content = array(
					'url'		=> isset( $_SERVER['REQUEST_URI'] ) ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : 'unknown',
					'request'	=> $_POST,
					'response'	=> array( 'tracking_item' => $tracking_item ),
				);
	
				$ast = WC_AST_Logger::get_instance();
				$ast->log_event( 'ast_create_manually_log', $log_content );
			}
			
			do_action( 'ast_save_tracking_details_end', $order_id, $_POST );
			
			if ( isset( $_POST['productlist'] ) && !empty( $_POST['productlist'] ) && '[]' != $_POST['productlist'] ) {
				echo 'reload';
				die();
			}	
			
			$this->display_html_tracking_item_for_meta_box( $order_id, $tracking_item );
		}

		die();
	}
	
	/**
	 * Order Tracking Save AJAX
	 *
	 * Function for saving tracking items via AJAX
	 */
	public function save_inline_tracking_number() {		
		
		check_ajax_referer( 'wc_ast_inline_tracking_form', 'wc_ast_inline_tracking_form_nonce' );
		
		$tracking_provider = isset( $_POST['tracking_provider'] ) ? wc_clean( $_POST['tracking_provider'] ) : '';
		$tracking_number = isset( $_POST['tracking_number'] ) ? wc_clean( $_POST['tracking_number'] ) : '';

		// If the RouteApp plugin is active, disable its tracking meta-update hooks
		if ( is_plugin_active( 'routeapp/routeapp.php' ) ) {
			// Access the RouteApp public class instance
			global $routeapp_public;
			// Remove RouteApp handler from added_post_meta
			remove_action( 'added_post_meta', array( $routeapp_public, 'routeapp_update_tracking_order_api' ), 20, 3 );
			
			// Remove RouteApp handler from updated_post_meta
			remove_action( 'updated_post_meta', array( $routeapp_public, 'routeapp_update_tracking_order_api' ), 20, 3 );
		}
		
		if ( strlen( $tracking_number ) > 0 && '' != $tracking_provider ) {	
			
			$order_id = isset( $_POST['order_id'] ) ? wc_clean( $_POST['order_id'] ) : '';
			$tracking_product_code = isset( $_POST['tracking_product_code'] ) ? wc_clean( $_POST['tracking_product_code'] ) : '';
			$date_shipped = isset( $_POST['date_shipped'] ) ? wc_clean( $_POST['date_shipped'] ) : '';
			
			$args = array(
				'tracking_provider'		=> $tracking_provider,
				'tracking_number'		=> $tracking_number,
				'tracking_product_code'	=> $tracking_product_code,	
				'date_shipped'			=> $date_shipped,
			);
			
			$args = apply_filters( 'tracking_info_args', $args, $_POST, $order_id );
			
			$change_order_to_shipped = isset( $_POST[ 'change_order_to_shipped' ] ) ? wc_clean( $_POST[ 'change_order_to_shipped' ] ) : '';
			
			if ( 'change_order_to_shipped' == $change_order_to_shipped || 'yes' == $change_order_to_shipped ) {
				$args['status_shipped'] = 1;																
			} elseif ( 'change_order_to_partial_shipped' == $change_order_to_shipped ) {
				$args['status_shipped'] = 2;	
			}	

			$args['source'] = 'orders';	
			
			$tracking_item = $this->add_tracking_item( $order_id, $args );

			$wc_ast_enable_log = get_ast_settings( 'ast_general_settings', 'wc_ast_enable_log', 0 );
			 
			if ( 1 == $wc_ast_enable_log ) {
				$log_content = array(
					'url'		=> isset( $_SERVER['REQUEST_URI'] ) ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : 'unknown',
					'request'	=> $_POST,
					'response'	=> array( 'tracking_item' => $tracking_item ),
				);
	
				$ast = WC_AST_Logger::get_instance();
				$ast->log_event( 'ast_create_inline_log', $log_content );
			}

			do_action( 'ast_save_tracking_details_end', $order_id, $_POST );	
		}
	}

	/**
	 * Order Tracking Delete
	 *
	 * Function to delete a tracking item
	 */
	public function meta_box_delete_tracking() {
		
		check_ajax_referer( 'delete-tracking-item', 'security' );
		
		$order_id    = isset( $_POST['order_id'] ) ? wc_clean( $_POST['order_id'] ) : '';
		$tracking_id = isset( $_POST['tracking_id'] ) ? wc_clean( $_POST['tracking_id'] ) : '';
		$tracking_items = $this->get_tracking_items( $order_id, true );
		
		do_action( 'delete_tracking_number_from_trackship', $tracking_items, $tracking_id, $order_id );				
		
		foreach ( $tracking_items as $tracking_item ) {
			if ( $tracking_item['tracking_id'] == $tracking_id ) {
				
				$formated_tracking_item = $this->get_formatted_tracking_item( $order_id, $tracking_item );
				$tracking_number = $tracking_item['tracking_number'];
				$tracking_provider = $formated_tracking_item['formatted_tracking_provider'];
				$order = wc_get_order(  $order_id );
				
				/* translators: %1$s: Reaplce with tracking provider, %2$s: Reaplce with tracking number */
				$note = sprintf( __( 'Tracking info was deleted for tracking provider %1$s with tracking number %2$s', 'woo-advanced-shipment-tracking' ), $tracking_provider, $tracking_number );
				
				// Add the note
				$order->add_order_note( $note );
			}
		}
		
		$this->delete_tracking_item( $order_id, $tracking_id );				
	}

	/**
	 * Display Shipment info in the frontend (order view/tracking page).
	 */
	public function show_tracking_info_order( $order_id ) {	
		
		wp_enqueue_style( 'front_style' );
		wp_enqueue_script( 'wc-jquery-blockui' );
		wp_enqueue_script( 'front-js' );
		
		$local_template	= get_stylesheet_directory() . '/woocommerce/myaccount/tracking-info.php';

		if ( file_exists( $local_template ) && is_writable( $local_template ) ) {	
			wc_get_template( 'myaccount/tracking-info.php', array( 'tracking_items' => $this->get_tracking_items( $order_id, true ), 'order_id' => $order_id ), '', get_stylesheet_directory() . '/woocommerce/' );
		} else {
			wc_get_template( 'myaccount/tracking-info.php', array( 'tracking_items' => $this->get_tracking_items( $order_id, true ), 'order_id' => $order_id ), 'woocommerce-advanced-shipment-tracking/', wc_advanced_shipment_tracking()->get_plugin_path() . '/templates/' );	
		}
	}	
	
	/**
	* Adds a new column Track to the "My Orders" table in the account.
	*
	* @param string[] $columns the columns in the orders table
	* @return string[] updated columns
	*/
	public function add_column_my_account_orders( $columns ) {
		
		$new_columns = array();
		foreach ( $columns as $key => $name ) {
	
			$new_columns[ $key ] = $name;
	
			// add ship-to after order status column
			if ( 'order-total' === $key ) {
				$new_columns['order-ast-track'] = __( 'Track', 'woo-advanced-shipment-tracking' );
			}
		}

		return $new_columns;	
	}	
	
	/**
	* Adds data to the custom "Track" column in "My Account > Orders".
	*
	* @param \WC_Order $order the order object for the row
	*/
	public function add_column_my_account_orders_ast_track_column( $actions, $order ) {
	
		$order_id = $order->get_id();
		$tracking_items = $this->get_tracking_items( $order_id, true );		
		
		if ( 0 == count( $tracking_items ) ) {
			return $actions;
		}
		
		if ( count( $tracking_items ) > 1 ) {
			$actions['ast_multi_track'] = array(
				// adjust URL as needed
				'url'  => $order->get_view_order_url(),
				'name' => __( 'Track', 'woo-advanced-shipment-tracking' ),
			);
			return $actions;
		}				
		
		$tracking_items = reset($tracking_items);
		$actions['ast_track'] = array(
			// adjust URL as needed
			'url'  => $tracking_items[ 'ast_tracking_link' ],
			'name' => __( 'Track', 'woo-advanced-shipment-tracking' ),
		);

		add_action( 'wp_footer', array( $this, 'track_button_script' ) );

		return $actions;
	}

	public function track_button_script() {
		?>
		<script>
			jQuery( document ).ready(function() {
				jQuery('.ast_track').attr("target","_blank");
			});
		</script>
		<?php
	}
	/**
	 * Display shipment info in customer emails.
	 *
	 * @version 1.6.8
	 *
	 * @param WC_Order $order         Order object.
	 * @param bool     $sent_to_admin Whether the email is being sent to admin or not.
	 * @param bool     $plain_text    Whether email is in plain text or not.
	 * @param WC_Email $email         Email object.
	 */
	public function email_display( $order, $sent_to_admin, $plain_text = null, $email = null ) {

		$wc_ast_unclude_tracking_info = get_ast_settings( 'ast_general_settings', 'wc_ast_unclude_tracking_info', '' );
		$order_id = is_callable( array( $order, 'get_id' ) ) ? $order->get_id() : $order->id;
		$ast_preview = ( isset( $_REQUEST['action'] ) && 'ast_email_preview' === $_REQUEST['action'] ) ? true : false;
		$local_template	= get_stylesheet_directory() . '/woocommerce/emails/fluid-tracking-info.php';
		$order = wc_get_order( $order_id );

		// check if it is a woocommerce	email preview
		$wc_order_status = ( isset( $_REQUEST['type'] ) && ( $_REQUEST['type'] === 'WC_Email_Customer_Completed_Order' || $_REQUEST['type'] === 'WC_Email_Customer_Partial_Shipped_Order' ) );
		$wc_order_preview = ( isset( $_REQUEST['preview_woocommerce_mail'] ) && 'true' === $_REQUEST['preview_woocommerce_mail'] );

		if ( ( $ast_preview && 1 == $order_id ) || ( $wc_order_status && $wc_order_preview ) ) {
			
			$upload_dir   = wp_upload_dir();	
			$ast_directory = $upload_dir['baseurl'] . '/ast-shipping-providers/';

			$tracking_items[]  = array(
				'tracking_provider'       		=> 'usps',
				'custom_tracking_provider'		=> '',				
				'formatted_tracking_provider'	=> 'USPS',
				'tracking_provider_image' 		=> $ast_directory . 'usps.png',
				'formatted_tracking_link'		=> 'https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=112123113',
				'ast_tracking_link'				=> 'https://tools.usps.com/go/TrackConfirmAction_input?qtc_tLabels1=112123113',
				'tracking_number'          		=> '112123113',				
				'date_shipped'             		=> strtotime( gmdate( 'Y-m-d' ) ),
			);
						
			if ( file_exists( $local_template ) && is_writable( $local_template ) ) {	
				wc_get_template( 'emails/fluid-tracking-info.php', array( 'tracking_items' => $tracking_items, 'order_id'=> 1 ), '', get_stylesheet_directory() . '/woocommerce/' );
			} else {
				wc_get_template( 'emails/fluid-tracking-info.php', array( 'tracking_items' => $tracking_items, 'order_id'=> 1 ), 'woocommerce-advanced-shipment-tracking/', wc_advanced_shipment_tracking()->get_plugin_path() . '/templates/' );	
			}	
			
		} else if ( $order ) {
			$order_status = $order->get_status();			
			
			if ( is_a( $email, 'WC_Email_Customer_Invoice' ) && isset( $wc_ast_unclude_tracking_info['show_in_customer_invoice'] ) && 0 == $wc_ast_unclude_tracking_info['show_in_customer_invoice'] ) {
				return;
			}	
			
			if ( is_a( $email, 'WC_Email_Customer_Note' ) && isset( $wc_ast_unclude_tracking_info['show_in_customer_note'] ) && 0 == $wc_ast_unclude_tracking_info['show_in_customer_note'] ) {
				return;
			}	
				
			if ( isset( $wc_ast_unclude_tracking_info[ $order_status ] ) && 0 == $wc_ast_unclude_tracking_info[ $order_status ] && !is_a( $email, 'WC_Email_Customer_Invoice' ) && !is_a( $email, 'WC_Email_Customer_Note' ) ) {
				return;
			}	
			
			if ( is_a( $email, 'WC_Email_Customer_Refunded_Order' ) && isset( $wc_ast_unclude_tracking_info[ 'refunded' ] ) && 0 == $wc_ast_unclude_tracking_info[ 'refunded' ] ) {
				return;
			}
	
			$tracking_items = $this->get_tracking_items( $order_id, true );
			
			if ( true === $plain_text ) {
				
				if ( file_exists( $local_template ) && is_writable( $local_template ) ) {
					wc_get_template( 
						'emails/plain/fluid-tracking-info.php', 
						array( 
							'tracking_items' => $this->get_tracking_items( $order_id, true ), 
							'order_id'=> $order_id
						), '', get_stylesheet_directory() . '/woocommerce/'
					);
				} else {
					wc_get_template( 
						'emails/plain/fluid-tracking-info.php',
						array( 
							'tracking_items' => $this->get_tracking_items( $order_id, true ), 
							'order_id'=> $order_id
						), 
						'woocommerce-advanced-shipment-tracking/', 
						wc_advanced_shipment_tracking()->get_plugin_path() . '/templates/' 
					);
				}					
			} else {
				
				if ( file_exists( $local_template ) && is_writable( $local_template ) ) {
					wc_get_template( 
						'emails/fluid-tracking-info.php', 
						array( 
							'tracking_items' => $this->get_tracking_items( $order_id, true ), 
							'order_id'=> $order_id
						), '', get_stylesheet_directory() . '/woocommerce/'
					);
				} else {
					wc_get_template( 
						'emails/fluid-tracking-info.php', 
						array( 
							'tracking_items' => $this->get_tracking_items( $order_id, true ), 
							'order_id'=> $order_id
						), 
						'woocommerce-advanced-shipment-tracking/', 
						wc_advanced_shipment_tracking()->get_plugin_path() . '/templates/' 
					);	
				}				
			}
		}	
	}		
	
	/**
	 * Prevents data being copied to subscription renewals
	 */
	public function woocommerce_subscriptions_renewal_order_meta_query( $order_meta_query, $original_order_id, $renewal_order_id, $new_order_role ) {
		$order_meta_query .= " AND `meta_key` NOT IN ( '_wc_shipment_tracking_items' )";
		return $order_meta_query;
	}

	/*
	 * Works out the final tracking provider and tracking link and appends then to the returned tracking item
	 *
	*/
	public function get_formatted_tracking_item( $order_id, $tracking_item ) {

		$formatted = array();
		$trackship_supported = '';

		if ( ! is_array( $tracking_item ) ) {
			return $formatted;
		}

		$order = wc_get_order( $order_id );

		if ( ! $order ) {
			return $formatted;
		}

		$postcode = $order->get_shipping_postcode();

		$formatted['formatted_tracking_provider'] = '';
		$formatted['formatted_tracking_link']     = '';				
		
		$tracking_provider = isset( $tracking_item['tracking_provider'] ) ? $tracking_item['tracking_provider'] : $tracking_item['custom_tracking_provider'];
		$tracking_provider = apply_filters( 'convert_provider_name_to_slug', $tracking_provider );
		$tracking_item['tracking_provider'] = $tracking_provider;
		$tracking_number = $tracking_item['tracking_number'];
		
		$link_format = '';
					
		foreach ( $this->get_providers() as $provider => $format ) {
			if ( ! is_array( $format ) ) {
				continue;
			}
			if ( $provider  === $tracking_item['tracking_provider'] || $format['provider_name']  === $tracking_item['tracking_provider'] ) {
				$link_format = $format['provider_url'];
				$trackship_supported = $format['trackship_supported'];
				$formatted['formatted_tracking_provider'] = $format['provider_name'];
				break;
			}

			if ( $link_format ) {
				break;
			}
		}

		if ( $link_format ) {
			$searchVal = array( '%number%', str_replace( ' ', '', '%2 $ s' ) );			
			$replaceVal = array( $tracking_number, urlencode( $postcode ) );
			$link_format = str_replace( $searchVal, $replaceVal, $link_format );
			
			if ( isset( $tracking_item[ 'tracking_product_code' ] ) ) {
				$searchnumber2 = array( '%number2%', str_replace(' ', '', '%2 $ s') );
				$tracking_product_code = str_replace(' ', '', $tracking_item['tracking_product_code']);					
				$link_format = str_replace( $searchnumber2, $tracking_product_code, $link_format );
			}
			
			if ( null != $order->get_shipping_country() ) {
				$shipping_country = $order->get_shipping_country();	
			} else {
				$shipping_country = $order->get_billing_country();	
			}								
			
			if ( $shipping_country ) {
				
				if ( 'jp-post' == $tracking_item['tracking_provider'] && 'JP' != $shipping_country ) {
					$local_en = '&locale=en';
					$link_format = $link_format . $local_en;
				}						
				
				if ( 'dhl-ecommerce' == $tracking_item['tracking_provider'] ) {
					$link_format = str_replace('us-en', strtolower($shipping_country) . '-en', $link_format); 	
				}
				
				if ( 'dhl-freight' == $tracking_item['tracking_provider'] ) {
					$link_format = str_replace('global-en', strtolower($shipping_country) . '-en', $link_format);
				}
			}
			
			if ( null != $order->get_shipping_postcode() ) {
				$shipping_postal_code = $order->get_shipping_postcode();	
			} else {
				$shipping_postal_code = $order->get_billing_postcode();
			}							
													
			$shipping_country = str_replace( ' ', '', $shipping_country );					
			$link_format = str_replace( '%country_code%', $shipping_country, $link_format );
													
			if ( 'apc-overnight' == $tracking_item['tracking_provider'] ) {
				$shipping_postal_code = str_replace( ' ', '+', $shipping_postal_code );
			} else {
				$shipping_postal_code = str_replace( ' ', '', $shipping_postal_code );
			}
			
			$link_format = str_replace( '%postal_code%', $shipping_postal_code, $link_format );

			// ==========================
			// ✅ NEW: Add %phone_number%
			// ==========================
			$phone_number = '';

			$billing_phone = $order->get_billing_phone();

			if ( ! empty( $billing_phone ) ) {
				$phone_number = $billing_phone;
			} else {
				 $shipping_phone = $order->get_shipping_phone();
				if ( ! empty( $shipping_phone ) ) {
					$phone_number = $shipping_phone;
				}
			}

			$phone_number = ! empty( $phone_number ) 
				? rawurlencode( str_replace( ' ', '', $phone_number ) ) 
				: '';

			$link_format = str_replace( '%phone_number%', $phone_number, $link_format );
			// ==========================
								
			$formatted_tracking_link = $link_format;
			$formatted['formatted_tracking_link'] = $link_format;
		} else {
			$formatted_tracking_link = isset( $tracking_item['custom_tracking_link'] ) ? $tracking_item['custom_tracking_link'] : '' ;
			$formatted['formatted_tracking_link'] = $formatted_tracking_link;
		}
		
		$trackship_supported = $this->check_provider_trackship_supported( $tracking_provider );
		$formatted['ast_tracking_link'] = apply_filters( 'ast_tracking_link', $formatted_tracking_link, $tracking_number, $order_id, $trackship_supported );
		
		global $wpdb;
		$results = $wpdb->get_row( $wpdb->prepare( 'SELECT * FROM %1s WHERE ts_slug = %s', $this->table, $tracking_item['tracking_provider'] ) );
		$formatted[ 'tracking_provider_image' ] = apply_filters( 'get_shipping_provdider_src', $results ); 	
		
		return $formatted;
	}
	
	public function check_provider_trackship_supported( $tracking_provider ) {
		global $wpdb;		
		$trackship_supported = $wpdb->get_var( $wpdb->prepare( 'SELECT trackship_supported FROM %1s WHERE ts_slug = %s', $this->table, $tracking_provider ) );
		return $trackship_supported;
	}

	/**
	 * Deletes a tracking item from post_meta array
	 *
	 * @param int    $order_id    Order ID
	 * @param string $tracking_id Tracking ID
	 *
	 * @return bool True if tracking item is deleted successfully
	 */
	public function delete_tracking_item( $order_id, $tracking_id ) {
		$tracking_items = $this->get_tracking_items( $order_id );
		$order = wc_get_order( $order_id );
		$is_deleted = false;

		if ( count( $tracking_items ) > 0 ) {
			foreach ( $tracking_items as $key => $item ) {
				if ( $item['tracking_id'] == $tracking_id ) {
					unset( $tracking_items[ $key ] );
					$is_deleted = true;
					do_action( 'fix_shipment_tracking_for_deleted_tracking', $order_id, $key, $item );
					break;
				}
			}
			$this->save_tracking_items( $order_id, $tracking_items );
		}
		
		$tracking_items = $this->get_tracking_items( $order_id );
		
		if ( !$tracking_items ) {
			$order->delete_meta_data( '_wc_shipment_tracking_items' );
			$order->save();
		}	
		
		return $is_deleted;
	}

	/*
	 * Adds a tracking item to the post_meta array
	 *
	 * @param int   $order_id    Order ID
	 * @param array $tracking_items List of tracking item
	 *
	 * @return array Tracking item
	 */
	public function add_tracking_item( $order_id, $args ) {
		$tracking_item = array();
		
		$tracking_item['tracking_provider']			= isset( $args['tracking_provider'] ) ? wc_clean( $args['tracking_provider'] ) : '';
		$tracking_item['custom_tracking_provider']	= isset( $args['custom_tracking_provider'] ) ? wc_clean( $args['custom_tracking_provider'] ) : '';
		$tracking_item['custom_tracking_link']		= isset( $args['custom_tracking_link'] ) ? wc_clean( $args['custom_tracking_link'] ) : '';
		$tracking_item['tracking_number']			= isset( $args['tracking_number'] ) ? wc_clean( $args['tracking_number'] ) : '';
		$tracking_item['tracking_product_code']		= isset( $args['tracking_product_code'] ) ? wc_clean( $args['tracking_product_code'] ) : '';
		$tracking_item['source'] 					= isset( $args['source'] ) ? wc_clean( $args['source'] ) : '';

		if ( strtotime( $args['date_shipped'] ) ) {
			if ( isset( $args['date_shipped'] ) ) {
				
				if ( isset($args['source']) && 'REST_API' == $args['source'] ) {
					$wc_ast_api_date_format = get_ast_settings( 'ast_general_settings', 'wc_ast_api_date_format', 'd-m-Y' );					
					$date = date_i18n( $wc_ast_api_date_format, strtotime( $args['date_shipped'] ) );				
				} else {									
					$date = date_i18n( 'd-m-Y', strtotime( $args['date_shipped'] ) );
				} 						
			
				$tracking_item['date_shipped'] = wc_clean( strtotime( $date ) );
			}
		} else {
			$tracking_item['date_shipped']   = time();
		}

		$tracking_item['status_shipped'] = isset( $args['status_shipped'] ) ? wc_clean( $args['status_shipped'] ) : '';		
		
		if ( 0 == (int) $tracking_item['date_shipped'] ) {
			 $tracking_item['date_shipped'] = time();
		}		

		if ( isset($tracking_item['custom_tracking_provider'] )) {
			$tracking_item['tracking_id'] = md5( "{$tracking_item['custom_tracking_provider']}-{$tracking_item['tracking_number']}" . microtime() );
		} else {
			$tracking_item['tracking_id'] = md5( "{$tracking_item['tracking_provider']}-{$tracking_item['tracking_number']}" . microtime() );
		}
		
		$tracking_item = apply_filters( 'tracking_item_args', $tracking_item, $args, $order_id );
		
		$tracking_items = $this->get_tracking_items( $order_id );					

		$tracking_items[] = $tracking_item;													
		
		$status_shipped = ( isset( $tracking_item[ 'status_shipped' ] ) ? $tracking_item[ 'status_shipped' ] : '' );
		
		$this->save_tracking_items( $order_id, $tracking_items );					
		
		$order = new WC_Order( $order_id );
		
		do_action( 'update_order_status_after_adding_tracking', $status_shipped, $order );
		
		$formated_tracking_item = $this->get_formatted_tracking_item( $order_id, $tracking_item );
		$tracking_provider = $formated_tracking_item['formatted_tracking_provider'];								
		
		/* translators: %1$s: Reaplce with tracking provider, %2$s: Reaplce with tracking number */
		$note = sprintf( __( 'Order was shipped with %1$s and tracking number is: %2$s', 'woo-advanced-shipment-tracking' ), $tracking_provider, $tracking_item['tracking_number'] );
		
		// Add the note
		$order->add_order_note( $note );	
		
		return $tracking_item;
	}

	public function add_user_in_tracking_item( $tracking_item, $args, $order_id ) {	
		if ( is_user_logged_in() ) {
			// User is logged in.
			$user_id = get_current_user_id();
			$tracking_item['user_id'] = $user_id;
		}		
		return $tracking_item;
	}
	
	public function seach_tracking_number_in_items( $tracking_number, $tracking_items ) {
		foreach ( $tracking_items as $key => $val ) {
			if ( ! is_array( $val ) ) {
				continue;
			}
			if ( $val['tracking_number'] === $tracking_number ) {
				return $key;
			}
		}
		return null;
	}
	
	/*
	 * Adds a tracking item to the post_meta array from external system programatticaly
	 *
	 * @param int   $order_id    Order ID
	 * @param array $tracking_items List of tracking item
	 *
	 * @return array Tracking item
	 */
	public function insert_tracking_item( $order_id, $args ) {
		$tracking_item = array();
		$tracking_provider = $args['tracking_provider'];				
		
		$ast_admin = WC_Advanced_Shipment_Tracking_Admin::get_instance();
		$shippment_provider = $ast_admin->get_provider_slug_from_name( $tracking_provider );	
		
		if ( $args['tracking_provider'] && !empty( $shippment_provider ) ) {
			$tracking_item['tracking_provider'] = wc_clean ( $shippment_provider );
		} else if ( $args['tracking_provider'] ) {
			$tracking_item['tracking_provider'] = $args['tracking_provider'];
		} 
		
		if ( $args['tracking_number'] ) {
			$tracking_item['tracking_number'] = wc_clean( $args['tracking_number'] );
		}

		if ( $args['date_shipped'] ) {
			if ( is_numeric( $args['date_shipped'] ) ) {
				$tracking_item['date_shipped'] = wc_clean( $args['date_shipped'] );
			} else {
				$date = str_replace( '/', '-', $args['date_shipped'] );
				$date = date_create($date);
				$date = date_format( $date, 'd-m-Y' );
				$tracking_item['date_shipped'] = wc_clean( strtotime( $date ) );
			}
		}
		
		if ( $args['status_shipped'] ) {
			$tracking_item['status_shipped'] = wc_clean( $args['status_shipped'] );
		}
		
		if ( 0 == (int) $tracking_item['date_shipped'] ) {
			 $tracking_item['date_shipped'] = time();
		}

		$tracking_item['tracking_id'] = md5( "{$tracking_item['tracking_provider']}-{$tracking_item['tracking_number']}" . microtime() );

		if ( $args['source'] ) {
			$tracking_item['source'] = wc_clean( $args['source'] );
		}
		
		$tracking_items   = $this->get_tracking_items( $order_id );
		
		$tracking_items[] = $tracking_item;
		
		if ( $tracking_item['tracking_provider'] ) {
			$this->save_tracking_items( $order_id, $tracking_items );
			
			$status_shipped = ( isset( $tracking_item['status_shipped'] ) ? $tracking_item['status_shipped'] : '' );				
		
			$order = new WC_Order( $order_id );
			
			do_action( 'update_order_status_after_adding_tracking', $status_shipped, $order );
			
			$formated_tracking_item = $this->get_formatted_tracking_item( $order_id, $tracking_item );
			$tracking_provider = $formated_tracking_item['formatted_tracking_provider'];			
			
			/* translators: %1$s: Reaplce with tracking provider, %2$s: Reaplce with tracking number */
			$note = sprintf( __( 'Order was shipped with %1$s and tracking number is: %2$s', 'woo-advanced-shipment-tracking' ), $tracking_provider, $tracking_item['tracking_number'] );
			
			// Add the note
			$order->add_order_note( $note );
			
			return $tracking_item;
		}
	}

	/**
	 * Saves the tracking items array to post_meta.
	 *
	 * @param int   $order_id       Order ID
	 * @param array $tracking_items List of tracking item
	 */
	public function save_tracking_items( $order_id, $tracking_items ) {
		$order = wc_get_order( $order_id );
		// Always re-index the array
		$tracking_items = array_values( $tracking_items );			
		$order->update_meta_data( '_wc_shipment_tracking_items', $tracking_items );
		$order->save();
	}

	/**
	 * Gets a single tracking item from the post_meta array for an order.
	 *
	 * @param int    $order_id    Order ID
	 * @param string $tracking_id Tracking ID
	 * @param bool   $formatted   Wether or not to reslove the final tracking
	 *                            link and provider in the returned tracking item.
	 *                            Default to false.
	 *
	 * @return null|array Null if not found, otherwise array of tracking item will be returned
	 */
	public function get_tracking_item( $order_id, $tracking_id, $formatted = false ) {
		$tracking_items = $this->get_tracking_items( $order_id, $formatted );

		if ( count( $tracking_items ) ) {
			foreach ( $tracking_items as $item ) {
				if ( $item['tracking_id'] === $tracking_id ) {
					return $item;
				}
			}
		}
		return null;
	}

	/*
	 * Gets all tracking itesm fron the post meta array for an order
	 *
	 * @param int  $order_id  Order ID
	 * @param bool $formatted Wether or not to reslove the final tracking link
	 *                        and provider in the returned tracking item.
	 *                        Default to false.
	 *
	 * @return array List of tracking items
	 */
	public function get_tracking_items( $order_id, $formatted = false ) {
		
		global $wpdb;
		$order = wc_get_order( $order_id );			
		if ( $order ) {	
			
			$tracking_items = $order->get_meta( '_wc_shipment_tracking_items', true );

			if ( is_array( $tracking_items ) ) {
				// Filter out any corrupted non-array entries before processing.
				$tracking_items = array_values( array_filter( $tracking_items, 'is_array' ) );
				if ( $formatted ) {
					foreach ( $tracking_items as &$item ) {
						$formatted_item = $this->get_formatted_tracking_item( $order_id, $item );
						$item           = array_merge( $item, $formatted_item );
					}
				}
				return $tracking_items;
			} else {
				return array();
			}
		} else {
			return array();
		}
	}

	/**
	* Gets the absolute plugin path without a trailing slash, e.g.
	* /path/to/wp-content/plugins/plugin-directory
	*
	* @return string plugin path
	*/
	public function get_plugin_path() {
		$this->plugin_path = untrailingslashit( plugin_dir_path( dirname( __FILE__ ) ) );
		return $this->plugin_path;
	}	
	
	/**
	 * Validation code add tracking info form
	*/
	public function custom_validation_js() {
		?>
		<script>
		jQuery(document).on("click",".button-save-form",function(e){			
			var error;
			var tracking_provider = jQuery("#tracking_provider");	
			var tracking_number = jQuery("#tracking_number");				
			
			if(tracking_provider.val() == '' ){				
				jQuery( "#select2-tracking_provider-container" ).closest( ".select2-selection" ).css( "border-color", "red" );
				error = true;
			} else {
				jQuery( "#select2-tracking_provider-container" ).closest( ".select2-selection" ).css( "border-color", "" );
			}
			if(tracking_number.val() == '' ){				
				tracking_number.css( "border-color", "red" );
				error = true;
			} else {
				var pattern = /^[0-9a-zA-Z- \b]+$/;	
				if(!pattern.test(tracking_number.val())){			
					tracking_number.css( "border-color", "red" );
					error = true;
				} else{
					tracking_number.css( "border-color", "" );
				}								
			}
						
			if(error == true){
				return false;
			}
		});		
		</script>
	<?php 
	}
	
	/*
	* Get formated order id
	*/
	public function get_formated_order_id( $order_id ) {
		
		if ( is_plugin_active( 'custom-order-numbers-for-woocommerce/custom-order-numbers-for-woocommerce.php' ) ) {
			$alg_wc_custom_order_numbers_enabled = get_option( 'alg_wc_custom_order_numbers_enabled' );
			$alg_wc_custom_order_numbers_prefix  = get_option( 'alg_wc_custom_order_numbers_prefix' );
			$new_order_id = str_replace( $alg_wc_custom_order_numbers_prefix, '', $order_id );
						
			if ( 'yes' == $alg_wc_custom_order_numbers_enabled ) {
				$args = array(
					'post_type'		=>	'shop_order',			
					'posts_per_page'    => '1',
					'meta_query'        => array(
						'relation' => 'AND', 
						array(
						'key'       => '_alg_wc_custom_order_number',
						'value'     => $new_order_id,
						),
					),
					'post_status' => array_keys( wc_get_order_statuses() ) , 	
				);
				$posts = get_posts( $args );
				$my_query = new WP_Query( $args );				
				
				if ( $my_query->have_posts() ) {
					while ( $my_query->have_posts()) {
						$my_query->the_post();
						if ( get_the_ID() ) {
							$order_id = get_the_ID();
						}									
					} // end while
				} // end if
				$order_id;
				wp_reset_postdata();	
			}			
		}		
		
		if ( is_plugin_active( 'woocommerce-sequential-order-numbers/woocommerce-sequential-order-numbers.php' ) ) {
						
			$s_order_id = wc_sequential_order_numbers()->find_order_by_order_number( $order_id );			
			if ( $s_order_id ) {
				$order_id = $s_order_id;
			}
		}
		
		if ( is_plugin_active( 'woocommerce-sequential-order-numbers-pro/woocommerce-sequential-order-numbers-pro.php' ) ) {
			
			// search for the order by custom order number
			$query_args = array(
				'numberposts' => 1,
				'meta_key'    => '_order_number_formatted',
				'meta_value'  => $order_id,
				'post_type'   => 'shop_order',
				'post_status' => 'any',
				'fields'      => 'ids',
			);
			
			$posts = get_posts( $query_args );			
			if ( !empty( $posts ) ) {
				list( $order_id ) = $posts;			
			}			
		}
		
		if ( is_plugin_active( 'woocommerce-jetpack/woocommerce-jetpack.php' ) ) {
			
			$wcj_order_numbers_enabled = get_option( 'wcj_order_numbers_enabled' );
			// Get prefix and suffix options
			$prefix = do_shortcode( get_option( 'wcj_order_number_prefix', '' ) );
			$prefix .= date_i18n( get_option( 'wcj_order_number_date_prefix', '' ) );
			$suffix = do_shortcode( get_option( 'wcj_order_number_suffix', '' ) );
			$suffix .= date_i18n( get_option( 'wcj_order_number_date_suffix', '' ) );
	
			// Ignore suffix and prefix from search input
			$search_no_suffix            = $order_id ? preg_replace( "/\A{$prefix}/i", '', $order_id ) : '';
			$search_no_suffix_and_prefix = $search_no_suffix ? preg_replace( "/{$suffix}\z/i", '', $search_no_suffix ) : '';
			$final_search                = empty( $search_no_suffix_and_prefix ) ? $search : $search_no_suffix_and_prefix;
			
			if ( 'yes' == $wcj_order_numbers_enabled ) {
				$query_args = array(
					'numberposts' => 1,
					'meta_key'    => '_wcj_order_number',
					'meta_value'  => $final_search,
					'post_type'   => 'shop_order',
					'post_status' => 'any',
					'fields'      => 'ids',
				);
				
				$posts = get_posts( $query_args );
				if ( !empty( $posts ) ) {	
					list( $order_id ) = $posts;			
				}			
			}
		}
		
		if ( is_plugin_active( 'wp-lister-amazon/wp-lister-amazon.php' ) ) {
			$wpla_use_amazon_order_number = get_option( 'wpla_use_amazon_order_number' );
			if ( 1 == $wpla_use_amazon_order_number ) {
				$query_args = array(
					'numberposts' => 1,
					'meta_key'    => '_wpla_amazon_order_id',
					'meta_value'  => $order_id,
					'post_type'   => 'shop_order',
					'post_status' => 'any',
					'fields'      => 'ids',
				);
				
				$posts = get_posts( $query_args );			
				if ( !empty( $posts ) ) {	
					list( $order_id ) = $posts;			
				}	
			}			
		}	
		
		if ( is_plugin_active( 'wp-lister/wp-lister.php' ) || is_plugin_active( 'wp-lister-for-ebay/wp-lister.php' ) ) {
			$args = array(
				'post_type'		=>	'shop_order',			
				'posts_per_page'    => '1',
				'meta_query'        => array(
					'relation' => 'OR', 
					array(
						'key'       => '_ebay_extended_order_id',
						'value'     => $order_id
					),
					array(
						'key'       => '_ebay_order_id',
						'value'     => $order_id
					),					
				),	
				'post_status' => 'any',	
			);
			
			$posts = get_posts( $args );
			$my_query = new WP_Query( $args );				
			
			if ( $my_query->have_posts() ) {
				while ( $my_query->have_posts() ) {
					$my_query->the_post();
					if ( get_the_ID() ) {
						$order_id = get_the_ID();
					}									
				} // end while
			} // end if
			wp_reset_postdata();
		}
		
		if ( is_plugin_active( 'yith-woocommerce-sequential-order-number-premium/init.php' ) ) {
			$query_args = array(
				'numberposts' => 1,
				'meta_key'    => '_ywson_custom_number_order_complete',
				'meta_value'  => $order_id,
				'post_type'   => 'shop_order',
				'post_status' => 'any',
				'fields'      => 'ids',
			);
			
			$posts = get_posts( $query_args );			
			if ( !empty( $posts ) ) {	
				list( $order_id ) = $posts;			
			}	
		}
		
		if ( is_plugin_active( 'wt-woocommerce-sequential-order-numbers/wt-advanced-order-number.php' ) ) {						
			$query_args = array(
				'numberposts' => 1,
				'meta_key'    => '_order_number',
				'meta_value'  => $order_id,
				'post_type'   => 'shop_order',
				'post_status' => 'any',
				'fields'      => 'ids',
			);
			
			$posts = get_posts( $query_args );			
			if ( !empty( $posts ) ) {
				list( $order_id ) = $posts;			
			}			
		}
		
		return apply_filters( 'ast_formated_order_id', $order_id );
	}
	
	/*
	* Return option value for customizer
	*/
	public function get_option_value_from_array( $array, $key, $default_value ) {
		
		$array_data = get_option( $array );	
		$value = '';
		
		if ( isset( $array_data[ $key ] ) ) {
			$value = $array_data[ $key ];		
			if ( '' != $value ) {
				return $value;
			}	
		}							
		
		if ( '' == $value ) {
			$value = $default_value;
		}	
				
		return $value;
	}
	
	/*
	* Return checkbox option value for customizer
	*/
	public function get_checkbox_option_value_from_array( $array, $key, $default_value ) {		
		
		$array_data = get_option( $array );	
		$value = '';
		
		if ( isset( $array_data[ $key ] ) ) {
			$value = $array_data[ $key ];
			return $value;
		}							
		
		if ( '' == $value ) {
			$value = $default_value;
		}	
				
		return $value;
	}
			
}