from aiogram import Router, F
from aiogram.types import CallbackQuery, Message, InlineKeyboardButton
from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from sqlalchemy import select, func

from database.database import AsyncSessionLocal
from database.models import Category, Product
from database.product_crud import delete_category, update_category_name, delete_product, update_product_field
from core.config import config
from core.emojis import p_em

router = Router()


async def send_manage_products_menu(message: Message, state: FSMContext = None, page: int = 1, prefix_text: str = ""):
    if state:
        await state.clear()
        
    per_page = 10
    async with AsyncSessionLocal() as session:
        cats = (await session.execute(select(Category).where(Category.parent_id == None))).scalars().all()
        
    total_pages = max(1, (len(cats) + per_page - 1) // per_page)
    start = (page - 1) * per_page
    end = start + per_page
    current_cats = cats[start:end]
        
    builder = InlineKeyboardBuilder()
    builder.button(text="➕ افزودن دسته‌بندی جدید", callback_data="admin_add_cat", style="success")
    builder.button(text="📥 وارد کردن فایل اکسل/CSV", callback_data="admin_import_excel", style="primary")
    
    for c in current_cats:
        builder.button(text=f"📂 {c.name}", callback_data=f"adm_cat_{c.id}_1", style="primary")
        
    nav_buttons = []
    if page > 1:
        nav_buttons.append(InlineKeyboardButton(text="⬅️ قبلی", callback_data=f"admin_manage_products_{page-1}", style="primary"))
    if page < total_pages:
        nav_buttons.append(InlineKeyboardButton(text="بعدی ➡️", callback_data=f"admin_manage_products_{page+1}", style="primary"))
        
    builder.adjust(2, 2)
    if nav_buttons:
        builder.row(*nav_buttons)
        
    builder.row(InlineKeyboardButton(text="🔙 بازگشت به داشبورد", callback_data="admin_dashboard_back", style="danger"))
    
    text = prefix_text + f"🛠 <b>مدیریت محصولات و دسته‌بندی‌ها</b> (صفحه {page}/{total_pages})\n\nبرای مشاهده یا ویرایش محصولات هر دسته، روی آن کلیک کنید:"
    await message.answer(p_em(text), reply_markup=builder.as_markup())

async def send_admin_category_details(message: Message, cat_id: int, page: int = 1, prefix_text: str = ""):
    per_page = 10
    async with AsyncSessionLocal() as session:
        cat = await session.get(Category, cat_id)
        if not cat:
            return await message.answer("دسته‌بندی یافت نشد!")
            
        subcats = (await session.execute(select(Category).where(Category.parent_id == cat_id))).scalars().all()
        
        if subcats:
            total_pages = max(1, (len(subcats) + per_page - 1) // per_page)
            start = (page - 1) * per_page
            end = start + per_page
            current_subcats = subcats[start:end]
            
            builder = InlineKeyboardBuilder()
            builder.button(text="➕ افزودن زیرمجموعه جدید", callback_data=f"admin_add_subcat_{cat_id}", style="success")
            builder.button(text="✏️ تغییر نام دسته", callback_data=f"adm_edit_cat_{cat_id}", style="primary")
            builder.button(text="🗑 حذف دسته", callback_data=f"adm_del_cat_{cat_id}", style="danger")
            builder.adjust(1, 2)
            
            for sc in current_subcats:
                builder.button(text=f"📁 {sc.name}", callback_data=f"adm_cat_{sc.id}_1", style="primary")
                
            nav_buttons = []
            if page > 1:
                nav_buttons.append(InlineKeyboardButton(text="⬅️", callback_data=f"adm_cat_{cat_id}_{page-1}", style="primary"))
            if page < total_pages:
                nav_buttons.append(InlineKeyboardButton(text="➡️", callback_data=f"adm_cat_{cat_id}_{page+1}", style="primary"))
                
            builder.adjust(1)
            if nav_buttons:
                builder.row(*nav_buttons)
                
            builder.row(InlineKeyboardButton(text="🔙 بازگشت به لیست دسته‌ها", callback_data="admin_manage_products_1", style="danger"))
            
            text = prefix_text + f"📂 <b>مدیریت دسته مادر: {cat.name}</b> (صفحه {page}/{total_pages})\n\nزیرمجموعه‌های این دسته:"
            await message.answer(p_em(text), reply_markup=builder.as_markup())
        else:
            prods = (await session.execute(select(Product).where(Product.category_id == cat_id))).scalars().all()
            
            total_pages = max(1, (len(prods) + per_page - 1) // per_page)
            start = (page - 1) * per_page
            end = start + per_page
            current_prods = prods[start:end]
            
            builder = InlineKeyboardBuilder()
            builder.button(text="➕ افزودن محصول به این دسته", callback_data=f"admin_add_prod_{cat_id}", style="success")
            builder.button(text="✏️ تغییر نام دسته", callback_data=f"adm_edit_cat_{cat_id}", style="primary")
            builder.button(text="🗑 حذف دسته", callback_data=f"adm_del_cat_{cat_id}", style="danger")
            builder.adjust(1, 2)
            
            for p in current_prods:
                builder.button(text=f"🛒 {p.name}", callback_data=f"adm_prod_{p.id}_{page}", style="primary")
                
            nav_buttons = []
            if page > 1:
                nav_buttons.append(InlineKeyboardButton(text="⬅️", callback_data=f"adm_cat_{cat_id}_{page-1}", style="primary"))
            if page < total_pages:
                nav_buttons.append(InlineKeyboardButton(text="➡️", callback_data=f"adm_cat_{cat_id}_{page+1}", style="primary"))
                
            builder.adjust(1)
            if nav_buttons:
                builder.row(*nav_buttons)
                
            if cat.parent_id:
                back_callback = f"adm_cat_{cat.parent_id}_1"
                back_text = "🔙 بازگشت به دسته مادر"
            else:
                back_callback = "admin_manage_products_1"
                back_text = "🔙 بازگشت به لیست دسته‌ها"
                
            builder.row(InlineKeyboardButton(text=back_text, callback_data=back_callback, style="danger"))
            
            text = prefix_text + f"📂 <b>مدیریت دسته: {cat.name}</b> (صفحه {page}/{total_pages})\n\nمحصولات این دسته:"
            await message.answer(p_em(text), reply_markup=builder.as_markup())

async def send_admin_product_details(message: Message, prod_id: int, back_page: int = 1, prefix_text: str = ""):
    from database.models import GiftCard
    async with AsyncSessionLocal() as session:
        p = await session.get(Product, prod_id)
        if not p:
            return await message.answer("محصول یافت نشد!")
        unsold_count = await session.scalar(
            select(func.count(GiftCard.id)).where(GiftCard.product_id == prod_id, GiftCard.is_sold == False)
        ) or 0
        
    builder = InlineKeyboardBuilder()
    builder.button(text="✏️ ویرایش قیمت", callback_data=f"adm_edit_prod_{p.id}_price_{back_page}", style="primary")
    builder.button(text="✏️ ویرایش موجودی", callback_data=f"adm_edit_prod_{p.id}_stock_{back_page}", style="primary")
    builder.button(text="✏️ ویرایش نام", callback_data=f"adm_edit_prod_{p.id}_name_{back_page}", style="primary")
    builder.button(text="✏️ ویرایش توضیحات", callback_data=f"adm_edit_prod_desc_{p.id}_{back_page}", style="primary")
    builder.button(text="🎁 افزودن کد گیفت‌کارت", callback_data=f"adm_add_gcs_dir_{p.id}_{back_page}", style="success")
    builder.button(text="📋 مشاهده کدهای موجود", callback_data=f"gcs_prod_{p.id}_1", style="primary")
    builder.button(text="🗑 حذف محصول", callback_data=f"adm_del_prod_{p.id}", style="danger")
    builder.button(text="🔙 بازگشت به دسته", callback_data=f"adm_cat_{p.category_id}_{back_page}", style="danger")
    builder.adjust(2, 2, 2, 2)
    
    stock_text = 'نامحدود' if p.stock == -1 else str(p.stock)
    
    text = prefix_text + (
        f"🛒 <b>مدیریت محصول:</b>\n\n"
        f"🔸 <b>نام:</b> {p.name}\n"
        f"🔸 <b>قیمت:</b> {p.price:,.0f} تومان\n"
        f"🔸 <b>موجودی در انبار:</b> {stock_text}\n"
        f"🔸 <b>کدهای گیفت‌کارت فعال:</b> {unsold_count} عدد\n"
        f"🔸 <b>توضیحات:</b> {p.description or 'ندارد'}\n\n"
        f"چه تغییری می‌خواهید انجام دهید؟"
    )
    await message.answer(p_em(text), reply_markup=builder.as_markup())

class AdminShopState(StatesGroup):
    waiting_for_category_name = State()
    waiting_for_edit_category_name = State()
    waiting_for_product_name = State()
    waiting_for_product_price = State()
    waiting_for_product_desc = State()
    waiting_for_product_stock = State()
    waiting_for_edit_value = State()
    waiting_for_product_desc_edit = State()
    waiting_for_direct_giftcards = State()
    waiting_for_excel_file = State()

@router.callback_query(F.data.startswith("admin_manage_products"))
async def manage_products_menu(callback: CallbackQuery, state: FSMContext = None):
    if state:
        await state.clear()
    if callback.from_user.id not in config.admin_ids: return
    
    parts = callback.data.split("_")
    page = int(parts[3]) if len(parts) > 3 else 1
    per_page = 10
    
    async with AsyncSessionLocal() as session:
        cats = (await session.execute(select(Category).where(Category.parent_id == None))).scalars().all()
        
    total_pages = max(1, (len(cats) + per_page - 1) // per_page)
    start = (page - 1) * per_page
    end = start + per_page
    current_cats = cats[start:end]
        
    builder = InlineKeyboardBuilder()
    builder.button(text="➕ افزودن دسته‌بندی جدید", callback_data="admin_add_cat", style="success")
    builder.button(text="📥 وارد کردن فایل اکسل/CSV", callback_data="admin_import_excel", style="primary")
    
    for c in current_cats:
        builder.button(text=f"📂 {c.name}", callback_data=f"adm_cat_{c.id}_1", style="primary")
        
    nav_buttons = []
    if page > 1:
        nav_buttons.append(InlineKeyboardButton(text="⬅️ قبلی", callback_data=f"admin_manage_products_{page-1}", style="primary"))
    if page < total_pages:
        nav_buttons.append(InlineKeyboardButton(text="بعدی ➡️", callback_data=f"admin_manage_products_{page+1}", style="primary"))
        
    builder.adjust(2, 2)
    if nav_buttons:
        builder.row(*nav_buttons)
        
    builder.row(InlineKeyboardButton(text="🔙 بازگشت به داشبورد", callback_data="admin_dashboard_back", style="danger"))
    
    await callback.message.edit_text(
        p_em(f"🛠 <b>مدیریت محصولات و دسته‌بندی‌ها</b> (صفحه {page}/{total_pages})\n\nبرای مشاهده یا ویرایش محصولات هر دسته، روی آن کلیک کنید:"),
        reply_markup=builder.as_markup()
    )

@router.callback_query(F.data.startswith("adm_cat_"))
async def admin_category_details(callback: CallbackQuery):
    parts = callback.data.split("_")
    cat_id = int(parts[2])
    page = int(parts[3]) if len(parts) > 3 else 1
    per_page = 10
    
    async with AsyncSessionLocal() as session:
        cat = await session.get(Category, cat_id)
        if not cat:
            return await callback.answer("دسته‌بندی یافت نشد!", show_alert=True)
            
        subcats = (await session.execute(select(Category).where(Category.parent_id == cat_id))).scalars().all()
        
        if subcats:
            # Render subcategories list
            total_pages = max(1, (len(subcats) + per_page - 1) // per_page)
            start = (page - 1) * per_page
            end = start + per_page
            current_subcats = subcats[start:end]
            
            builder = InlineKeyboardBuilder()
            builder.button(text="➕ افزودن زیرمجموعه جدید", callback_data=f"admin_add_subcat_{cat_id}", style="success")
            builder.button(text="✏️ تغییر نام دسته", callback_data=f"adm_edit_cat_{cat_id}", style="primary")
            builder.button(text="🗑 حذف دسته", callback_data=f"adm_del_cat_{cat_id}", style="danger")
            builder.adjust(1, 2)
            
            for sc in current_subcats:
                builder.button(text=f"📁 {sc.name}", callback_data=f"adm_cat_{sc.id}_1", style="primary")
                
            nav_buttons = []
            if page > 1:
                nav_buttons.append(InlineKeyboardButton(text="⬅️", callback_data=f"adm_cat_{cat_id}_{page-1}", style="primary"))
            if page < total_pages:
                nav_buttons.append(InlineKeyboardButton(text="➡️", callback_data=f"adm_cat_{cat_id}_{page+1}", style="primary"))
                
            builder.adjust(1)
            if nav_buttons:
                builder.row(*nav_buttons)
                
            builder.row(InlineKeyboardButton(text="🔙 بازگشت به لیست دسته‌ها", callback_data="admin_manage_products_1", style="danger"))
            
            await callback.message.edit_text(
                p_em(f"📂 <b>مدیریت دسته مادر: {cat.name}</b> (صفحه {page}/{total_pages})\n\nزیرمجموعه‌های این دسته:"),
                reply_markup=builder.as_markup()
            )
        else:
            # Render products list
            prods = (await session.execute(select(Product).where(Product.category_id == cat_id))).scalars().all()
            
            total_pages = max(1, (len(prods) + per_page - 1) // per_page)
            start = (page - 1) * per_page
            end = start + per_page
            current_prods = prods[start:end]
            
            builder = InlineKeyboardBuilder()
            builder.button(text="➕ افزودن محصول به این دسته", callback_data=f"admin_add_prod_{cat_id}", style="success")
            builder.button(text="✏️ تغییر نام دسته", callback_data=f"adm_edit_cat_{cat_id}", style="primary")
            builder.button(text="🗑 حذف دسته", callback_data=f"adm_del_cat_{cat_id}", style="danger")
            builder.adjust(1, 2)
            
            for p in current_prods:
                builder.button(text=f"🛒 {p.name}", callback_data=f"adm_prod_{p.id}_{page}", style="primary")
                
            nav_buttons = []
            if page > 1:
                nav_buttons.append(InlineKeyboardButton(text="⬅️", callback_data=f"adm_cat_{cat_id}_{page-1}", style="primary"))
            if page < total_pages:
                nav_buttons.append(InlineKeyboardButton(text="➡️", callback_data=f"adm_cat_{cat_id}_{page+1}", style="primary"))
                
            builder.adjust(1)
            if nav_buttons:
                builder.row(*nav_buttons)
                
            if cat.parent_id:
                back_callback = f"adm_cat_{cat.parent_id}_1"
                back_text = "🔙 بازگشت به دسته مادر"
            else:
                back_callback = "admin_manage_products_1"
                back_text = "🔙 بازگشت به لیست دسته‌ها"
                
            builder.row(InlineKeyboardButton(text=back_text, callback_data=back_callback, style="danger"))
            
            await callback.message.edit_text(
                p_em(f"📂 <b>مدیریت دسته: {cat.name}</b> (صفحه {page}/{total_pages})\n\nمحصولات این دسته:"),
                reply_markup=builder.as_markup()
            )

@router.callback_query(F.data.startswith("adm_del_cat_"))
async def admin_delete_category(callback: CallbackQuery):
    cat_id = int(callback.data.split("_")[3])
    async with AsyncSessionLocal() as session:
        cat = await session.get(Category, cat_id)
        parent_id = cat.parent_id if cat else None
        await delete_category(session, cat_id)
    await callback.answer("دسته با موفقیت حذف شد.", show_alert=True)
    if parent_id:
        callback.data = f"adm_cat_{parent_id}_1"
        await admin_category_details(callback)
    else:
        callback.data = "admin_manage_products_1"
        await manage_products_menu(callback)

@router.callback_query(F.data.startswith("adm_prod_"))
async def admin_product_details(callback: CallbackQuery):
    parts = callback.data.split("_")
    prod_id = int(parts[2])
    back_page = int(parts[3]) if len(parts) > 3 else 1
    
    from database.models import GiftCard
    async with AsyncSessionLocal() as session:
        p = await session.get(Product, prod_id)
        unsold_count = await session.scalar(
            select(func.count(GiftCard.id)).where(GiftCard.product_id == prod_id, GiftCard.is_sold == False)
        ) or 0
        
    if not p:
        return await callback.answer("محصول یافت نشد!", show_alert=True)
        
    builder = InlineKeyboardBuilder()
    builder.button(text="✏️ ویرایش قیمت", callback_data=f"adm_edit_prod_{p.id}_price_{back_page}", style="primary")
    builder.button(text="✏️ ویرایش موجودی", callback_data=f"adm_edit_prod_{p.id}_stock_{back_page}", style="primary")
    builder.button(text="✏️ ویرایش نام", callback_data=f"adm_edit_prod_{p.id}_name_{back_page}", style="primary")
    builder.button(text="✏️ ویرایش توضیحات", callback_data=f"adm_edit_prod_desc_{p.id}_{back_page}", style="primary")
    builder.button(text="🎁 افزودن کد گیفت‌کارت", callback_data=f"adm_add_gcs_dir_{p.id}_{back_page}", style="success")
    builder.button(text="📋 مشاهده کدهای موجود", callback_data=f"gcs_prod_{p.id}_1", style="primary")
    builder.button(text="🗑 حذف محصول", callback_data=f"adm_del_prod_{p.id}", style="danger")
    builder.button(text="🔙 بازگشت به دسته", callback_data=f"adm_cat_{p.category_id}_{back_page}", style="danger")
    builder.adjust(2, 2, 2, 2)
    
    stock_text = 'نامحدود' if p.stock == -1 else str(p.stock)
    
    await callback.message.edit_text(
        p_em(f"🛒 <b>مدیریت محصول:</b>\n\n"
        f"🔸 <b>نام:</b> {p.name}\n"
        f"🔸 <b>قیمت:</b> {p.price:,.0f} تومان\n"
        f"🔸 <b>موجودی در انبار:</b> {stock_text}\n"
        f"🔸 <b>کدهای گیفت‌کارت فعال:</b> {unsold_count} عدد\n"
        f"🔸 <b>توضیحات:</b> {p.description or 'ندارد'}\n\n"
        f"چه تغییری می‌خواهید انجام دهید؟"),
        reply_markup=builder.as_markup()
    )

@router.callback_query(F.data.startswith("adm_del_prod_"))
async def admin_delete_prod(callback: CallbackQuery):
    prod_id = int(callback.data.split("_")[3])
    async with AsyncSessionLocal() as session:
        p = await session.get(Product, prod_id)
        cat_id = p.category_id if p else 1
        await delete_product(session, prod_id)
        
    await callback.answer("محصول حذف شد.", show_alert=True)
    callback.data = f"adm_cat_{cat_id}_1"
    await admin_category_details(callback)

# --- افزودن دسته بندی ---
@router.callback_query(F.data == "admin_add_cat")
async def add_category(callback: CallbackQuery, state: FSMContext):
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data="admin_manage_products_1", style="danger")
    await callback.message.edit_text("نام دسته‌بندی جدید را وارد کنید:", reply_markup=builder.as_markup())
    await state.set_state(AdminShopState.waiting_for_category_name)
    await state.update_data(parent_id=None)
    await callback.answer()

@router.callback_query(F.data.startswith("admin_add_subcat_"))
async def add_subcategory(callback: CallbackQuery, state: FSMContext):
    parent_id = int(callback.data.split("_")[3])
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data=f"adm_cat_{parent_id}_1", style="danger")
    await callback.message.edit_text("نام زیرمجموعه جدید را وارد کنید:", reply_markup=builder.as_markup())
    await state.set_state(AdminShopState.waiting_for_category_name)
    await state.update_data(parent_id=parent_id)
    await callback.answer()

@router.message(AdminShopState.waiting_for_category_name)
async def process_add_category(message: Message, state: FSMContext):
    if message.text == "/cancel": return await state.clear()
        
    data = await state.get_data()
    parent_id = data.get("parent_id")
    
    async with AsyncSessionLocal() as session:
        session.add(Category(name=message.text, parent_id=parent_id))
        await session.commit()
        
    await state.clear()
    if parent_id:
        await send_admin_category_details(message, parent_id, prefix_text=f"✅ دسته‌بندی '{message.text}' اضافه شد.\n\n")
    else:
        await send_manage_products_menu(message, prefix_text=f"✅ دسته‌بندی '{message.text}' اضافه شد.\n\n")

# --- ویرایش نام دسته بندی ---
@router.callback_query(F.data.startswith("adm_edit_cat_"))
async def edit_category_name_prompt(callback: CallbackQuery, state: FSMContext):
    cat_id = int(callback.data.split("_")[3])
    
    async with AsyncSessionLocal() as session:
        cat = await session.get(Category, cat_id)
        if not cat:
            return await callback.answer("دسته‌بندی یافت نشد!", show_alert=True)
        cat_name = cat.name
        
    await state.update_data(edit_cat_id=cat_id)
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data=f"adm_cat_{cat_id}_1", style="danger")
    
    await callback.message.edit_text(
        f"✏️ <b>تغییر نام دسته {cat_name}</b>\n\n"
        f"لطفاً نام جدید دسته‌بندی را بفرستید:",
        reply_markup=builder.as_markup()
    )
    await state.set_state(AdminShopState.waiting_for_edit_category_name)
    await callback.answer()

@router.message(AdminShopState.waiting_for_edit_category_name)
async def save_edited_category_name(message: Message, state: FSMContext):
    data = await state.get_data()
    cat_id = data.get("edit_cat_id")
    new_name = message.text.strip()
    
    async with AsyncSessionLocal() as session:
        cat = await session.get(Category, cat_id)
        if cat:
            cat.name = new_name
            await session.commit()
            parent_id = cat.parent_id
        else:
            parent_id = None
            
    await state.clear()
    if cat_id:
        await send_admin_category_details(message, cat_id, prefix_text="✅ نام دسته‌بندی با موفقیت تغییر یافت.\n\n")
    else:
        await send_manage_products_menu(message, prefix_text="✅ نام دسته‌بندی با موفقیت تغییر یافت.\n\n")

# --- افزودن محصول ---
@router.callback_query(F.data.startswith("admin_add_prod_"))
async def add_product_name(callback: CallbackQuery, state: FSMContext):
    cat_id = int(callback.data.split("_")[3])
    await state.update_data(cat_id=cat_id)
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data="admin_manage_products_1", style="danger")
    await callback.message.edit_text("نام محصول را وارد کنید:", reply_markup=builder.as_markup())
    await state.set_state(AdminShopState.waiting_for_product_name)
    await callback.answer()

@router.message(AdminShopState.waiting_for_product_name)
async def add_product_price(message: Message, state: FSMContext):
    if message.text == "/cancel": return await state.clear()
    await state.update_data(name=message.text)
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data="admin_manage_products_1", style="danger")
    await message.answer("قیمت محصول (به تومان) را به عدد وارد کنید:", reply_markup=builder.as_markup())
    await state.set_state(AdminShopState.waiting_for_product_price)

@router.message(AdminShopState.waiting_for_product_price)
async def add_product_desc(message: Message, state: FSMContext):
    if message.text == "/cancel": return await state.clear()
    if not message.text.isdigit(): return await message.answer("فقط عدد وارد کنید!")
    await state.update_data(price=int(message.text))
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data="admin_manage_products_1", style="danger")
    await message.answer("توضیحات محصول را وارد کنید (اگر ندارد بنویسید 'ندارد'):", reply_markup=builder.as_markup())
    await state.set_state(AdminShopState.waiting_for_product_desc)

