import os
import random
import shutil

from PIL import Image


def copy_convert_to_webp(
    source_dir,
    dest_dir,
    samples_per_folder=5,
    size_threshold=1024 * 1024,
    quality_high=90,
    quality_low=70,
):
    """
    Копирует структуру папок и конвертирует изображения в WebP
    :param source_dir: Исходная директория с изображениями
    :param dest_dir: Целевая директория для копирования
    :param samples_per_folder: Количество изображений для выбора из каждой папки
    :param size_threshold: Пороговый размер файла (в байтах) для сильного сжатия
    :param quality_high: Качество для маленьких изображений (0-100)
    :param quality_low: Качество для больших изображений (0-100)
    """
    image_extensions = (".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".webp")

    def is_image_file(filename):
        return filename.lower().endswith(image_extensions)

    def convert_to_webp(src_path, dest_path, quality):
        try:
            with Image.open(src_path) as img:
                # Сохраняем прозрачность для RGBA
                if img.mode in ("RGBA", "LA"):
                    img = img.convert("RGBA")
                    img.save(dest_path, "WEBP", quality=quality, lossless=False, method=6)
                else:
                    # Конвертируем в RGB для JPEG-подобных изображений
                    img = img.convert("RGB")
                    img.save(dest_path, "WEBP", quality=quality, method=6)
        except Exception as e:
            print(f"Error converting {src_path}: {e}")
            return False
        return True

    # Создаем корневую целевую папку
    os.makedirs(dest_dir, exist_ok=True)

    for root, dirs, files in os.walk(source_dir):
        rel_path = os.path.relpath(root, source_dir)
        target_dir = os.path.join(dest_dir, rel_path)
        os.makedirs(target_dir, exist_ok=True)

        images = [f for f in files if is_image_file(f)]
        if not images:
            continue

        selected = random.sample(images, min(samples_per_folder, len(images)))

        for file in selected:
            src_path = os.path.join(root, file)
            base_name = os.path.splitext(file)[0]
            dest_path = os.path.join(target_dir, f"{base_name}.webp")

            # Определяем качество на основе размера
            file_size = os.path.getsize(src_path)
            quality = quality_low if file_size > size_threshold else quality_high

            # Конвертируем в WebP
            if not convert_to_webp(src_path, dest_path, quality):
                # Если ошибка конвертации - копируем оригинал
                shutil.copy2(src_path, dest_path)
                print(f"Copied original file instead: {file}")


if __name__ == "__main__":
    copy_convert_to_webp(
        source_dir="assets",
        dest_dir="webp_output",
        samples_per_folder=5,
        size_threshold=1 * 1024 * 20,  # 1 MB
        quality_high=70,
        quality_low=70,
    )
