"""
Утилиты для работы с файлами чата.
"""
import os
import shutil
from django.conf import settings
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile


def get_preload_chat_directory(chat_id: int) -> str:
    """Получить путь к директории предзагрузки для чата."""
    return os.path.join('preload_file_chat', str(chat_id))


def get_chat_file_directory(chat_id: int) -> str:
    """Получить путь к директории файлов чата."""
    return os.path.join('file_chat', str(chat_id))


def save_file_to_preload(chat_id: int, file, filename: str) -> str:
    """
    Сохранить файл в директорию предзагрузки.
    
    Args:
        chat_id: ID чата
        file: Файл для сохранения
        filename: Имя файла
        
    Returns:
        Путь к сохраненному файлу относительно MEDIA_ROOT
    """
    preload_dir = get_preload_chat_directory(chat_id)
    
    # Создаем директорию если не существует
    full_path = os.path.join(settings.MEDIA_ROOT, preload_dir)
    os.makedirs(full_path, exist_ok=True)
    
    # Сохраняем файл
    file_path = os.path.join(preload_dir, filename)
    path = default_storage.save(file_path, ContentFile(file.read()))
    
    return path


def move_file_from_preload_to_chat(chat_id: int, filename: str) -> str:
    """
    Переместить файл из preload в основную директорию чата.
    
    Args:
        chat_id: ID чата
        filename: Имя файла
        
    Returns:
        Новый путь к файлу относительно MEDIA_ROOT
    """
    preload_dir = get_preload_chat_directory(chat_id)
    chat_dir = get_chat_file_directory(chat_id)
    
    old_path = os.path.join(settings.MEDIA_ROOT, preload_dir, filename)
    new_dir = os.path.join(settings.MEDIA_ROOT, chat_dir)
    new_path = os.path.join(new_dir, filename)
    
    # Создаем директорию если не существует
    os.makedirs(new_dir, exist_ok=True)
    
    # Перемещаем файл
    if os.path.exists(old_path):
        shutil.move(old_path, new_path)
        # Возвращаем путь относительно MEDIA_ROOT
        return os.path.join(chat_dir, filename)
    
    raise FileNotFoundError(f"Файл {old_path} не найден")


def cleanup_preload_files(chat_id: int, filenames: list = None):
    """
    Очистить файлы из директории предзагрузки.
    
    Args:
        chat_id: ID чата
        filenames: Список имен файлов для удаления (если None - удалить все)
    """
    preload_dir = get_preload_chat_directory(chat_id)
    full_path = os.path.join(settings.MEDIA_ROOT, preload_dir)
    
    if not os.path.exists(full_path):
        return
    
    if filenames:
        # Удаляем только указанные файлы
        for filename in filenames:
            file_path = os.path.join(full_path, filename)
            if os.path.exists(file_path):
                os.remove(file_path)
    else:
        # Удаляем все файлы в директории
        for filename in os.listdir(full_path):
            file_path = os.path.join(full_path, filename)
            if os.path.isfile(file_path):
                os.remove(file_path)