@router.message(AdminShopState.waiting_for_product_desc)
async def add_product_stock(message: Message, state: FSMContext):
    if message.text == "/cancel": return await state.clear()
    await state.update_data(desc=message.text if message.text != 'ندارد' else "")
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data="admin_manage_products_1", style="danger")
    await message.answer("موجودی را وارد کنید (عدد -1 برای نامحدود):", reply_markup=builder.as_markup())
    await state.set_state(AdminShopState.waiting_for_product_stock)

@router.message(AdminShopState.waiting_for_product_stock)
async def save_new_product(message: Message, state: FSMContext):
    if message.text == "/cancel": return await state.clear()
    if not message.text.lstrip('-').isdigit(): return await message.answer("عدد معتبر نیست!")
    
    data = await state.get_data()
    async with AsyncSessionLocal() as session:
        session.add(Product(category_id=data['cat_id'], name=data['name'], price=data['price'], description=data['desc'], stock=int(message.text)))
        await session.commit()
        
    cat_id = data['cat_id']
    await state.clear()
    await send_admin_category_details(message, cat_id, prefix_text=f"✅ محصول '{data['name']}' با موفقیت اضافه شد!\n\n")

# --- ویرایش محصول ---
@router.callback_query(F.data.startswith("adm_edit_prod_desc_"))
async def edit_product_description_prompt(callback: CallbackQuery, state: FSMContext):
    parts = callback.data.split("_")
    prod_id = int(parts[4])
    back_page = int(parts[5]) if len(parts) > 5 else 1
    
    await state.update_data(edit_prod_id=prod_id, edit_back_page=back_page)
    
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data=f"adm_prod_{prod_id}_{back_page}", style="danger")
    
    await callback.message.edit_text(
        "📝 <b>ویرایش توضیحات محصول</b>\n\n"
        "لطفاً توضیحات جدید محصول را ارسال کنید (برای پاک کردن توضیحات کلمه 'ندارد' را ارسال کنید):",
        reply_markup=builder.as_markup()
    )
    await state.set_state(AdminShopState.waiting_for_product_desc_edit)
    await callback.answer()

