<?php
/**
 * Install pre-built websites remote API
 *
 * @package Betheme
 * @author Muffin group
 * @link https://muffingroup.com
 */

if ( ! defined( 'ABSPATH' ) ){
	exit;
}

class Mfn_Importer_API extends Mfn_API {

	public $code = '';
	public $demo = '';

	public $path_be	= '';
	public $path_websites	= '';
	public $path_demo = '';

	/**
	 * The constructor
	 */
	public function __construct( $demo = false ){

		if( ! $demo ){
			return false;
		}

		$this->code = mfn_get_purchase_code();
		$this->demo = $demo;

		$upload_dir = wp_upload_dir();
		$this->path_be = wp_normalize_path( $upload_dir['basedir'] .'/betheme' );
		$this->path_websites = wp_normalize_path( $this->path_be .'/websites' );

		$this->make_dir();
	}

	/**
	 * Directories creation
	 */
	public function make_dir(){

		$this->path_demo = wp_normalize_path( $this->path_websites .'/'. $this->demo );

		if( ! file_exists( $this->path_be ) ){
			wp_mkdir_p( $this->path_be );
		}

		if( ! file_exists( $this->path_websites ) ){
			wp_mkdir_p( $this->path_websites );
		}

		if( ! file_exists( $this->path_demo ) ){
			wp_mkdir_p( $this->path_demo );
		}
	}

	/**
	 * Delete temporary directory
	 */
	public function delete_temp_dir(){

		// filesystem
		$wp_filesystem = Mfn_Helper::filesystem();

		// director is located outside wp uploads dir
		$upload_dir = wp_upload_dir();
		if( false === strpos( $this->path_demo, $upload_dir['basedir'] ) ){
			return false;
		}

		$wp_filesystem->delete( $this->path_demo, true );
	}

	/**
	 * Remote get demo
	 */
	public function remote_get_demo(){

		$args = array(
			'code' => $this->code,
			'demo' => $this->demo,
		);

		if( mfn_is_hosted() ){
			$args[ 'ish' ] = mfn_get_ish();
		}

		$url = add_query_arg( $args, $this->get_url( 'websites_download' ) );

		$args = array(
			'user-agent' 	=> 'WordPress/'. get_bloginfo( 'version' ) .'; '. network_site_url(),
			'timeout' 		=> 30,
		);

		$response = wp_remote_get( $url, $args );

		if( is_wp_error( $response ) ){
			return $response;
		}

		$body = wp_remote_retrieve_body( $response );

		// remote get fallback
		if( empty( $body ) ){
			if( function_exists( 'ini_get' ) && ini_get( 'allow_url_fopen' ) ){
				$body = @file_get_contents( $url );
			}
		}

		if( empty( $body ) ){
			return new WP_Error( 'error_download', __( 'The package could not be downloaded.', 'mfn-opts' ) );
		}

		if( $json = json_decode( $body, true ) ){
			if( isset( $json['error'] ) ){
				return new WP_Error( 'invalid_response', $json['error'] );
			}
		}

		// filesystem
		$wp_filesystem = Mfn_Helper::filesystem();

		$path_zip = wp_normalize_path( $this->path_demo .'/'. $this->demo .'.zip' );
		$path_unzip = wp_normalize_path( $this->path_demo .'/'. $this->demo );

		if( ! $wp_filesystem->put_contents( $path_zip, $body, FS_CHMOD_FILE ) ){

			// put_contents fallback
			@unlink( $path_zip );
			$fp = @fopen( $path_zip, 'w' );
			$fwrite = @fwrite( $fp, $body );
			@fclose( $fp );
			if( false === $fwrite ){
				return new WP_Error( 'error_fs', __( 'WordPress filesystem error.', 'mfn-opts' ) );
			}

		}

		$unzip = unzip_file( $path_zip, $this->path_demo );

		// fallback for WordPress unzip

		$path_content = $path_unzip .'/content.xml.gz';

		if( ! $wp_filesystem->exists( $path_content )
			|| ( $wp_filesystem->exists( $path_content ) && ! $wp_filesystem->get_contents( $path_content ) ) ){

			$wp_filesystem->delete( $path_unzip, true );

			$zip = new ZipArchive;

	    if ( $zip->open( $path_zip ) === TRUE ) {
        $zip->extractTo( $this->path_demo );
        $zip->close();
	    }
		}

    // end: fallback for WordPress unzip

		if( is_wp_error( $unzip ) ){
			return new WP_Error( 'error_unzip', __( 'The package could not be unziped.', 'mfn-opts' ) );
		}

		if( ! is_dir( $path_unzip ) ) {
			return new WP_Error( 'error_folder', sprintf( __( 'Demo data folder does not exist (%s).', 'mfn-opts' ), $path_unzip ) );
		}

		return $path_unzip;
	}

}
