#!/usr/bin/env python3
"""
Извлечение blob данных (фотографий) из tblEMEntity
"""
import sys
import binascii
from pathlib import Path

print("=== ИЗВЛЕЧЕНИЕ BLOB ДАННЫХ (ФОТОГРАФИЙ) ===\n")

dumps_dir = Path('/root/dumps/50.21.183.111')
output_dir = dumps_dir / 'extracted_photos'
output_dir.mkdir(exist_ok=True)

print(f"Директория для извлечения: {output_dir}\n")

total_photos = 0
dbs_with_photos = []

# Проходим по всем базам данных
for db_dir in sorted(dumps_dir.iterdir()):
    if not db_dir.is_dir():
        continue
    
    entity_file = db_dir / 'tblEMEntity.dat'
    if not entity_file.exists():
        continue
    
    print(f"Обработка {db_dir.name}...")
    
    try:
        with open(entity_file, 'r', encoding='utf-8', errors='ignore') as f:
            # Пропускаем заголовок
            f.readline()
            header = f.readline().strip()
            fields = header.split('|')
            
            # Находим индексы нужных полей
            id_idx = fields.index('intEntityId')
            name_idx = fields.index('strName')
            img_idx = fields.index('imgPhoto')
            
            photo_count = 0
            
            for line in f:
                parts = line.strip().split('|')
                if len(parts) <= max(id_idx, name_idx, img_idx):
                    continue
                
                entity_id = parts[id_idx].strip()
                entity_name = parts[name_idx].strip()
                img_data = parts[img_idx].strip()
                
                # Проверяем наличие реальных blob данных
                if img_data and img_data != '0x' and img_data != '--------' and len(img_data) > 10:
                    # Удаляем префикс 0x если есть
                    if img_data.startswith('0x'):
                        img_data = img_data[2:]
                    
                    # Декодируем hex в binary
                    try:
                        binary_data = binascii.unhexlify(img_data)
                        
                        # Создаем поддиректорию для базы
                        db_output_dir = output_dir / db_dir.name
                        db_output_dir.mkdir(exist_ok=True)
                        
                        # Сохраняем фото
                        photo_filename = f"{entity_id}_{entity_name.replace(' ', '_').replace('/', '_')}.jpg"
                        photo_path = db_output_dir / photo_filename
                        
                        with open(photo_path, 'wb') as photo_file:
                            photo_file.write(binary_data)
                        
                        photo_count += 1
                        total_photos += 1
                        
                        if photo_count <= 3:  # Показываем только первые 3
                            print(f"  ✓ {photo_filename} ({len(binary_data)} bytes)")
                        
                    except Exception as e:
                        pass  # Пропускаем некорректные blob данные
            
            if photo_count > 0:
                dbs_with_photos.append((db_dir.name, photo_count))
                if photo_count > 3:
                    print(f"  ... и еще {photo_count - 3} фотографий")
    
    except Exception as e:
        print(f"  ⚠ Ошибка: {e}")

print(f"\n{'='*60}")
print("ИТОГИ")
print("="*60)
print(f"Всего извлечено фотографий: {total_photos}")
print(f"Баз с фотографиями: {len(dbs_with_photos)}")

if dbs_with_photos:
    print(f"\nФотографии извлечены из:")
    for db_name, count in dbs_with_photos:
        print(f"  • {db_name}: {count} фотографий")

print(f"\nВсе фотографии сохранены в: {output_dir}")