@router.message(AdminShopState.waiting_for_product_desc_edit)
async def save_edited_product_description(message: Message, state: FSMContext):
    data = await state.get_data()
    prod_id = data.get("edit_prod_id")
    back_page = data.get("edit_back_page", 1)
    
    new_desc = message.text.strip()
    if new_desc == "ندارد":
        new_desc = ""
        
    async with AsyncSessionLocal() as session:
        await update_product_field(session, prod_id, "description", new_desc)
        
    await state.clear()
    await send_admin_product_details(message, prod_id, back_page, prefix_text="✅ توضیحات محصول با موفقیت به‌روزرسانی شد.\n\n")

@router.callback_query(F.data.startswith("adm_add_gcs_dir_"))
async def add_giftcards_direct_prompt(callback: CallbackQuery, state: FSMContext):
    parts = callback.data.split("_")
    prod_id = int(parts[4])
    back_page = int(parts[5]) if len(parts) > 5 else 1
    
    await state.update_data(edit_prod_id=prod_id, edit_back_page=back_page)
    
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data=f"adm_prod_{prod_id}_{back_page}", style="danger")
    
    async with AsyncSessionLocal() as session:
        p = await session.get(Product, prod_id)
        prod_name = p.name if p else "نامشخص"
        
    await callback.message.edit_text(
        f"🎁 <b>افزودن گیفت کارت مستقیم برای محصول {prod_name}</b>\n\n"
        f"لطفاً کدهای گیفت کارت را با کاما جدا کرده و ارسال کنید:\n"
        f"مثال:\n<code>CODE1, CODE2, CODE3</code>",
        reply_markup=builder.as_markup()
    )
    await state.set_state(AdminShopState.waiting_for_direct_giftcards)
    await callback.answer()

