<?php
/**
 * The import/export class.
 *
 * @since      	1.8.2
 */
namespace LiteSpeed;

defined( 'WPINC' ) || exit;

class Import extends Base {
	protected $_summary;

	const TYPE_IMPORT = 'import';
	const TYPE_EXPORT = 'export';
	const TYPE_RESET = 'reset';

	/**
	 * Init
	 *
	 * @since  1.8.2
	 */
	public function __construct() {
		Debug2::debug( 'Import init' );

		$this->_summary = self::get_summary();
	}

	/**
	 * Export settings to file
	 *
	 * @since  1.8.2
	 * @access public
	 */
	public function export( $only_data_return = false ) {
		$raw_data = $this->get_options( true );

		$data = array();
		foreach ( $raw_data as $k => $v ) {
			$data[] = json_encode( array( $k, $v ) );
		}

		$data = implode( "\n\n", $data );

		if ( $only_data_return ) {
			return $data;
		}

		$filename = $this->_generate_filename();

		// Update log
		$this->_summary[ 'export_file' ] = $filename;
		$this->_summary[ 'export_time' ] = time();
		self::save_summary();

		Debug2::debug( 'Import: Saved to ' . $filename );

		@header( 'Content-Disposition: attachment; filename=' . $filename );
		echo $data;

		exit;
	}

	/**
	 * Import settings from file
	 *
	 * @since  1.8.2
	 * @access public
	 */
	public function import( $file = false ) {
		if ( ! $file ) {
			if ( empty( $_FILES[ 'ls_file' ][ 'name' ] ) || substr( $_FILES[ 'ls_file' ][ 'name' ], -5 ) != '.data' || empty( $_FILES[ 'ls_file' ][ 'tmp_name' ] ) ) {
				Debug2::debug( 'Import: Failed to import, wront ls_file' );

				$msg = __( 'Import failed due to file error.', 'litespeed-cache' );
				Admin_Display::error( $msg );

				return false;
			}

			$this->_summary[ 'import_file' ] = $_FILES[ 'ls_file' ][ 'name' ];

			$data = file_get_contents( $_FILES[ 'ls_file' ][ 'tmp_name' ] );
		}
		else {
			$this->_summary[ 'import_file' ] = $file;

			$data = file_get_contents( $file );
		}

		// Update log
		$this->_summary[ 'import_time' ] = time();
		self::save_summary();

		$ori_data = array();
		try {
			// Check if the data is v4+ or not
			if ( strpos( $data, '["_version",' ) === 0 ) {
				Debug2::debug( '[Import] Data version: v4+' );
				$data = explode( "\n", $data );
				foreach ( $data as $v ) {
					$v = trim( $v );
					if ( ! $v ) {
						continue;
					}
					list( $k, $v ) = json_decode( $v, true );
					$ori_data[ $k ] = $v;
				}
			}
			else {
				$ori_data = json_decode( base64_decode( $data ), true );
			}
		} catch ( \Exception $ex ) {
			Debug2::debug( '[Import] ❌ Failed to parse serialized data' );
			return false;
		}

		if ( ! $ori_data ) {
			Debug2::debug( '[Import] ❌ Failed to import, no data' );
			return false;
		}
		else {
			Debug2::debug( '[Import] Importing data', $ori_data );
		}

		$this->cls( 'Conf' )->update_confs( $ori_data );


		if ( ! $file ) {
			Debug2::debug( 'Import: Imported ' . $_FILES[ 'ls_file' ][ 'name' ] );

			$msg = sprintf( __( 'Imported setting file %s successfully.', 'litespeed-cache' ), $_FILES[ 'ls_file' ][ 'name' ] );
			Admin_Display::succeed( $msg );
		}
		else {
			Debug2::debug( 'Import: Imported ' . $file );
		}

		return true;

	}

	/**
	 * Reset all configs to default values.
	 *
	 * @since  2.6.3
	 * @access public
	 */
	public function reset() {
		$options = $this->cls( 'Conf' )->load_default_vals();

		$this->cls( 'Conf' )->update_confs( $options );

		Debug2::debug( '[Import] Reset successfully.' );

		$msg = __( 'Reset successfully.', 'litespeed-cache' );
		Admin_Display::succeed( $msg );

	}

	/**
	 * Generate the filename to export
	 *
	 * @since  1.8.2
	 * @access private
	 */
	private function _generate_filename() {
		// Generate filename
		$parsed_home = parse_url( get_home_url() );
		$filename = 'LSCWP_cfg-';
		if ( ! empty( $parsed_home[ 'host' ] ) ) {
			$filename .= $parsed_home[ 'host' ] . '_';
		}

		if ( ! empty( $parsed_home[ 'path' ] ) ) {
			$filename .= $parsed_home[ 'path' ] . '_';
		}

		$filename = str_replace( '/', '_', $filename );

		$filename .= '-' . date( 'Ymd_His' ) . '.data';

		return $filename;
	}

	/**
	 * Handle all request actions from main cls
	 *
	 * @since  1.8.2
	 * @access public
	 */
	public function handler() {
		$type = Router::verify_type();

		switch ( $type ) {
			case self::TYPE_IMPORT:
				$this->import();
				break;

			case self::TYPE_EXPORT:
				$this->export();
				break;

			case self::TYPE_RESET:
				$this->reset();
				break;

			default:
				break;
		}

		Admin::redirect();
	}

}
