#!/usr/bin/env python3

import subprocess
import time
import os
import sys
from pathlib import Path

def get_file_size(filepath):
    """Получить размер файла в байтах"""
    return os.path.getsize(filepath)

def format_size(size_bytes):
    """Конвертировать байты в человеко-читаемый формат"""
    for unit in ['B', 'KB', 'MB', 'GB']:
        if size_bytes < 1024.0:
            return f"{size_bytes:.1f} {unit}"
        size_bytes /= 1024.0
    return f"{size_bytes:.1f} TB"

def run_compression(input_file, level):
    """Запустить сжатие с заданной степенью и вернуть время и размер"""
    output_file = f"{input_file}.zstd-{level}"
    
    start_time = time.time()
    
    try:
        # Запускаем zstd с указанной степенью сжатия
        subprocess.run(
            ['zstd', f'-{level}', input_file, '-o', output_file ],
            check=True,
            capture_output=True,
            text=True
        )
    except subprocess.CalledProcessError as e:
        print(f"Ошибка при сжатии с уровнем {level}: {e.stderr}")
        return None, None
    
    end_time = time.time()
    elapsed_time = end_time - start_time
    
    archive_size = get_file_size(output_file)
    
    # Опционально: удалить архив после измерения
    # os.remove(output_file)
    
    return elapsed_time, archive_size

def main():
    input_file = "47news.mysql"
    
    # Проверяем существование файла
    if not Path(input_file).exists():
        print(f"Ошибка: файл {input_file} не найден!")
        sys.exit(1)
    
    # Получаем исходный размер
    original_size = get_file_size(input_file)
    
    # Заголовок таблицы
    print(f"\n{'Степень':<8} {'Время (сек)':<12} {'Размер':<12} {'Коэфф. сжатия':<15} {'Эффективность':<15}")
    print("-" * 70)
    
    results = []
    
    # Прогоняем для степеней сжатия 1-19
    for level in range(1, 20):
        elapsed_time, archive_size = run_compression(input_file, level)
        
        if elapsed_time is None:
            continue
        
        compression_ratio = original_size / archive_size
        efficiency = compression_ratio / elapsed_time
        
        results.append({
            'level': level,
            'time': elapsed_time,
            'size': archive_size,
            'ratio': compression_ratio,
            'efficiency': efficiency
        })
        
        # Выводим строку таблицы
        print(f"{level:<8} {elapsed_time:<12.2f} {format_size(archive_size):<12} {compression_ratio:<15.2f} {efficiency:<15.2f}")
    
    # Выводим итоговую информацию
    print("\n" + "="*70)
    print(f"Исходный файл: {input_file}")
    print(f"Исходный размер: {format_size(original_size)} ({original_size:,} байт)")
    print("="*70)
    
    # Находим лучший результат по эффективности
    if results:
        best_efficiency = max(results, key=lambda x: x['efficiency'])
        print(f"\nЛучшая эффективность (коэфф.сжатия/время):")
        print(f"  Степень сжатия: {best_efficiency['level']}")
        print(f"  Время: {best_efficiency['time']:.2f} сек")
        print(f"  Размер: {format_size(best_efficiency['size'])}")
        print(f"  Коэффициент сжатия: {best_efficiency['ratio']:.2f}")
        print(f"  Эффективность: {best_efficiency['efficiency']:.2f}")

if __name__ == "__main__":
    main()