/*
en js tengo algo asi
async function generateServerAudioHash(file) {
    logHash("Solicitando hash de audio al servidor:", file.name);

    const formData = new FormData();
    formData.append('action', 'recalcularHash');
    formData.append('audio_file', file);

    try {
        const response = await fetch(ajax_url, {
            method: 'POST',
            body: formData
        });

        if (!response.ok) {
            throw new Error('Error en la respuesta del servidor');
        }

        const result = await response.json();
        
        if (result.success && result.data.hash) {
            logHash("Hash de audio recibido del servidor exitosamente:", result.data.hash);
            return result.data.hash;
        } else {
            throw new Error(result.data.message || 'Error generando hash de audio');
        }
    } catch (error) {
        logHash("Error generando hash de audio en el servidor, usando hash local:", error.message);

        // En caso de error, usar el hash normal como fallback
        try {
            logHash("Generando hash local como fallback para archivo de audio:", file.name);
            const buffer = await file.arrayBuffer();
            const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
            const hashArray = Array.from(new Uint8Array(hashBuffer));
            const hash = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
            logHash("Hash local generado exitosamente como fallback:", hash);
            return hash;
        } catch (localError) {
            logHash("Error generando hash local como fallback:", localError.message);
            throw localError;
        }
    }
}
*/

//esta es la funcion que calcula el hash, no se puede alterar porque funciona para otras cosas pero hay que hacer que soporte el ajax y que funcione bien
function recalcularHash($audio_file_path)
{
    try {
        // Verificaciones iniciales
        if (!is_string($audio_file_path) || empty($audio_file_path)) {
            throw new Exception("Ruta de archivo inválida: " . $audio_file_path);
        }

        $file_path = $audio_file_path;

        // Verificaciones de archivo
        if (!file_exists($file_path)) {
            throw new Exception("Archivo no encontrado: " . $file_path);
        }

        if (!is_readable($file_path)) {
            $output = shell_exec('sudo /var/www/wordpress/wp-content/themes/2upra3v/app/Commands/permisos.sh 2>&1');
            throw new Exception("No hay permisos de lectura para el archivo: " . $file_path);
        }

        if (!file_exists(WRAPPER_SCRIPT_PATH)) {
            throw new Exception("Script wrapper no encontrado en: " . WRAPPER_SCRIPT_PATH);
        }

        if (!is_executable(WRAPPER_SCRIPT_PATH)) {
            throw new Exception("Script wrapper no tiene permisos de ejecución: " . WRAPPER_SCRIPT_PATH);
        }

        $command = escapeshellarg(WRAPPER_SCRIPT_PATH) . ' ' . escapeshellarg($file_path);


        $descriptorspec = array(
            0 => array("pipe", "r"),
            1 => array("pipe", "w"),
            2 => array("pipe", "w")
        );

        $process = proc_open($command, $descriptorspec, $pipes);

        if (!is_resource($process)) {
            throw new Exception("No se pudo iniciar el proceso");
        }

        $output = stream_get_contents($pipes[1]);
        $error = stream_get_contents($pipes[2]);

        foreach ($pipes as $pipe) {
            fclose($pipe);
        }

        $return_value = proc_close($process);

        if ($return_value !== 0) {
            throw new Exception("Error en el proceso Python: " . $error);
        }

        $hash = trim($output);
        if (!preg_match('/^[a-f0-9]{64}$/', $hash)) {
            throw new Exception("Hash inválido generado: " . $output);
        }

        return $hash;
    } catch (Exception $e) {
        $output = shell_exec('sudo /var/www/wordpress/wp-content/themes/2upra3v/app/Commands/permisos.sh 2>&1');
        return false;
    }
}