<?php

/**
 * Starts import products.
 *
 * @link       https://icopydoc.ru
 * @since      0.1.0
 * @version    0.8.4 (17-12-2025)
 *
 * @package    IP2VK
 * @subpackage IP2VK/includes
 */

/**
 * Starts import products.
 *
 * @package    IP2VK
 * @subpackage IP2VK/includes
 * @author     Maxim Glazunov <icopydoc@gmail.com>
 */
class IP2VK_Generation_XML {

	/**
	 * Feed ID.
	 * @var string
	 */
	protected $feed_id;

	/**
	 * Status sborki.
	 * @var int
	 */
	protected $status_sborki;

	/**
	 * Constructor.
	 * 
	 * @param string|int $feed_id
	 */
	public function __construct( $feed_id ) {

		$this->feed_id = (string) $feed_id;
		$this->status_sborki = (int) common_option_get(
			'status_sborki',
			-1,
			$this->get_feed_id(),
			'ip2vk'
		);

	}

	/**
	 * Run the import products.
	 * 
	 * @return void
	 */
	public function run() {

		$syncing_with_vk = common_option_get(
			'syncing_with_vk',
			'disabled',
			$this->get_feed_id(),
			'ip2vk'
		);
		if ( $syncing_with_vk === 'disabled' ) {
			common_option_upd(
				'status_sborki',
				'-1',
				'no',
				$this->get_feed_id(),
				'ip2vk'
			);
			new IP2VK_Error_Log( sprintf( 'GROUP № %1$s; %2$s; Файл: %3$s; %4$s: %5$s',
				$this->get_feed_id(),
				'Останавливаем сборку тк включён глобальный запрет на импорт',
				'class-ip2vk-generation-xml.php',
				__( 'line', 'import-products-to-vk' ),
				__LINE__
			) );
		}

		$step_export = (int) common_option_get(
			'step_export',
			'300',
			$this->get_feed_id(),
			'ip2vk'
		);

		// $last_element = (int)common_option_get('last_element', 0, $this->get_feed_id());	
		new IP2VK_Error_Log( sprintf( 'GROUP № %1$s; $this->get_status_sborki() = %2$s; Файл: %3$s; %4$s: %5$s',
			$this->get_feed_id(),
			$this->get_status_sborki(),
			'class-ip2vk-generation-xml.php',
			__( 'line', 'import-products-to-vk' ),
			__LINE__
		) );

		switch ( $this->get_status_sborki() ) {
			case -1:

				// импорт завершен
				new IP2VK_Error_Log( sprintf(
					'FEED #%1$s; `status_sborki` = -1. %2$s; %3$s: %4$s; %5$s: %6$s',
					$this->get_feed_id(),
					__( 'Just in case, we disable the CRON task', 'import-products-to-vk' ),
					__( 'File', 'import-products-to-vk' ),
					'class-ip2vk-generation-xml.php',
					__( 'Line', 'import-products-to-vk' ),
					__LINE__
				) );
				wp_clear_scheduled_hook( 'ip2vk_cron_sborki', [ $this->get_feed_id() ] );

				break;
			case 1:

				/**
				 * импорт начат. 
				 * на этом шаге мы:
				 *    - обнуляем счётчик обработанных элементов category
				 *    - обнуляем счётчик обработанных элементов offer
				 */

				new IP2VK_Error_Log( sprintf(
					'FEED #%1$s; INFO: %2$s 1. %3$s; %4$s: %5$s; %6$s: %7$s',
					$this->get_feed_id(),
					__( 'Step', 'import-products-to-vk' ),
					__( 'Preparing data for importing products', 'import-products-to-vk' ),
					__( 'File', 'import-products-to-vk' ),
					'class-ip2vk-import-xml.php',
					__( 'Line', 'import-products-to-vk' ),
					__LINE__
				) );

				$date_sborki_start = current_time( 'Y-m-d H:i' );
				common_option_upd(
					'ip2vk_date_sborki_start',
					$date_sborki_start,
					'no',
					$this->get_feed_id(),
					'ip2vk'
				);

				// обнуляем счётчик обработанных элементов category в фиде
				univ_option_upd(
					'ip2vk_last_element_category_feed_' . $this->get_feed_id(),
					0,
					'no'
				);

				// обнуляем счётчик обработанных элементов offer в фиде
				univ_option_upd(
					'ip2vk_last_element_offer_feed_' . $this->get_feed_id(),
					0,
					'no'
				);

				new IP2VK_Error_Log( 'FEED № ' . $this->get_feed_id() . '; Первый шаг. Импорт категорий. Файл: class-ip2vk-import-xml.php; Строка: ' . __LINE__ );
				$behavior_cats = common_option_get(
					'behavior_cats',
					'upd_once',
					$this->get_feed_id(),
					'ip2vk'
				);
				switch ( $behavior_cats ) {
					case 'upd_once':

						new IP2VK_Error_Log( 'FEED № ' . $this->get_feed_id() . '; NOTICE: $behavior_cats = upd_once. Обновляем категории и выставляем upd_off; Файл: class-ip2vk-import-xml.php; Строка: ' . __LINE__ );
						$this->run_api_categories_sync();
						common_option_upd(
							'behavior_cats',
							'upd_off',
							'no',
							$this->get_feed_id(),
							'ip2vk'
						);

						break;
					case 'upd_on':

						new IP2VK_Error_Log( 'FEED № ' . $this->get_feed_id() . '; NOTICE: $behavior_cats = upd_on. Обновляем категории; Файл: class-ip2vk-import-xml.php; Строка: ' . __LINE__ );
						$this->run_api_categories_sync();

						break;
					case 'upd_off':

						new IP2VK_Error_Log( 'FEED № ' . $this->get_feed_id() . '; NOTICE: $behavior_cats = upd_off. Категории обновлять не нужно; Файл: class-ip2vk-import-xml.php; Строка: ' . __LINE__ );

						break;
					default:

						$this->run_api_categories_sync();
						common_option_upd(
							'behavior_cats',
							'upd_off',
							'no',
							$this->get_feed_id(),
							'ip2vk'
						);
				}
				common_option_upd(
					'status_sborki',
					'2',
					'no',
					$this->get_feed_id(),
					'ip2vk'
				);

				break;
			default:
				new IP2VK_Error_Log( 'FEED № ' . $this->get_feed_id() . '; case default; Файл: class-ip2vk-generation-xml.php; Строка: ' . __LINE__ );

				if ( $this->get_status_sborki() == 2 ) {
					$offset = 0;
				} else if ( $this->get_status_sborki() == 3 ) {
					$offset = $step_export;
				} else {
					$offset = ( ( $this->get_status_sborki() - 1 ) * $step_export ) - $step_export;
				}
				$args = [
					'post_type' => 'product',
					'post_status' => 'publish',
					'posts_per_page' => $step_export,
					'offset' => $offset,
					'relation' => 'AND',
					'orderby' => 'ID'
				];
				$args = apply_filters( 'ip2vk_f_query_arg', $args, $this->get_feed_id() );
				new IP2VK_Error_Log( sprintf( 'GROUP № %1$s; %2$s $args =>; Файл: %3$s; %4$s: %5$s',
					$this->get_feed_id(),
					'Импорт всех товаров',
					'class-ip2vk-generation-xml.php',
					__( 'line', 'import-products-to-vk' ),
					__LINE__
				) );
				new IP2VK_Error_Log( $args );

				$featured_query = new \WP_Query( $args );
				$prod_id_arr = [];
				if ( $featured_query->have_posts() ) {
					for ( $i = 0; $i < count( $featured_query->posts ); $i++ ) {
						$prod_id_arr[ $i ]['ID'] = $featured_query->posts[ $i ]->ID;
						$prod_id_arr[ $i ]['post_modified_gmt'] = $featured_query->posts[ $i ]->post_modified_gmt;
					}
					wp_reset_query(); /* Remember to reset */
					unset( $featured_query ); // чутка освободим память					
					$this->run_api( $prod_id_arr );
					$this->status_sborki++;
					new IP2VK_Error_Log( 'FEED № ' . $this->get_feed_id() . '; status_sborki увеличен на ' . $step_export . ' и равен ' . $this->get_status_sborki() . '; Файл: class-ip2vk-generation-xml.php; Строка: ' . __LINE__ );
					common_option_upd(
						'status_sborki',
						$this->get_status_sborki(),
						'no',
						$this->get_feed_id(),
						'ip2vk'
					);
				} else { // если постов нет, останавливаем импорт
					$this->stop();
				}

			// end default
		} // end switch($this->get_status_sborki())
		return; // final return from public function phase()

	}

