<?php
/**
 * Class for declaring the content importer used in the One Click Demo Import plugin
 *
 * @package ocdi
 */

namespace ColibriWP\PageBuilder\OCDI;

class Importer {
    /**
     * The instance of the OCDI\Logger class.
     *
     * @var object
     */
    public $logger;
    /**
     * The importer class object used for importing content.
     *
     * @var object
     */
    private $importer;
    /**
     * Time in milliseconds, marking the beginning of the import.
     *
     * @var float
     */
    private $microtime;
    /**
     * The instance of the One Click Demo Import class.
     *
     * @var object
     */
    private $ocdi;

    /**
     * Constructor method.
     *
     * @param array $importer_options Importer options.
     * @param object $logger Logger object used in the importer.
     */
    public function __construct( $importer_options = array(), $logger = null ) {
        // Include files that are needed for WordPress Importer v2.
        $this->include_required_files();

        // Set the WordPress Importer v2 as the importer used in this plugin.
        // More: https://github.com/humanmade/WordPress-Importer.
        $this->importer = new WXRImporter( $importer_options );

        // Set logger to the importer.
        $this->logger = $logger;
        if ( ! empty( $this->logger ) ) {
            $this->set_logger( $this->logger );
        }

        // Get the OCDI (main plugin class) instance.
        $this->ocdi = OneClickDemoImport::get_instance();
    }


    /**
     * Include required files.
     */
    private function include_required_files() {
        if ( ! class_exists( '\WP_Importer' ) ) {
            require ABSPATH . '/wp-admin/includes/class-wp-importer.php';
        }
    }

    /**
     * Set the logger used in the import
     *
     * @param object $logger logger instance.
     */
    public function set_logger( $logger ) {
        $this->importer->set_logger( $logger );
    }

    /**
     * Sets all protected variables from the WXR_Importer needed for continuing the import.
     *
     * @param array $data with set variables.
     */
    public function set_importer_data( $data ) {
        $this->importer->set_importer_data( $data );
    }

    /**
     * Import content from an WP XML file.
     *
     * @param string $import_file_path Path to the import file.
     */
    public function import_content( $import_file_path ) {
        $this->microtime = microtime( true );

        // Increase PHP max execution time. Just in case, even though the AJAX calls are only 25 sec long.
        set_time_limit( apply_filters( 'extendthemes-ocdi/set_time_limit_for_demo_data_import', 300 ) );

        // Disable import of authors.
        add_filter( 'wxr_importer.pre_process.user', '__return_false' );

        // Check, if we need to send another AJAX request and set the importing author to the current user.
        add_filter( 'wxr_importer.pre_process.post', array( $this, 'new_ajax_request_maybe' ) );

        // Disables generation of multiple image sizes (thumbnails) in the content import step.
        if ( ! apply_filters( 'extendthemes-ocdi/regenerate_thumbnails_in_content_import', true ) ) {
            add_filter( 'intermediate_image_sizes_advanced', '__return_null' );
        }

        // Import content.
        if ( ! empty( $import_file_path ) ) {
            ob_start();
            $this->import( $import_file_path );
            $message = ob_get_clean();
        }

        // Return any error messages for the front page output (errors, critical, alert and emergency level messages only).
        return $this->logger->error_output;
    }

    /**
     * Imports content from a WordPress export file.
     *
     * @param string $data_file path to xml file, file with WordPress export data.
     */
    public function import( $data_file ) {

        add_action( 'http_api_curl', function ( $ch ) {
            curl_setopt( $ch, CURLOPT_ENCODING, 'gzip' );
        } );

        $this->importer->import( $data_file );
    }

    /**
     * Check if we need to create a new AJAX request, so that server does not timeout.
     *
     * @param array $data current post data.
     *
     * @return array
     */
    public function new_ajax_request_maybe( $data ) {
        $time = microtime( true ) - $this->microtime;

        // We should make a new ajax call, if the time is right.
        if ( $time > apply_filters( 'extendthemes-ocdi/time_for_one_ajax_call', 25 ) ) {
            $response = array(
                'status'  => 'newAJAX',
                'message' => 'Time for new AJAX request!: ' . $time,
            );

            // Add any output to the log file and clear the buffers.
            $message = ob_get_clean();

            // Add any error messages to the frontend_error_messages variable in OCDI main class.
            if ( ! empty( $message ) ) {
                $this->ocdi->append_to_frontend_error_messages( $message );
            }

            // Add message to log file.
            $log_added = Helpers::append_to_file(
                __( 'New AJAX call!', 'colibri-page-builder' ) . PHP_EOL . $message,
                $this->ocdi->get_log_file_path(),
                ''
            );

            // Set the current importer stat, so it can be continued on the next AJAX call.
            $this->set_current_importer_data();

            // Send the request for a new AJAX call.
            wp_send_json( $response );
        }

        // Set importing author to the current user.
        // Fixes the [WARNING] Could not find the author for ... log warning messages.
        $current_user_obj    = wp_get_current_user();
        $data['post_author'] = $current_user_obj->user_login;

        return $data;
    }

    /**
     * Set current state of the content importer, so we can continue the import with new AJAX request.
     */
    private function set_current_importer_data() {
        $data = array_merge( $this->ocdi->get_current_importer_data(), $this->get_importer_data() );

        Helpers::set_ocdi_import_data_transient( $data );
    }

    /**
     * Get all protected variables from the WXR_Importer needed for continuing the import.
     */
    public function get_importer_data() {
        return $this->importer->get_importer_data();
    }
}
