#!/usr/bin/env python3
"""
🏠 Домовой Бот — Telegram-бот для чата многоквартирного дома

ВЕРСИЯ: v1.2 — Чёрный список ссылок
ДАТА ФИКСАЦИИ: 26 февраля 2026 г.
СТАТУС: ✅ Реализовано

РЕАЛИЗОВАНО В v1.0:
- Регистрация и верификация жильцов
- Рейтинг активности (уровни: Новичок → Сосед → Активист → Лидер)
- Детект шпионов (Score 0-100, 8 факторов)
- Анти-мат система (3 предупреждения → бан)
- Админ-панель с рассылкой
- Учёт квартир (несколько жильцов на квартиру)
- Телефоны экстренных служб и мастеров
- Еженедельный экспорт JSON
- Прокси (socks5) для обхода РКН

РЕАЛИЗОВАНО В v1.1 (26.02.2026):
- ✅ Опросы и голосования (/poll_create, /poll_end, /polls)
- ✅ Inline-кнопки для голосования
- ✅ Подсчёт голосов в реальном времени
- ✅ Результаты с визуальной шкалой
- ✅ Защита от повторного голосования

РЕАЛИЗОВАНО В v1.2 (26.02.2026):
- ✅ Чёрный список доменов (data/bad_domains.json)
- ✅ Чёрный список паттернов и ключевых слов
- ✅ Авто-удаление спам-сообщений
- ✅ Система предупреждений (3 → бан)
- ✅ Уведомление админа о спаме
- ✅ Команды управления ЧС (/add_domain, /domains, /warnings...)

РЕАЛИЗОВАНО В v1.3 (26.02.2026):
- ✅ Анти-спам лимиты (10 сообщений за 60 сек)
- ✅ Авто-удаление флуда
- ✅ Система предупреждений (2 → мут на 30 мин)
- ✅ Команды мута/размута (/mute, /unmute, /muted)
- ✅ Проверка истечения мута

РЕАЛИЗОВАНО В v1.4 (26.02.2026):
- ✅ Расписание отключений (вода, свет, отопление, газ, лифт)
- ✅ Пошаговое создание событий (/schedule_add)
- ✅ Просмотр расписания (/график)
- ✅ Авто-напоминания за 1 час до начала
- ✅ 6 типов отключений с emoji

РЕАЛИЗОВАНО В v1.5 (26.02.2026):
- ✅ Доска объявлений (6 категорий: продам, куплю, отдам, потеряно, нашлось, услуга)
- ✅ Пошаговое создание объявлений (/ad)
- ✅ Просмотр всех объявлений (/ads)
- ✅ Авто-удаление через 7 дней
- ✅ Только для верифицированных жильцов

РЕАЛИЗОВАНО В v1.6 (26.02.2026):
- ✅ Напоминания о платежах ЖКХ (8 типов: электро, вода, отопление, газ, жильё, мусор, интернет, другое)
- ✅ Пошаговое создание напоминаний (/payment_add)
- ✅ Просмотр всех платежей (/payments)
- ✅ Авто-рассылка 5 и 9 числа в 09:00
- ✅ Ссылки на оплату (Госуслуги, Сбербанк, Тинькофф)

РЕАЛИЗОВАНО В v1.7 (26.02.2026):
- ✅ Детект мультиаккаунтов (анализ активности, паттернов сообщений)
- ✅ Проверка всех пользователей (/multicheck)
- ✅ Проверка квартир (/check_apt)
- ✅ Статистика (/multistats)
- ✅ Сброс score (/clear_multiscore)
- ✅ Связывание аккаунтов (/link_accounts)

РЕАЛИЗОВАНО В v1.8 (26.02.2026):
- ✅ Облако тегов тем чата (18 тем: лифты, парковка, уборка, соседи...)
- ✅ Авто-классификация сообщений
- ✅ Статистика по темам (/topics, /top_topics)
- ✅ Еженедельный отчёт (/weekly_report)

РЕАЛИЗОВАНО В v1.9 (26.02.2026):
- ✅ Рейтинг токсичности (4 категории: оскорбления, агрессия, угрозы, дискриминация)
- ✅ Toxicity Score 0-100 для каждого пользователя
- ✅ Топ токсичных пользователей (/toxic_top)
- ✅ Статистика по пользователю (/toxic_stats)
- ✅ Жалобы на пользователей (/complaint)
- ✅ Авто-анализ сообщений и уведомления

РЕАЛИЗОВАНО В v1.10 (26.02.2026):
- ✅ История версий профиля (авто-логирование изменений username, first_name, last_name)
- ✅ Команда /history — история конкретного пользователя
- ✅ Команда /all_history — все изменения за период
- ✅ Команда /field_history — история по полю
- ✅ Команда /history_stats — статистика изменений

РЕАЛИЗОВАНО В v1.11 (27.02.2026):
- ✅ Веб-интерфейс админа на FastAPI
- ✅ Дашборд со статистикой
- ✅ Страница пользователей с поиском
- ✅ Страница экспорта данных
- ✅ API endpoints (/api/stats, /api/users, /api/export)
- ✅ HTTP Basic авторизация

РЕАЛИЗОВАНО В v1.12 (27.02.2026):
- ✅ Достижения жильцов (16 достижений в 9 категориях)
- ✅ Авто-выдача достижений за активность, рейтинг, верификацию
- ✅ Команда /achievements — свои достижения
- ✅ Команда /achievements_top — топ по достижениям
- ✅ Уведомления о новых достижениях

РЕАЛИЗОВАНО В v1.13 (27.02.2026):
- ✅ Система благодарностей (/thank @username)
- ✅ +10 к рейтингу за благодарность
- ✅ Достижение "Помощник" при первой благодарности
- ✅ Ограничение: 1 благодарность в день
- ✅ Топ и история благодарностей

РЕАЛИЗОВАНО В v1.14 (27.02.2026):
- ✅ Календарь событий дома (собрания, субботники, праздники)
- ✅ Создание событий (/event_add)
- ✅ Запись на участие (/join, /leave)
- ✅ Просмотр событий (/events, /my_events)
- ✅ Список участников (/participants)
- ✅ Авто-напоминания за 24 часа

🎉 ВСЕ ФУНКЦИИ v1.x РЕАЛИЗОВАНЫ! 🎉

РЕАЛИЗОВАНО В v2.1 (27.02.2026):
- ✅ Инициативная группа (отдельная сущность от админов)
- ✅ Модель InitiativeGroup в БД
- ✅ Команды: /ig_add, /ig_remove, /ig_list, /ig_stats, /ig_check
- ✅ Рассылка только для ИГ: /ig_broadcast
- ✅ Декораторы для ИГ

🚀 НАЧАТА РАЗРАБОТКА v2.x! 🚀

ПЛАН РАЗРАБОТКИ (v2.2 — v2.x):
См. файл DEVELOPMENT_PLAN.md и VERSIONS.md

БЕКАПЫ ВЕРСИЙ:
backups/versions/vX.X_YYYY-MM-DD/

АВТОРЫ: matrixhasyou + Qwen Code
"""
import logging
import asyncio
import sys
from pathlib import Path