@router.message(AdminShopState.waiting_for_direct_giftcards)
async def save_direct_giftcards(message: Message, state: FSMContext):
    data = await state.get_data()
    prod_id = data.get("edit_prod_id")
    back_page = data.get("edit_back_page", 1)
    
    codes_str = message.text.strip()
    normalized_str = codes_str.replace("\n", ",").replace("\r", ",").replace(";", ",")
    codes = [c.strip() for c in normalized_str.split(",") if c.strip()]
    
    from database.models import GiftCard
    async with AsyncSessionLocal() as session:
        added = 0
        for code in codes:
            exists = await session.scalar(select(GiftCard).where(GiftCard.code == code))
            if not exists:
                gc = GiftCard(product_id=prod_id, code=code)
                session.add(gc)
                added += 1
        await session.commit()
        
    await state.clear()
    await send_admin_product_details(message, prod_id, back_page, prefix_text=f"✅ تعداد {added} کد گیفت‌کارت با موفقیت به این محصول اضافه شد.\n\n")

@router.callback_query(F.data.startswith("adm_edit_prod_"))
async def edit_product_field(callback: CallbackQuery, state: FSMContext):
    parts = callback.data.split("_")
    prod_id = int(parts[3])
    field = parts[4]
    back_page = int(parts[5]) if len(parts) > 5 else 1
    
    await state.update_data(edit_prod_id=prod_id, edit_field=field, edit_back_page=back_page)
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data=f"adm_prod_{prod_id}_{back_page}", style="danger")
    
    field_name = "قیمت" if field == "price" else "موجودی" if field == "stock" else "نام"
    await callback.message.edit_text(f"مقدار جدید برای <b>{field_name}</b> را وارد کنید (فقط عدد برای قیمت و موجودی):", reply_markup=builder.as_markup())
    await state.set_state(AdminShopState.waiting_for_edit_value)
    await callback.answer()

