from telegram import Update, InlineKeyboardMarkup, InlineKeyboardButton
from telegram.ext import ContextTypes
import database as db
from config import ADMIN_IDS
from datetime import datetime

# ایموجی‌های پرمیوم رنگی برای انیمیشن متغیر
PREMIUM_EMOJIS = ["🔥", "⚡", "💎", "🌟", "✨", "🚀", "💫", "🎯", "🛡", "⚙️"]
PROTOCOL_EMOJI = {"vless": "🔵", "vmess": "🟣", "v2ray": "🟢"}

def protocol_badge(protocol):
    p = (protocol or '').lower()
    if 'vless' in p: return "🔵 VLESS"
    if 'vmess' in p: return "🟣 VMess"
    return "🟢 V2Ray"

def traffic_bar(used, total):
    if total <= 0: return "♾️ نامحدود"
    pct = min(used / total, 1.0)
    filled = int(pct * 10)
    bar = "█" * filled + "░" * (10 - filled)
    return f"{bar} {used:.1f}/{total}GB"

def status_emoji(config):
    if not config.get('expires_at'):
        return "✅"
    exp = config['expires_at'][:10]
    days_left = (datetime.fromisoformat(config['expires_at']) - datetime.now()).days
    if days_left < 0: return "🔴"
    if days_left <= 3: return "🟡"
    return "🟢"