# Добавляем путь к проекту
BASE_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(BASE_DIR))

from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import Command
from aiogram.types import Message
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.fsm.storage.memory import MemoryStorage

from config import (
    BOT_TOKEN, ADMIN_USER_ID, get_proxy_url,
    USE_PROXY, PROXY_TYPE, PROXY_HOST, PROXY_PORT
)
from database.db import init_db
from handlers import admin_router, users_router, verification_router, chat_monitor_router, security_router, apartments_router, antimat_router, phones_router, polls_router, antispam_router, ratelimit_router, schedule_router, ads_router, payments_router, multicount_router, topics_router, toxicity_router, profile_history_router, achievements_router, thanks_router, events_router, initiative_group_router
from services.scheduler import Scheduler
from services.web_server import WebServerService

# Настройка логирования
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('logs/bot.log', encoding='utf-8'),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)


def create_bot_with_proxy() -> Bot:
    """Создание бота с настройкой прокси"""
    proxy_url = get_proxy_url()
    
    if proxy_url:
        logger.info(f'🔒 Использование прокси: {PROXY_TYPE}://{PROXY_HOST}:{PROXY_PORT}')
        
        # Создаём сессию aiogram с прокси
        aiogram_session = AiohttpSession(proxy=proxy_url)
        
        bot = Bot(
            token=BOT_TOKEN,
            session=aiogram_session,
            default=DefaultBotProperties(parse_mode=ParseMode.HTML)
        )
    else:
        logger.info('🔓 Работа без прокси')
        bot = Bot(
            token=BOT_TOKEN,
            default=DefaultBotProperties(parse_mode=ParseMode.HTML)
        )
    
    return bot


