"""
Entry point – Telegram Business Auto-Reply Bot
"""
import asyncio
import sys
from pathlib import Path

# Ensure project root is on path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from loguru import logger
from telegram import Update
from telegram.ext import (
    Application,
    MessageHandler,
    BusinessConnectionHandler,
    filters,
    ContextTypes,
)

from config import settings
from bot.database import init_db
from bot.handlers import process_message


# -------------------------------------------------
# Logging setup
# -------------------------------------------------
logger.remove()
logger.add(
    sys.stderr,
    level=settings.log_level,
    format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | {message}",
)
logger.add(
    "logs/bot_{time:YYYY-MM-DD}.log",
    rotation="00:00",
    retention="14 days",
    level="DEBUG",
    encoding="utf-8",
)


async def on_business_connection(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Log when the bot is connected / disconnected from a business account."""
    bc = update.business_connection
    if bc:
        logger.info(
            f"Business connection update: id={bc.id} user={bc.user.id} "
            f"can_reply={getattr(bc, 'can_reply', None)} rights={getattr(bc, 'rights', None)}"
        )


async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE) -> None:
    logger.exception(f"Exception while handling update: {context.error}")


def main() -> None:
    logger.info("Starting Telegram Business Auto-Reply Bot...")

    # Init DB
    asyncio.get_event_loop().run_until_complete(init_db())
    logger.info("Database ready.")

    app = (
        Application.builder()
        .token(settings.bot_token)
        .concurrent_updates(True)
        .build()
    )

    # Business connection updates
    app.add_handler(BusinessConnectionHandler(on_business_connection))

    # All text messages (including business_message)
    app.add_handler(
        MessageHandler(
            filters.TEXT & ~filters.COMMAND,
            process_message,
        )
    )
    # Also catch commands from normal users (they will be ignored except admin)
    app.add_handler(
        MessageHandler(
            filters.COMMAND,
            process_message,
        )
    )

    app.add_error_handler(error_handler)

    logger.info("Bot is running. Press Ctrl+C to stop.")
    app.run_polling(allowed_updates=Update.ALL_TYPES, drop_pending_updates=True)


if __name__ == "__main__":
    main()