#!/usr/bin/env python3.11
import os
import hashlib
from pathlib import Path

# Директории для сканирования
TARGET_DIRS = [
    Path("/home/dayhanbiz/public_html/3-damja.science/depository/Библиотека водника, агрария и мелиоратора (ВАМ)"),
    Path("/home/dayhanbiz/public_html/3-damja.science/depository/Необработанные поступления")
]

# Форматы для обработки (если нужно проверить вообще ВСЕ файлы — можно расширить)
EXTENSIONS = {'.pdf', '.djvu', '.fb2', '.txt', '.doc', '.docx', '.rtf', '.xls', '.xlsx', '.ppt', '.pptx', '.epub', '.jpg', '.jpeg', '.png', '.tiff'}

def calculate_sha256(file_path: Path, chunk_size: int = 65536) -> str:
    """Вычисляет SHA-256 хэш файла по частям (память не переполняется даже на гигабайтных файлах)."""
    hasher = hashlib.sha256()
    try:
        with open(file_path, 'rb') as f:
            while chunk := f.read(chunk_size):
                hasher.update(chunk)
        return hasher.hexdigest()
    except Exception as e:
        print(f"   [ОШИБКА ЧТЕНИЯ] {file_path.name}: {e}")
        return ""

def remove_duplicates():
    seen_hashes = {}
    total_scanned = 0
    total_duplicates = 0
    freed_bytes = 0

    print("=== ЗАПУСК ПОИСКА И УДАЛЕНИЯ ДУБЛИКАТОВ ===\n")

    for target_dir in TARGET_DIRS:
        if not target_dir.exists():
            print(f"[ПРОПУСК] Папка не найдена: {target_dir}")
            continue

        print(f"Сканирование: {target_dir}")
        
        # Рекурсивный обход всех поддиректорий
        for file_path in target_dir.rglob('*'):
            if file_path.is_file() and not file_path.name.startswith('.'):
                if file_path.suffix.lower() in EXTENSIONS:
                    total_scanned += 1
                    file_hash = calculate_sha256(file_path)
                    
                    if not file_hash:
                        continue

                    if file_hash in seen_hashes:
                        # Найдена копия!
                        original_path = seen_hashes[file_hash]
                        file_size = file_path.stat().st_size
                        
                        print(f"\n[ДУБЛИКАТ НАЙДЕН]")
                        print(f"   Удаляем:  {file_path}")
                        print(f"   Оригинал: {original_path}")
                        
                        try:
                            file_path.unlink()
                            total_duplicates += 1
                            freed_bytes += file_size
                            print("   Status: Успешно удален.")
                        except Exception as e:
                            print(f"   Status: Ошибка при удалении ({e})")
                    else:
                        # Сохраняем оригинал
                        seen_hashes[file_hash] = file_path

    freed_mb = freed_bytes / (1024 * 1024)
    print("\n================ ИТОГИ ================")
    print(f"Всего проверено файлов: {total_scanned}")
    print(f"Удалено дубликатов:     {total_duplicates}")
    print(f"Освобождено места:      {freed_mb:.2f} MB")
    print("=======================================")

if __name__ == "__main__":
    remove_duplicates()