async def on_startup(bot: Bot):
    """Действия при запуске"""
    logger.info('🚀 Бот запускается...')

    # Инициализация БД
    await init_db()
    logger.info('✅ База данных инициализирована')

    # Запуск планировщика
    scheduler = Scheduler(bot)
    scheduler.start()
    logger.info('✅ Планировщик задач запущен')

    # Запуск веб-сервера
    web_server = WebServerService(port=8000)
    web_server.start()
    logger.info(f'🌐 Веб-интерфейс: {web_server.get_url()}')

    # Уведомление админа
    try:
        await bot.send_message(
            ADMIN_USER_ID,
            '✅ <b>Домовой бот запущен!</b>\n\n'
            f'Прокси: {"✅" if USE_PROXY else "❌"}\n'
            f'Веб-интерфейс: {web_server.get_url()}\n'
            'Логин: admin\n'
            f'Пароль: {ADMIN_USER_ID}\n\n'
            'Использйте /admin для управления.',
            parse_mode=ParseMode.HTML
        )
    except Exception as e:
        logger.error(f'Не удалось уведомить админа о запуске: {e}')


async def on_shutdown(bot: Bot):
    """Действия при остановке"""
    logger.info('🛑 Бот останавливается...')
    
    try:
        await bot.send_message(
            ADMIN_USER_ID,
            '⚠️ <b>Домовой бот остановлен</b>\n\n'
            'Перезапустите бота.',
            parse_mode=ParseMode.HTML
        )
    except Exception:
        pass
    
    # Закрываем сессию
    await bot.session.close()
    logger.info('🔒 Сессия закрыта')


async def main():
    """Основная функция"""
    # Создаём бота с прокси
    bot = create_bot_with_proxy()
    
    # Создаём диспетчер с FSM storage (для состояний)
    dp = Dispatcher(storage=MemoryStorage())
    
    # Регистрируем роутеры
    dp.include_router(admin_router)
    dp.include_router(users_router)
    dp.include_router(verification_router)
    dp.include_router(chat_monitor_router)
    dp.include_router(security_router)
    dp.include_router(apartments_router)
    dp.include_router(antimat_router)
    dp.include_router(phones_router)
    dp.include_router(polls_router)
    dp.include_router(antispam_router)
    dp.include_router(ratelimit_router)
    dp.include_router(schedule_router)
    dp.include_router(ads_router)
    dp.include_router(payments_router)
    dp.include_router(multicount_router)
    dp.include_router(topics_router)
    dp.include_router(toxicity_router)
    dp.include_router(profile_history_router)
    dp.include_router(achievements_router)
    dp.include_router(thanks_router)
    dp.include_router(events_router)
    dp.include_router(initiative_group_router)
    
    # Регистрируем хуки
    dp.startup.register(on_startup)
    dp.shutdown.register(on_shutdown)
    
    # Запуск
    logger.info('🤖 Запуск бота...')
    await dp.start_polling(bot)


if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        logger.info('🛑 Остановка по Ctrl+C')
    except Exception as e:
        logger.error(f'Критическая ошибка: {e}', exc_info=True)
