#!/usr/bin/env python3
"""
Комплексное тестирование функционала бота
"""
import asyncio
from sqlalchemy import select, func
from database.db import AsyncSessionLocal
from database.models import User, Service, Ad, Poll, Event, Schedule
from keyboards.inline import get_main_menu
from keyboards.admin_menu import get_admin_main_menu

async def test_all():
    print("=" * 60)
    print("🧪 КОМПЛЕКСНОЕ ТЕСТИРОВАНИЕ ДОМОВОЙ БОТ")
    print("=" * 60)
    
    # Тест 1: Проверка меню жильца
    print("\n1️⃣ ТЕСТ: Меню жильца")
    menu = get_main_menu()
    buttons_count = sum(len(row) for row in menu.inline_keyboard)
    print(f"   Кнопок в меню: {buttons_count}")
    print(f"   {'✅' if buttons_count <= 12 else '❌'} Ожидаем 9-12 кнопок")
    
    # Тест 2: Проверка меню админа
    print("\n2️⃣ ТЕСТ: Меню админа")
    admin_menu = get_admin_main_menu()
    admin_buttons = sum(len(row) for row in admin_menu.inline_keyboard)
    print(f"   Кнопок в меню: {admin_buttons}")
    print(f"   {'✅' if admin_buttons > 10 else '❌'} OK")
    
    # Тест 3: Проверка БД
    print("\n3️⃣ ТЕСТ: База данных")
    async with AsyncSessionLocal() as session:
        users_count = (await session.execute(select(func.count(User.user_id)))).scalar()
        services_count = (await session.execute(select(func.count(Service.service_id)))).scalar()
        ads_count = (await session.execute(select(func.count(Ad.ad_id)))).scalar()
        polls_count = (await session.execute(select(func.count(Poll.poll_id)))).scalar()
        events_count = (await session.execute(select(func.count(Event.id)))).scalar()
        schedules_count = (await session.execute(select(func.count(Schedule.schedule_id)))).scalar()
        
        print(f"   👥 Пользователей: {users_count}")
        print(f"   📞 Служб: {services_count}")
        print(f"   📢 Объявлений: {ads_count}")
        print(f"   📊 Опросов: {polls_count}")
        print(f"   📅 Событий: {events_count}")
        print(f"   ⏰ Расписаний: {schedules_count}")
        
        # Проверка полиции
        police = (await session.execute(select(Service).where(Service.category == 'police'))).scalars().all()
        print(f"   👮 Полиция: {len(police)} записей")
        if len(police) == 0:
            print(f"   ⚠️ Нет записей полиции! Добавьте через веб-админку.")
        else:
            for p in police:
                print(f"      • {p.name}: {p.phone}")
    
    # Тест 4: Проверка callback_data на дубликаты
    print("\n4️⃣ ТЕСТ: Уникальность callback_data")
    import re
    import glob
    callbacks = []
    for file in glob.glob("handlers/*.py") + glob.glob("keyboards/*.py"):
        with open(file, 'r', encoding='utf-8') as f:
            content = f.read()
            found = re.findall(r"callback_data=['\"]([^'\"]+)['\"]", content)
            callbacks.extend(found)
    
    # Фильтруем шаблонные
    simple_callbacks = [c for c in callbacks if not c.split('_')[-1].isdigit()]
    duplicates = list(set([c for c in simple_callbacks if simple_callbacks.count(c) > 1]))
    
    if duplicates:
        print(f"   ❌ Дубликаты: {duplicates[:10]}")
    else:
        print(f"   ✅ Все callback_data уникальны")
    
    # Тест 5: Проверка что сообщения в личку
    print("\n5️⃣ ТЕСТ: Сообщения в личку")
    with open("handlers/users.py", 'r', encoding='utf-8') as f:
        content = f.read()
        if 'ADMIN_CHAT_ID' in content:
            print(f"   ⚠️ Есть ADMIN_CHAT_ID в users.py — проверить!")
        else:
            print(f"   ✅ Нет ADMIN_CHAT_ID в users.py — все в личку!")
    
    print("\n" + "=" * 60)
    print("✅ ТЕСТИРОВАНИЕ ЗАВЕРШЕНО")
    print("=" * 60)

if __name__ == '__main__':
    asyncio.run(test_all())