async def show_my_configs(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    configs = db.get_user_configs(user.id)

    if not configs:
        await update.message.reply_text(
            "📂 شما هنوز کانفیگی ندارید.\n\n"
            "برای خرید از منوی 🛒 خرید اکانت استفاده کنید."
        )
        return

    text = "📂 کانفیگ‌های من:\n\n"
    buttons = []
    for cfg in configs:
        st = status_emoji(cfg)
        days_left = 0
        if cfg.get('expires_at'):
            days_left = (datetime.fromisoformat(cfg['expires_at']) - datetime.now()).days
        text += (
            f"{st} {protocol_badge(cfg['protocol'])}\n"
            f"📛 {cfg['name']}\n"
            f"📊 حجم: {traffic_bar(cfg['traffic_used_gb'], cfg['traffic_limit_gb'])}\n"
            f"⏰ انقضا: {cfg.get('expires_at', '?')[:10]} "
            f"({'منقضی' if days_left < 0 else f'{days_left} روز مانده'})\n"
            f"───────────────\n"
        )
        buttons.append([
            InlineKeyboardButton(f"📋 دریافت لینک #{cfg['id']}", callback_data=f"cfg_link_{cfg['id']}"),
            InlineKeyboardButton(f"📄 متن کانفیگ #{cfg['id']}", callback_data=f"cfg_text_{cfg['id']}")
        ])

    buttons.append([InlineKeyboardButton("🔄 بروزرسانی", callback_data="cfg_refresh")])
    await update.message.reply_text(text, reply_markup=InlineKeyboardMarkup(buttons))

async def handle_config_callbacks(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    data = query.data
    user = query.from_user

    if data.startswith("cfg_link_"):
        cfg_id = int(data[9:])
        cfg = db.get_config(cfg_id)
        if not cfg or cfg.get('assigned_to') != user.id:
            await query.answer("❌ دسترسی ندارید", show_alert=True)
            return
        if cfg.get('config_link'):
            await query.message.reply_text(
                f"🔗 لینک کانفیگ #{cfg_id}:\n\n"
                f"`{cfg['config_link']}`\n\n"
                f"📱 این لینک را در اپ V2Ray / V2RayNG / Nekobox وارد کنید.",
                parse_mode='Markdown'
            )
        else:
            await query.answer("❌ لینکی ثبت نشده", show_alert=True)

    elif data.startswith("cfg_text_"):
        cfg_id = int(data[9:])
        cfg = db.get_config(cfg_id)
        if not cfg or cfg.get('assigned_to') != user.id:
            await query.answer("❌ دسترسی ندارید", show_alert=True)
            return
        if cfg.get('config_text'):
            await query.message.reply_text(
                f"📄 متن کانفیگ #{cfg_id}:\n\n"
                f"`{cfg['config_text']}`",
                parse_mode='Markdown'
            )
        else:
            await query.answer("❌ متن کانفیگی ثبت نشده", show_alert=True)

    elif data == "cfg_refresh":
        await show_my_configs_from_callback(query, context)

    # ===== ادمین =====
    elif data == "adm_configs" and user.id in ADMIN_IDS:
        await admin_configs_menu(query, context)

    elif data == "adm_cfg_add" and user.id in ADMIN_IDS:
        context.user_data['adding_config'] = {'step': 'name'}
        await query.edit_message_text(
            "➕ افزودن کانفیگ جدید\n\n"
            "📛 مرحله ۱: نام کانفیگ را وارد کنید:\n"
            "(مثلاً: VIP-DE-01)"
        )

    elif data == "adm_cfg_list" and user.id in ADMIN_IDS:
        configs = db.get_all_configs(20)
        if not configs:
            await query.edit_message_text("📂 هیچ کانفیگی ثبت نشده.")
            return
        text = "📋 لیست کانفیگ‌ها:\n\n"
        for cfg in configs:
            st = "✅ آزاد" if not cfg['is_assigned'] else f"👤 تخصیص‌یافته"
            text += f"#{cfg['id']} {protocol_badge(cfg['protocol'])} | {cfg['name']} | {st}\n"
        await query.edit_message_text(text)

    elif data.startswith("adm_cfg_assign_") and user.id in ADMIN_IDS:
        # تخصیص دستی کانفیگ به سفارش
        order_id = int(data[15:])
        free = db.get_free_configs()
        if not free:
            await query.answer("❌ کانفیگ آزادی وجود ندارد!", show_alert=True)
            return
        buttons = [[InlineKeyboardButton(
            f"{protocol_badge(c['protocol'])} {c['name']} ({c['traffic_limit_gb']}GB)",
            callback_data=f"adm_cfg_do_{c['id']}_{order_id}"
        )] for c in free[:8]]
        await query.edit_message_text("📦 کانفیگ مورد نظر را انتخاب کنید:", reply_markup=InlineKeyboardMarkup(buttons))

    elif data.startswith("adm_cfg_do_") and user.id in ADMIN_IDS:
        parts = data.split("_")
        cfg_id = int(parts[3])
        order_id = int(parts[4])
        order = db.get_order(order_id)
        if not order:
            await query.answer("❌ سفارش پیدا نشد", show_alert=True)
            return
        expires = db.assign_config(cfg_id, order['user_id'], order_id)
        cfg = db.get_config(cfg_id)
        # ارسال به کاربر
        try:
            msg = build_config_message(cfg, expires)
            await context.bot.send_message(order['user_id'], msg, parse_mode='Markdown')
        except Exception as e:
            print(f"خطا در ارسال کانفیگ: {e}")
        await query.edit_message_text(f"✅ کانفیگ #{cfg_id} به سفارش #{order_id} تخصیص یافت و ارسال شد.")

async def show_my_configs_from_callback(query, context):
    user = query.from_user
    configs = db.get_user_configs(user.id)
    if not configs:
        await query.edit_message_text("📂 هنوز کانفیگی ندارید.")
        return
    text = "📂 کانفیگ‌های من:\n\n"
    buttons = []
    for cfg in configs:
        st = status_emoji(cfg)
        days_left = 0
        if cfg.get('expires_at'):
            days_left = (datetime.fromisoformat(cfg['expires_at']) - datetime.now()).days
        text += (
            f"{st} {protocol_badge(cfg['protocol'])} | {cfg['name']}\n"
            f"📊 {traffic_bar(cfg['traffic_used_gb'], cfg['traffic_limit_gb'])} | "
            f"⏰ {days_left if days_left >= 0 else 'منقضی'} روز\n\n"
        )
        buttons.append([
            InlineKeyboardButton(f"🔗 لینک #{cfg['id']}", callback_data=f"cfg_link_{cfg['id']}"),
            InlineKeyboardButton(f"📄 متن #{cfg['id']}", callback_data=f"cfg_text_{cfg['id']}")
        ])
    await query.edit_message_text(text, reply_markup=InlineKeyboardMarkup(buttons))

async def admin_configs_menu(query, context):
    stats = db.get_config_stats()
    buttons = [
        [InlineKeyboardButton("➕ افزودن کانفیگ", callback_data="adm_cfg_add")],
        [InlineKeyboardButton("📋 لیست همه", callback_data="adm_cfg_list")],
        [InlineKeyboardButton(f"✅ آزاد: {stats['free']} | 👤 تخصیص: {stats['assigned']}", callback_data="adm_cfg_list")],
    ]
    await query.edit_message_text(
        f"⚙️ مدیریت کانفیگ‌ها\n\n"
        f"📦 کل: {stats['total']} | ✅ آزاد: {stats['free']} | 👤 تخصیص‌یافته: {stats['assigned']}",
        reply_markup=InlineKeyboardMarkup(buttons)
    )

def build_config_message(cfg, expires=None):
    """پیام زیبا با ایموجی متغیر برای ارسال کانفیگ"""
    exp = expires or cfg.get('expires_at', '?')
    days_left = 0
    if exp and exp != '?':
        try:
            days_left = (datetime.fromisoformat(exp) - datetime.now()).days
        except:
            pass

    # ایموجی پرمیوم متغیر بر اساس شناسه
    idx = (cfg.get('id', 0)) % len(PREMIUM_EMOJIS)
    star = PREMIUM_EMOJIS[idx]

    msg = (
        f"{star} *کانفیگ اختصاصی شما آماده است!*\n\n"
        f"━━━━━━━━━━━━━━━━━\n"
        f"📛 نام: `{cfg['name']}`\n"
        f"🔌 پروتکل: {protocol_badge(cfg['protocol'])}\n"
        f"📊 حجم: {cfg.get('traffic_limit_gb', 0)} GB\n"
        f"⏰ انقضا: {str(exp)[:10]}\n"
        f"🗓 {days_left} روز باقی‌مانده\n"
        f"━━━━━━━━━━━━━━━━━\n\n"
    )
    if cfg.get('config_link'):
        msg += f"🔗 *لینک کانفیگ:*\n`{cfg['config_link']}`\n\n"
    if cfg.get('config_text'):
        msg += f"📄 *متن کانفیگ:*\n`{cfg['config_text']}`\n\n"
    msg += (
        f"━━━━━━━━━━━━━━━━━\n"
        f"📱 *راهنمای اتصال:*\n"
        f"V2RayNG ،Nekobox ،v2rayN\n"
        f"لینک را Import کنید.\n\n"
        f"⚠️ این کانفیگ فقط برای شماست."
    )
    return msg

async def handle_config_text_input(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """هندل مراحل افزودن کانفیگ از طرف ادمین"""
    user = update.effective_user
    if user.id not in ADMIN_IDS:
        return False

    state = context.user_data.get('adding_config')
    if not state:
        return False

    text = update.message.text
    step = state.get('step')

    if step == 'name':
        state['name'] = text
        state['step'] = 'protocol'
        buttons = InlineKeyboardMarkup([
            [InlineKeyboardButton("🔵 VLESS", callback_data="cfg_proto_vless"),
             InlineKeyboardButton("🟣 VMess", callback_data="cfg_proto_vmess")],
            [InlineKeyboardButton("🟢 V2Ray", callback_data="cfg_proto_v2ray")]
        ])
        await update.message.reply_text("🔌 مرحله ۲: پروتکل را انتخاب کنید:", reply_markup=buttons)

    elif step == 'link':
        state['link'] = text if text != '/skip' else ''
        state['step'] = 'text'
        await update.message.reply_text("📄 مرحله ۴: متن کانفیگ (base64) را وارد کنید:\n(اگه ندارید /skip بزنید)")

    elif step == 'text':
        state['text'] = text if text != '/skip' else ''
        state['step'] = 'traffic'
        await update.message.reply_text("📊 مرحله ۵: حجم (GB) را وارد کنید:\n(برای نامحدود: 0)")

    elif step == 'traffic':
        try:
            state['traffic'] = int(text)
        except:
            state['traffic'] = 0
        state['step'] = 'duration'
        await update.message.reply_text("⏰ مرحله ۶: مدت (روز) را وارد کنید:\n(مثلاً: 30)")

    elif step == 'duration':
        try:
            state['duration'] = int(text)
        except:
            state['duration'] = 30
        state['step'] = 'price'
        await update.message.reply_text("💰 مرحله ۷: قیمت (تومان) را وارد کنید:\n(برای رایگان: 0)")

    elif step == 'price':
        try:
            state['price'] = int(text.replace(',', ''))
        except:
            state['price'] = 0
        # ذخیره
        cid = db.add_config(
            name=state.get('name', 'Config'),
            protocol=state.get('protocol', 'vless'),
            config_link=state.get('link', ''),
            config_text=state.get('text', ''),
            traffic_gb=state.get('traffic', 0),
            duration_days=state.get('duration', 30),
            price=state.get('price', 0),
        )
        context.user_data.pop('adding_config', None)
        await update.message.reply_text(
            f"✅ کانفیگ #{cid} ثبت شد!\n\n"
            f"📛 {state.get('name')}\n"
            f"🔌 {state.get('protocol', 'vless').upper()}\n"
            f"📊 {state.get('traffic', 0)} GB | ⏰ {state.get('duration', 30)} روز\n"
            f"💰 {state.get('price', 0):,} تومان"
        )
        return True

    return True

async def handle_protocol_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    data = query.data
    user = query.from_user

    if user.id not in ADMIN_IDS:
        return

    if data.startswith("cfg_proto_"):
        proto = data[10:]
        state = context.user_data.get('adding_config', {})
        state['protocol'] = proto
        state['step'] = 'link'
        context.user_data['adding_config'] = state
        await query.edit_message_text(
            f"✅ پروتکل: {proto.upper()}\n\n"
            f"🔗 مرحله ۳: لینک کانفیگ را وارد کنید:\n"
            f"(مثلاً: vless://... یا vmess://...)\n"
            f"(اگه ندارید /skip بزنید)"
        )

async def show_my_configs_inline(query, context):
    """نمایش کانفیگ‌های کاربر به صورت inline (از منوی اصلی)"""
    user = query.from_user
    configs = db.get_user_configs(user.id)

    if not configs:
        await query.edit_message_text(
            "📂 هنوز کانفیگی ندارید.\n\n🛒 از منوی خرید اقدام کنید.",
            reply_markup=__import__('telegram').InlineKeyboardMarkup([
                [__import__('telegram').InlineKeyboardButton("🔙 بازگشت", callback_data="menu_back")]
            ])
        )
        return

    text = "📂 *کانفیگ‌های من:*\n\n"
    buttons = []
    for cfg in configs:
        st = status_emoji(cfg)
        days_left = 0
        if cfg.get('expires_at'):
            try:
                days_left = (datetime.fromisoformat(cfg['expires_at']) - datetime.now()).days
            except: pass
        text += (
            f"{st} {protocol_badge(cfg['protocol'])} | *{cfg['name']}*\n"
            f"📊 {traffic_bar(cfg['traffic_used_gb'], cfg['traffic_limit_gb'])} | "
            f"⏰ {'منقضی' if days_left < 0 else f'{days_left} روز'}\n\n"
        )
        buttons.append([
            __import__('telegram').InlineKeyboardButton(f"🔗 لینک #{cfg['id']}", callback_data=f"cfg_link_{cfg['id']}"),
            __import__('telegram').InlineKeyboardButton(f"📄 متن #{cfg['id']}", callback_data=f"cfg_text_{cfg['id']}")
        ])

    buttons.append([__import__('telegram').InlineKeyboardButton("🔙 بازگشت", callback_data="menu_back")])
    await query.edit_message_text(text, reply_markup=__import__('telegram').InlineKeyboardMarkup(buttons), parse_mode='Markdown')

def build_config_message(cfg, expires=None):
    """پیام زیبا با ایموجی متغیر برای ارسال کانفیگ به کاربر"""
    exp = expires or cfg.get('expires_at', '?')
    days_left = 0
    if exp and exp != '?':
        try:
            days_left = (datetime.fromisoformat(exp) - datetime.now()).days
        except: pass

    idx = (cfg.get('id', 0)) % len(PREMIUM_EMOJIS)
    star = PREMIUM_EMOJIS[idx]

    msg = (
        f"{star} *کانفیگ اختصاصی شما آماده است!*\n\n"
        f"━━━━━━━━━━━━━━━━━\n"
        f"📛 نام: `{cfg['name']}`\n"
        f"🔌 پروتکل: {protocol_badge(cfg['protocol'])}\n"
        f"📊 حجم: {cfg.get('traffic_limit_gb', 0)} GB\n"
        f"⏰ انقضا: {str(exp)[:10]}\n"
        f"🗓 {days_left} روز باقی‌مانده\n"
        f"━━━━━━━━━━━━━━━━━\n\n"
    )
    if cfg.get('config_link'):
        msg += f"🔗 *لینک کانفیگ:*\n`{cfg['config_link']}`\n\n"
    if cfg.get('config_text'):
        msg += f"📄 *متن کانفیگ:*\n`{cfg['config_text']}`\n\n"
    msg += (
        f"━━━━━━━━━━━━━━━━━\n"
        f"📱 *راهنمای اتصال:*\n"
        f"V2RayNG ،Nekobox ،v2rayN\n"
        f"لینک را Import کنید.\n\n"
        f"⚠️ این کانفیگ فقط برای شماست."
    )
    return msg