@router.message(AdminShopState.waiting_for_edit_value)
async def save_edited_product(message: Message, state: FSMContext):
    data = await state.get_data()
    prod_id = data['edit_prod_id']
    field = data['edit_field']
    back_page = data.get('edit_back_page', 1)
    
    val_str = message.text.strip()
    if field in ["price", "stock"]:
        if not val_str.lstrip('-').isdigit():
            return await message.answer("⚠️ لطفاً فقط مقدار عددی وارد کنید!")
        val = int(val_str)
    else:
        val = val_str
        
    async with AsyncSessionLocal() as session:
        await update_product_field(session, prod_id, field, val)
        
    await state.clear()
    await send_admin_product_details(message, prod_id, back_page, prefix_text="✅ محصول با موفقیت بروزرسانی شد.\n\n")

# --- ایمپورت فایل اکسل/CSV از مدیریت فروشگاه ---
@router.callback_query(F.data == "admin_import_excel")
async def import_excel_prompt(callback: CallbackQuery, state: FSMContext):
    if callback.from_user.id not in config.admin_ids: return
    
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ انصراف", callback_data="admin_manage_products_1", style="danger")
    
    await callback.message.edit_text(
        "📥 <b>وارد کردن فایل محصولات (اکسل/CSV)</b>\n\n"
        "لطفاً فایل اکسل (.xlsx, .xls) یا CSV (.csv) خود را ارسال کنید تا دسته‌بندی‌ها و محصولات به طور خودکار ثبت یا به‌روزرسانی شوند:",
        reply_markup=builder.as_markup()
    )
    await state.set_state(AdminShopState.waiting_for_excel_file)
    await callback.answer()

