import json
import sys
from datetime import datetime, timezone
import asyncio
from sqlalchemy.ext.asyncio import AsyncSession
from src.category.models import Category
from src.database import async_session  # асинхронний движок БД


async def load_categories_from_json(json_file_path: str):
    """
    Завантажує категорії з JSON файлу в базу даних
    """
    async with async_session() as session:
        try:
            with open(json_file_path, 'r', encoding='utf-8') as file:
                categories_data = json.load(file)

            print(f"Завантажено {len(categories_data)} головних категорій з файлу")

            clear_existing = input("Очистити існуючі категорії? (y/N): ").strip().lower()
            if clear_existing == 'y':
                await session.execute('DELETE FROM category')
                await session.commit()
                print("Існуючі категорії видалено")

            # Завантаження головних категорій
            for main_category_data in categories_data:
                main_category = await create_category_from_data(main_category_data, None, session)

                # Рекурсивна обробка children
                if 'children' in main_category_data and main_category_data['children']:
                    await process_children(main_category_data['children'], main_category.category_id, session)

            await session.commit()
            print("Категорії успішно завантажено в базу даних!")

        except FileNotFoundError:
            print(f"Файл {json_file_path} не знайдено!")
            return False
        except json.JSONDecodeError:
            print("Помилка при парсингу JSON файлу!")
            return False
        except Exception as e:
            print(f"Помилка при завантаженні категорій: {e}")
            await session.rollback()
            return False

    return True


async def create_category_from_data(category_data: dict, parent_id: int, session: AsyncSession) -> Category:
    """
    Створює категорію з даних словника
    """
    category = Category(
        name=category_data.get('name', 'Без назви'),
        description=category_data.get('description', ''),
        parent_category_id=parent_id,
        seo_keyword=category_data.get('seo_keyword'),
        meta_title=category_data.get('meta_title', category_data.get('name', 'Без назви')),
        meta_description=category_data.get('meta_description', ''),
        meta_keyword=category_data.get('meta_keyword'),
        image=category_data.get('image'),
        status=category_data.get('status', 1),
        date_added=datetime.now(timezone.utc),
        date_modify=datetime.now(timezone.utc)
    )

    session.add(category)
    await session.flush()  # отримати category_id без commit
    print(f"Створено категорію: {category.name} (ID: {category.category_id})")
    return category


async def process_children(children_data: list, parent_id: int, session: AsyncSession):
    """
    Рекурсивна обробка дочірніх категорій та підкатегорій
    """
    for child_data in children_data:
        child_category = await create_category_from_data(child_data, parent_id, session)

        # Обробка subcategories (список словників)
        for subcategory_data in child_data.get('subcategories', []):
            name = subcategory_data.get('name', 'Без назви')
            subcategory = Category(
                name=name,
                description=subcategory_data.get('description', f"Підкатегорія: {name}"),
                parent_category_id=child_category.category_id,
                seo_keyword=subcategory_data.get('seo_keyword'),
                meta_title=subcategory_data.get('meta_title', name),
                meta_description=subcategory_data.get('meta_description', f"{name} - {child_category.name}"),
                meta_keyword=subcategory_data.get('meta_keyword', name),
                image=subcategory_data.get('image'),
                status=subcategory_data.get('status', 1),
                date_added=datetime.now(timezone.utc),
                date_modify=datetime.now(timezone.utc)
            )
            session.add(subcategory)
            await session.flush()
            print(f"  -> Створено підкатегорію: {subcategory.name} (ID: {subcategory.category_id})")

        # Рекурсивна обробка вкладених children
        if 'children' in child_data and child_data['children']:
            await process_children(child_data['children'], child_category.category_id, session)


async def main():
    if len(sys.argv) < 2:
        print("Використання: python -m src.utils.load_categories <шлях_до_json_файлу>")
        return

    json_file_path = sys.argv[1]
    print("Початок завантаження категорій...")

    success = await load_categories_from_json(json_file_path)
    if not success:
        print("Завантаження не вдалося!")


if __name__ == "__main__":
    asyncio.run(main())