	/**
	 * Stop the import.
	 * 
	 * @param string $reason_stop
	 * 
	 * @return void
	 */
	public function stop( $reason_stop = 'success' ) {

		if ( 'once' === common_option_get(
			'run_cron',
			false,
			$this->get_feed_id(),
			'ip2vk' )
		) {
			// если был одноразовый импорт - переводим переключатель в `отключено`
			common_option_upd(
				'run_cron',
				'disabled',
				'no',
				$this->get_feed_id(),
				'ip2vk'
			);
		}
		$this->set_status_sborki( -1 );
		wp_clear_scheduled_hook( 'ip2vk_cron_sborki', [ $this->get_feed_id() ] );
		do_action( 'ip2vk_after_import', $this->get_feed_id(), $reason_stop );

	}

	/**
	 * Set and save status sborki.
	 * 
	 * @param int $status_sborki
	 * 
	 * @return void
	 */
	private function set_status_sborki( $status_sborki ) {

		common_option_upd(
			'ip2vk_status_sborki',
			(string) $status_sborki,
			'no',
			$this->get_feed_id(),
			'ip2vk'
		);
		$this->status_sborki = (int) $status_sborki;

	}

	/**
	 * Run API.
	 * 
	 * @param array $ids_arr
	 * 
	 * @return void
	 */
	public function run_api( $ids_arr ) {

		$api = new IP2VK_Api();
		for ( $i = 0; $i < count( $ids_arr ); $i++ ) {
			$product_id = (int) $ids_arr[ $i ]['ID'];
			$answer_arr = $api->product_sync( $product_id );
			if ( true === $answer_arr['status'] ) {
				new IP2VK_Error_Log( sprintf(
					'FEED #%1$s; SUCCESS: %2$s ID = %3$s %4$s; %5$s: %6$s; %7$s: %8$s',
					$this->get_feed_id(),
					__( 'The product with', 'import-products-to-vk' ),
					$product_id,
					__( 'was successfully imported', 'import-products-to-vk' ),
					__( 'File', 'import-products-to-vk' ),
					'class-ip2vk-import-xml.php',
					__( 'Line', 'import-products-to-vk' ),
					__LINE__
				) );
			} else {
				new IP2VK_Error_Log( sprintf(
					'FEED #%1$s; ERROR: %2$s ID = %3$s; %4$s: %5$s; %6$s: %7$s',
					$this->get_feed_id(),
					__( 'Error when importing a product with', 'import-products-to-vk' ),
					$product_id,
					__( 'File', 'import-products-to-vk' ),
					'class-ip2vk-import-xml.php',
					__( 'Line', 'import-products-to-vk' ),
					__LINE__
				) );
			}
		}

	}