@router.message(AdminShopState.waiting_for_excel_file, F.document)
async def process_excel_import(message: Message, state: FSMContext):
    if message.from_user.id not in config.admin_ids: return
    
    doc = message.document
    import os
    ext = os.path.splitext(doc.file_name)[1].lower()
    
    if ext not in ['.xlsx', '.xls', '.csv']:
        builder = InlineKeyboardBuilder()
        builder.button(text="❌ انصراف", callback_data="admin_manage_products_1", style="danger")
        return await message.answer(
            "⚠️ فرمت فایل نامعتبر است. فقط فایل اکسل (.xlsx, .xls) یا CSV (.csv) ارسال کنید:",
            reply_markup=builder.as_markup()
        )
        
    loading_msg = await message.answer("📥 در حال دریافت و پردازش فایل محصولات...")
    
    file_path = f"utils/products_shop_temp{ext}"
    await message.bot.download(doc, destination=file_path)
    
    from services.excel_service import import_products_from_excel
    async with AsyncSessionLocal() as session:
        result = await import_products_from_excel(session, file_path)
        
    if os.path.exists(file_path):
        os.remove(file_path)
        
    if result["status"] == "success":
        fmt_text = "اکسل" if "excel" in result.get("format", "") else "CSV"
        await loading_msg.delete()
        await send_manage_products_menu(
            message, 
            state, 
            prefix_text=f"✅ <b>فایل {fmt_text} با موفقیت پردازش شد!</b>\nتعداد {result['count']} محصول در دیتابیس با موفقیت ثبت/بروزرسانی شد.\n\n"
        )
    else:
        await loading_msg.delete()
        await send_manage_products_menu(
            message, 
            state, 
            prefix_text=f"❌ <b>خطا در پردازش فایل:</b>\n{result['message']}\n\n"
        )

@router.message(AdminShopState.waiting_for_excel_file)
async def process_excel_import_invalid(message: Message):
    if message.from_user.id not in config.admin_ids: return
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ انصراف", callback_data="admin_manage_products_1", style="danger")
    await message.answer("⚠️ لطفاً فایل اکسل یا CSV معتبر ارسال کنید (متن پذیرفته نیست):", reply_markup=builder.as_markup())
