import random
from datetime import datetime

from faker import Faker
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from src.category.models import Category
from src.database import async_session  # твій AsyncSession
from src.manufacturer.models import Manufacturer
from src.product.models import Product, ProductStatus, ProductCategory
from src.store.models import ProductStore
from tqdm.asyncio import tqdm_asyncio
from tqdm import tqdm
fake = Faker()

PRODUCT_COUNT = 1000
CATEGORY_COUNT = 100
BATCH_SIZE = 1000  # кількість записів у батчі


async def seed_data():
    async with async_session() as db:
        # --- КАТЕГОРІЇ ---
        categories = []
        for i in tqdm(range(CATEGORY_COUNT), desc="Створюємо категорії"):
            cat = Category(
                name=fake.word().capitalize(),
                description=fake.sentence(),
                seo_keyword=fake.slug(),
                meta_title=fake.sentence(nb_words=3),
                meta_description=fake.text(max_nb_chars=100),
                meta_keyword=fake.word(),
                image=fake.image_url(),
                status=1,
                date_added=datetime.utcnow(),
                date_modify=datetime.utcnow(),
            )
            db.add(cat)
            categories.append(cat)

            # Коміт батчами
            if (i + 1) % BATCH_SIZE == 0:
                await db.commit()
                await db.flush()

        await db.commit()
        await db.flush()
        print(f"✅ Згенеровано {CATEGORY_COUNT} категорій")

        # --- ВИРОБНИКИ ---
        result = await db.execute(select(Manufacturer))
        existing_manufacturers = result.scalars().all()

        # --- ТОВАРИ ---
        for i in tqdm_asyncio(range(PRODUCT_COUNT), desc="Створюємо товари"):
            product = Product(
                name=fake.catch_phrase(),
                description=fake.paragraph(),
                seo_keyword=fake.slug(),
                meta_title=fake.sentence(nb_words=3),
                meta_description=fake.text(max_nb_chars=100),
                meta_keyword=fake.word(),
                image=fake.image_url(),
                status=ProductStatus.ON,
                date_added=fake.date_time_between(start_date="-1y", end_date="now"),
                date_modify=datetime.utcnow(),
                price=round(random.uniform(10, 50000), 2),
                model=f"Model-{fake.bothify(text='??##')}",
                manufacturer_id=random.choice(existing_manufacturers).manufacturer_id
                if existing_manufacturers
                else None,
                rating=round(random.uniform(1, 5), 1),
                viewed=random.randint(0, 1000),
            )
            db.add(product)
            await db.flush()  # щоб product_id згенерувався

            # Випадкова категорія
            category = random.choice(categories)
            db.add(
                ProductCategory(
                    product_id=product.product_id,
                    category_id=category.category_id,
                )
            )

            # Коміт батчами
            if (i + 1) % BATCH_SIZE == 0:
                await db.commit()
                await db.flush()
                print(f"Комітнули {i + 1} товарів")

        # Коміт залишку
        await db.commit()
        await db.flush()
        print(f"✅ Згенеровано {PRODUCT_COUNT} товарів")


# Запуск у Python console:
# import asyncio
# from src.public.faker_test import seed_data
# asyncio.run(seed_data())

