<?php
/**
 * PHP Restore MySQL Database
 * @author harisrozak and Modify for FHumanes
 */
global $debugCode;
$debugCode = true;  // Activar debug

custom_error(1,"Se inicia el proceso del Restore de la BD"); // To debug

// $file_restore = $params["file_restore"];

// Para cambiar cadenas que me dan problema en MySQL 9
$archivoEntrada =  __DIR__.'/backup_files/'.$params["file_restore"];
// Ruta del archivo temporal
$archivoSalida = tempnam(sys_get_temp_dir(), 'salida_');
// Leer el contenido del fichero
$contenido = file_get_contents($archivoEntrada);

// Reemplazar Cadenas para que carguen las Funciones
$contenido = str_replace('*/ ;;', '*/ ;', $contenido);
$contenido = str_replace(';;', ';', $contenido);
$contenido = str_replace('DELIMITER ;', '', $contenido);

// Guardar el resultado en el archivo temporal
file_put_contents($archivoSalida, $contenido);
$file_restore = $archivoSalida;

custom_error(2,"El fichero solicitado para el Restore es: ".$params["file_restore"]); // To debug
$_SESSION['db_file_restore'] = $file_restore;

$ResetDB = new ResetDB();

$message_user = '';

$message_user = $ResetDB->do_reset();

custom_error(4,"Se ha acabado el proceso de Recuperacion con: ".$message_user); // To debug

unset($_SESSION['db_file_restore']);

// Eliminar el archivo temporal
unlink($archivoSalida);

$debugCode = false;  // Desactivar debug

Class ResetDB
{	
	function __construct()
	{	
		$this->cred['host']	= $_SESSION['db_host'];
		$this->cred['user']	= $_SESSION['db_user'];
		$this->cred['passwd'] 	= $_SESSION['db_pwd'];
                $this->cred['port'] 	= $_SESSION['db_port'];
		$this->cred['dbName'] 	= $_SESSION['db_sys_dbname'];
		$this->cred['dumpdir'] 	= $_SESSION['db_file_restore'];
		$this->cred['prefix']	= "";
                
		$this->mysqli = new mysqli($this->cred['host'],$this->cred['user'],$this->cred['passwd'],$this->cred['dbName'],$this->cred['port']);
	}

	public function do_reset()
	{
		$connection = $this->connection();

		if($connection['status'])
		{
            $this->drop_tables();
            $this->restore_tables();

            return "Restore database finished! See file 'error.log' for detail";
		}
		else
		{
            return 'Error: '. $connection['message'];
		}
	}

	private function connection()
	{
        $return = array(
            'status' => true,
            'message' => 'Invalid credential'
        );

        // mysql connect check		
        if($this->mysqli->connect_errno) {
            $return['status'] = false;
            $return['message'] = "Connection failed: %s\n".$this->mysqli->connect_errno;			
        }

        return $return;
	}

	private function drop_tables()
	{
        $prefix = $this->cred['prefix']; // default wordpress
        $prefix_woo = $this->cred['prefix'].'woocommerce_'; // woocomerce

        $sql = "DROP TABLE IF EXISTS {$prefix}commentmeta,{$prefix}comments,{$prefix}links,
                {$prefix}options,{$prefix}postmeta,{$prefix}posts,{$prefix}terms,
                {$prefix}term_relationships,{$prefix}term_taxonomy,
                {$prefix}usermeta,{$prefix}users,
                {$prefix_woo}attribute_taxonomies,{$prefix_woo}downloadable_product_permissions,
                {$prefix_woo}order_itemmeta,{$prefix_woo}order_items,
                {$prefix_woo}tax_rates,{$prefix_woo}tax_rate_locations,
                {$prefix_woo}termmeta;";

        // $this->mysqli->query($sql) or die($this->mysqli->error);  // No tenemos Wordpress
	}

	private function restore_tables()
	{   
        // Leer todo el archivo SQL
        $sql = file_get_contents($this->cred['dumpdir']);

        if ($sql === false) {
                throw new Exception("No se pudo leer el archivo SQL");
        }
        try {
            // Ejecutar múltiples sentencias
            $this->mysqli->multi_query($sql);
            // Consumir todos los resultados
            do {
                if ($result = $this->mysqli->store_result()) {
                    custom_error(3,"Query:  ".$result); // To debug
                    $result->free();
                }
            } while ($this->mysqli->more_results() && $this->mysqli->next_result());
            $this->mysqli->close();
        } catch (Exception $e) {
            custom_error(5,"Error restaurando backup: " . $e->getMessage());  // TO DEBUG
             throw $e;      //Para que se pare la ejecución
        }
	}
}
