import asyncio
from telethon import TelegramClient
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from config import BOT_TOKEN, ADMIN_IDS, SYNC_INTERVAL_MINUTES, STATUS_CHECK_INTERVAL_MINUTES
from database import init_db, list_orders, update_order_status
from services.provider_api import provider_api
import state
import handlers_user
import handlers_admin

# شناسه‌های عمومی Telegram برای اتصال Bot در Telethon
API_ID = 29403984
API_HASH = "34575057ab5d096dada5df27b7cf4f15"
client = TelegramClient('shop_bot', API_ID, API_HASH)
# متن‌های پویا (نام محصول، توضیحات، لینک‌های حاوی _ یا *، ماسک API Key و ...) می‌توانند به‌عنوان
# نشانه‌های Markdown نامعتبر تفسیر شوند و باعث خطای EntityBoundsInvalidError شوند.
# چون در هیچ‌جای ربات از فرمت بولد/ایتالیک استفاده نمی‌شود، پارس مارک‌داون را کلاً غیرفعال می‌کنیم.
client.parse_mode = None
ADMINS = set(ADMIN_IDS)


def is_admin(uid):
    return uid in ADMINS


def _map_status(s):
    s = s.lower()
    if any(k in s for k in ('complet', 'finish')):
        return 'completed'
    if any(k in s for k in ('cancel', 'reject')):
        return 'canceled'
    if any(k in s for k in ('partial', 'fail', 'error')):
        return 'failed'
    if any(k in s for k in ('progress', 'process', 'pending', 'in_progress')):
        return 'processing'
    return None


async def sync_products_job():
    r = await provider_api.services()
    if r.ok:
        from database import services_upsert
        data = r.data.get('services', r.data) if isinstance(r.data, dict) else r.data
        services_upsert(data)


async def sync_orders_job():
    """Poll the provider for the status of orders still in progress and notify users on completion."""
    rows, _ = list_orders(status='processing', per_page=50)
    for o in rows:
        if not o['provider_order_id']:
            continue
        r = await provider_api.status(order=o['provider_order_id'])
        if not r.ok or not isinstance(r.data, dict):
            continue
        mapped = _map_status(str(r.data.get('status', '')))
        if mapped and mapped != o['status']:
            update_order_status(o['id'], mapped)
            if mapped == 'completed':
                try:
                    await client.send_message(o['user_telegram_id'], f"✅ سفارش شما #{o['display_no']} ({o['product_name']}) با موفقیت تکمیل شد.")
                except Exception:
                    pass


async def main():
    init_db()
    handlers_user.register(client, is_admin)
    handlers_admin.register(client, is_admin)

    scheduler = AsyncIOScheduler()
    scheduler.add_job(sync_products_job, 'interval', minutes=SYNC_INTERVAL_MINUTES)
    scheduler.add_job(sync_orders_job, 'interval', minutes=STATUS_CHECK_INTERVAL_MINUTES)
    scheduler.start()

    await client.start(bot_token=BOT_TOKEN)
    me = await client.get_me()
    state.bot_username = me.username
    print('Telethon shop bot started')
    try:
        await client.run_until_disconnected()
    finally:
        scheduler.shutdown(wait=False)


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