"""
TextCompressionOptimizer
Generated by Eden via recursive self-improvement
2025-11-01 04:39:19.649174
"""

import gzip
import bz2
import zlib
from typing import Union

def compress_text(text: str, algorithm: str = 'gzip') -> bytes:
    """
    Compresses the given text using the specified compression algorithm.
    
    Parameters:
    - text (str): The input text to be compressed.
    - algorithm (str): The compression algorithm to use. Options are 'gzip', 'bz2', and 'zlib'.
                       Default is 'gzip'.

    Returns:
    - bytes: The compressed data as a byte string.

    Raises:
    - ValueError: If an unsupported algorithm is provided.
    """
    
    if algorithm == 'gzip':
        return gzip.compress(text.encode('utf-8'))
    elif algorithm == 'bz2':
        return bz2.compress(text.encode('utf-8'))
    elif algorithm == 'zlib':
        return zlib.compress(text.encode('utf-8'))
    else:
        raise ValueError(f"Unsupported compression algorithm: {algorithm}")

def decompress_text(compressed_data: bytes, algorithm: str = 'gzip') -> str:
    """
    Decompresses the given compressed data using the specified algorithm.
    
    Parameters:
    - compressed_data (bytes): The input compressed data as a byte string.
    - algorithm (str): The compression algorithm used to compress the original text. Options are
                       'gzip', 'bz2', and 'zlib'. Default is 'gzip'.

    Returns:
    - str: The decompressed text.

    Raises:
    - ValueError: If an unsupported algorithm is provided or if the input data cannot be decompressed.
    """
    
    if algorithm == 'gzip':
        try:
            return gzip.decompress(compressed_data).decode('utf-8')
        except OSError as e:
            raise ValueError("Decompression failed with gzip") from e
    elif algorithm == 'bz2':
        try:
            return bz2.decompress(compressed_data).decode('utf-8')
        except OSError as e:
            raise ValueError("Decompression failed with bz2") from e
    elif algorithm == 'zlib':
        try:
            return zlib.decompress(compressed_data).decode('utf-8')
        except OSError as e:
            raise ValueError("Decompression failed with zlib") from e
    else:
        raise ValueError(f"Unsupported compression algorithm: {algorithm}")

def calculate_compression_ratio(original_text: str, compressed_data: bytes) -> float:
    """
    Calculates the compression ratio of the given text after it has been compressed.

    Parameters:
    - original_text (str): The original input text.
    - compressed_data (bytes): The compressed data as a byte string.

    Returns:
    - float: The compression ratio, where 1.0 means no compression and values closer to 0 indicate better compression.
    """
    
    original_size = len(original_text.encode('utf-8'))
    compressed_size = len(compressed_data)
    return (original_size - compressed_size) / original_size

# Example usage
if __name__ == "__main__":
    text = "This is a sample text for demonstration purposes. It is used to showcase the TextCompressionOptimizer capability."
    
    # Compress with gzip
    compressed_gzip = compress_text(text, algorithm='gzip')
    print(f"GZIP Compressed Data: {compressed_gzip}")
    
    # Decompress and calculate compression ratio
    decompressed_gzip = decompress_text(compressed_gzip)
    print(f"Decompressed Text (GZIP): {decompressed_gzip}")
    gzip_ratio = calculate_compression_ratio(text, compressed_gzip)
    print(f"GZIP Compression Ratio: {gzip_ratio:.2f}")
    
    # Compress with bz2
    compressed_bz2 = compress_text(text, algorithm='bz2')
    print(f"BZ2 Compressed Data: {compressed_bz2}")
    
    # Decompress and calculate compression ratio
    decompressed_bz2 = decompress_text(compressed_bz2)
    print(f"Decompressed Text (BZ2): {decompressed_bz2}")
    bz2_ratio = calculate_compression_ratio(text, compressed_bz2)
    print(f"BZ2 Compression Ratio: {bz2_ratio:.2f}")
    
    # Compress with zlib
    compressed_zlib = compress_text(text, algorithm='zlib')
    print(f"ZLIB Compressed Data: {compressed_zlib}")
    
    # Decompress and calculate compression ratio
    decompressed_zlib = decompress_text(compressed_zlib)
    print(f"Decompressed Text (ZLIB): {decompressed_zlib}")
    zlib_ratio = calculate_compression_ratio(text, compressed_zlib)
    print(f"ZLIB Compression Ratio: {zlib_ratio:.2f}")
