# -*- coding: utf-8 -*-
"""
فایل اصلی اجرای بات
برای اجرا: python main.py
"""

import logging
from datetime import timedelta

from telegram import Update
from telegram.ext import (
    Application,
    CommandHandler,
    CallbackQueryHandler,
    MessageHandler,
    filters,
)

from config import BOT_TOKEN, ADMIN_IDS
import database as db
from handlers_user import (
    start,
    handle_user_callback,
    handle_text_message,
    handle_photo_message,
    myid_command,
)
from handlers_admin import handle_admin_callback, panel_command, panel_text_trigger

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
logger = logging.getLogger(__name__)


async def post_init(application: Application):
    """اجرا می‌شه یه‌بار بعد از راه‌اندازی بات"""
    try:
        from reseller_manager import start_all_reseller_bots
        await start_all_reseller_bots(application)
    except Exception as e:
        logger.error(f"Error starting reseller bots: {e}")


async def job_abandoned_reminder(context):
    """یادآوری سفارش‌های نیمه‌کاره"""
    try:
        minutes = int(db.get_setting("abandoned_reminder_minutes") or "60")
        flows = db.get_stale_activity_flows(minutes)
        for f in flows:
            try:
                await context.bot.send_message(
                    f["user_id"],
                    "⏰ می‌بینم یه فرآیند ناتموم داری! اگه هنوز می‌خوای ادامه بدی، از منو اقدام کن.",
                )
                db.mark_flow_reminded(f["user_id"])
            except Exception:
                db.mark_flow_reminded(f["user_id"])
    except Exception as e:
        logger.error(f"abandoned reminder error: {e}")


async def job_auto_backup(context):
    """بکاپ خودکار دیتابیس"""
    import shutil, os
    from config import DB_PATH
    try:
        backup_path = DB_PATH + ".autobak"
        shutil.copy2(DB_PATH, backup_path)
        for admin_id in ADMIN_IDS:
            try:
                with open(backup_path, "rb") as f:
                    await context.bot.send_document(
                        admin_id, document=f, filename="shop_autobak.db",
                        caption="📦 بکاپ خودکار دیتابیس"
                    )
            except Exception:
                pass
        os.remove(backup_path)
    except Exception as e:
        logger.error(f"auto backup error: {e}")


def main():
    db.init_db()

    app = (
        Application.builder()
        .token(BOT_TOKEN)
        .post_init(post_init)
        .build()
    )

    # دستورات
    app.add_handler(CommandHandler("start", start))
    app.add_handler(CommandHandler("panel", panel_command))
    app.add_handler(CommandHandler("myid", myid_command))

    # ارسال متن "panel" برای باز کردن پنل ادمین
    app.add_handler(MessageHandler(filters.Regex(r"(?i)^panel$"), panel_text_trigger))

    # کال‌بک‌های دکمه‌های شیشه‌ای
    app.add_handler(CallbackQueryHandler(handle_admin_callback, pattern=r"^admin"))
    app.add_handler(CallbackQueryHandler(handle_user_callback))

    # پیام‌های عکس
    app.add_handler(MessageHandler(filters.PHOTO, handle_photo_message))

    # سایر پیام‌های متنی
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text_message))

    # جاب‌های زمان‌بندی‌شده
    job_queue = app.job_queue
    job_queue.run_repeating(job_abandoned_reminder, interval=timedelta(minutes=15), first=60)
    job_queue.run_repeating(job_auto_backup, interval=timedelta(hours=24), first=3600)

    logger.info("Bot is starting...")
    app.run_polling(allowed_updates=Update.ALL_TYPES)


if __name__ == "__main__":
    main()