	/**
	 * Runs importing categories.
	 * 
	 * @return void
	 */
	public function run_api_categories_sync() {

		$api = new IP2VK_Api();
		$product_cat_arr = get_terms( [
			'taxonomy' => 'product_cat',
			'orderby' => 'name',
			'hide_empty' => false
		] );
		if ( $product_cat_arr ) {
			new IP2VK_Error_Log( 'FEED № ' . $this->get_feed_id() . '; Категории на сайте есть. Приступим к созданию каталогов; Файл: class-ip2vk-generation-xml.php; Строка: ' . __LINE__ );
			foreach ( $product_cat_arr as $category ) {
				if ( get_term_meta( $category->term_id, 'thumbnail_id', true ) == '' ) {
					$args_arr = [
						'category_name' => $category->name
					];
				} else {
					$category_thumbnail_id = get_term_meta( $category->term_id, 'thumbnail_id', true );
					$fullsize_path = get_attached_file( $category_thumbnail_id );
					$args_arr = [
						'category_name' => $category->name,
						'category_pic_url' => $fullsize_path,
						'category_pic_id' => $category_thumbnail_id
					];
				}
				$answer_arr = $api->category_sync( $category->term_id, $args_arr );
				if ( true === $answer_arr['status'] ) {
					// категория успешно импортирована					
				} else {
					new IP2VK_Error_Log( sprintf( 'GROUP № %1$s; ERROR: %2$s %3$s; Файл: %4$s; %5$s: %6$s',
						$this->get_feed_id(),
						'Не получилось добавить категорию с $category->term_id =',
						$category->term_id,
						'class-ip2vk-generation-xml.php',
						__( 'line', 'import-products-to-vk' ),
						__LINE__
					) );
				}

				/* для тестов раскоментить break ниже */
				// break;
			}
		}

	}

	/**
	 * Get feed ID
	 * 
	 * @return string
	 */
	protected function get_feed_id() {
		return $this->feed_id;
	}

	/**
	 * Get status sborki.
	 * 
	 * @return string
	 */
	protected function get_status_sborki() {
		return $this->status_sborki;
	}

}