import asyncio
import logging
from datetime import datetime, timedelta
from sqlalchemy import select, func
from database.db import AsyncSessionLocal
from database.models import User, SpyLog, Thank, Message
from utils.ui_styles import fmt_msg
import config
logger = logging.getLogger(__name__)
class DigestService:
@staticmethod
async def collect_weekly_stats():
"""Сбор статистики за последние 7 дней"""
week_ago = datetime.now() - timedelta(days=7)
async with AsyncSessionLocal() as session:
# 1. Новые пользователи
new_users_stmt = select(func.count(User.id)).where(User.created_at >= week_ago)
new_users_count = (await session.execute(new_users_stmt)).scalar()
# 2. Поймано шпионов
spies_stmt = select(func.count(SpyLog.id)).where(SpyLog.created_at >= week_ago)
spies_count = (await session.execute(spies_stmt)).scalar()
# 3. Благодарности соседей
thanks_stmt = select(func.count(Thank.id)).where(Thank.created_at >= week_ago)
thanks_count = (await session.execute(thanks_stmt)).scalar()
# 4. Топ активных жильцов
# activity_stmt = select(User.first_name, func.count(ActivityLog.id))... (позже добавим)
return {
"new_users": new_users_count,
"spies": spies_count,
"thanks": thanks_count,
"period": f"{week_ago.strftime('%d.%m')} - {datetime.now().strftime('%d.%m')}"
}
@staticmethod
def format_digest_text(stats):
"""Форматирование текста дайджеста для Telegram"""
text = (
f"{fmt_msg('ЕЖЕНЕДЕЛЬНЫЙ ДАЙДЖЕСТ ЛКМ37', 'digest')}\n"
f"📅 Период: {stats['period']}\n\n"
f"🏘️ Жизнь дома:\n"
f"┣ 👥 Новых соседей: +{stats['new_users']}\n"
f"┣ 🙏 Сказано 'Спасибо': {stats['thanks']}\n"
f"┗ 🚨 Поймано шпионов: {stats['spies']}\n\n"
"📝 Топ событий:\n"
"• Обсуждали ремонт лифта\n"
"• Решили вопрос по парковке\n\n"
"Дайджест готов к публикации. Одобрите или отредактируйте его в веб-панели."
)
return text
@staticmethod
async def send_to_owner(bot, stats):
"""Отправка черновика владельцу на утверждение"""
text = DigestService.format_digest_text(stats)
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
kb = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="✅ Опубликовать в чат", callback_data="publish_digest")],
[InlineKeyboardButton(text="📝 Редактировать (WEB)", url=f"http://192.168.10.116:8000/digests/edit")]
])
await bot.send_message(
chat_id=config.ADMIN_USER_ID,
text=text,
reply_markup=kb
)