from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram.types import CopyTextButton

def role_selection_keyboard():
    builder = InlineKeyboardBuilder()
    builder.button(text="👔 کارفرما هستم", callback_data="role_client", style="primary")
    builder.button(text="💻 فریلنسر هستم", callback_data="role_freelancer", style="primary")
    builder.adjust(1)
    return builder.as_markup()

def project_action_keyboard(project_id: int, back_callback_data: str = None):
    builder = InlineKeyboardBuilder()
    builder.button(text="💡 ثبت پیشنهاد", callback_data=f"bid_start_{project_id}", style="success")
    if back_callback_data:
        builder.button(text="🔙 بازگشت به لیست", callback_data=back_callback_data, style="danger")
    builder.adjust(1)
    return builder.as_markup()


def project_list_keyboard(projects, offset: int, total: int, limit: int = 8):
    """Paginated project list."""
    builder = InlineKeyboardBuilder()
    for p in projects:
        builder.button(
            text=f"{'⭐ ' if p['is_featured'] else ''}📌 {p['title'][:30]}",
            callback_data=f"view_project_{p['project_id']}_all_{offset}"
        )
    # Pagination
    nav = []
    if offset > 0:
        nav.append(("⬅️ قبلی", f"projects_page_{offset - limit}"))
    if offset + limit < total:
        nav.append(("بعدی ➡️", f"projects_page_{offset + limit}"))
    for text, data in nav:
        builder.button(text=text, callback_data=data)
    # Layout: projects (1 per row), nav (len(nav) per row)
    builder.adjust(*([1] * len(projects) + ([len(nav)] if nav else [])))
    return builder.as_markup()

def my_projects_keyboard(projects, offset: int, total: int, limit: int = 8):
    builder = InlineKeyboardBuilder()
    for p in projects:
        from utils.texts import PROJECT_STATUS_MAP
        status = PROJECT_STATUS_MAP.get(p['status'], '')
        p_dict = dict(p)
        bid_str = f" | 👥 {p_dict['bid_count']}" if 'bid_count' in p_dict else ""
        builder.button(
            text=f"{status} {p['title'][:22]}{bid_str}",
            callback_data=f"client_project_{p['project_id']}_{offset}"
        )
    # Pagination
    nav = []
    if offset > 0:
        nav.append(("⬅️ قبلی", f"my_projects_page_{offset - limit}"))
    if offset + limit < total:
        nav.append(("بعدی ➡️", f"my_projects_page_{offset + limit}"))
    for text, data in nav:
        builder.button(text=text, callback_data=data)
    builder.adjust(*([1] * len(projects) + ([len(nav)] if nav else [])))
    return builder.as_markup()

def project_management_keyboard(project_id: int, status: str, is_featured: int = 0, is_fulltime: int = 0, has_delivery_file: bool = False, back_callback_data: str = None):
    builder = InlineKeyboardBuilder()
    if status == 'open':
        builder.button(text="👀 مشاهده پیشنهادها", callback_data=f"view_bids_{project_id}", style="success")
        builder.button(text="✏️ ویرایش پروژه", callback_data=f"client_edit_project_{project_id}", style="primary")
        if not is_featured:
            builder.button(text="⭐ ویژه کردن پروژه (۵۰,۰۰۰ تومان)", callback_data=f"promote_project_{project_id}", style="success")
        if not is_fulltime:
            builder.button(text="🌟 ارتقا به تمام‌وقت", callback_data=f"upgrade_fulltime_{project_id}", style="primary")
        builder.button(text="🗑 لغو پروژه", callback_data=f"cancel_project_{project_id}", style="danger")
    elif status == 'in_progress':
        builder.button(text="💬 گفتگو با فریلنسر", callback_data=f"async_chat_fl_{project_id}", style="primary")
        builder.button(text="💰 فازهای پرداخت (Milestones)", callback_data=f"client_milestones_{project_id}", style="success")
        builder.button(text="⚠️ درخواست لغو توافقی", callback_data=f"request_cancel_{project_id}", style="danger")
        builder.button(text="⚖️ ثبت شکایت / داوری", callback_data=f"dispute_project_{project_id}", style="danger")
    elif status == 'delivered':
        builder.button(text="💬 گفتگو با فریلنسر", callback_data=f"async_chat_fl_{project_id}", style="primary")
        builder.button(text="💰 فازهای پرداخت (Milestones)", callback_data=f"client_milestones_{project_id}", style="success")
        builder.button(text="❌ درخواست اصلاحات کار", callback_data=f"revision_project_{project_id}", style="danger")
        if has_delivery_file:
            builder.button(text="📥 دانلود فایل کار تحویل شده", callback_data=f"client_download_delivery_{project_id}", style="primary")
        builder.button(text="⚠️ درخواست لغو توافقی", callback_data=f"request_cancel_{project_id}", style="danger")
        builder.button(text="⚖️ ثبت شکایت / داوری", callback_data=f"dispute_project_{project_id}", style="danger")
    elif status == 'disputed':
        builder.button(text="⚖️ ورود به چت داوری سه‌نفره", callback_data=f"user_enter_dispute_chat_{project_id}", style="primary")
    
    # Aiogram 3.28 CopyTextButton
    builder.button(text="📋 کپی آیدی پروژه", copy_text=CopyTextButton(text=str(project_id)))
    
    if back_callback_data:
        builder.button(text="🔙 بازگشت به لیست پروژه‌ها", callback_data=back_callback_data, style="danger")
        
    builder.adjust(1)
    return builder.as_markup()
        
    builder.adjust(1)
    return builder.as_markup()

def get_freelancer_badges_sync(bid_row) -> str:
    # Convert sqlite Row to dict if needed
    row_dict = dict(bid_row) if hasattr(bid_row, 'keys') else bid_row
    is_verified = row_dict.get('is_verified', 0) or 0
    completed = row_dict.get('completed_projects', 0) or 0
    avg_rating = row_dict.get('avg_rating', 0.0) or 0.0
    
    badges = []
    if is_verified == 1:
        badges.append("🛡️")
    if completed >= 20 and avg_rating >= 4.5:
        badges.append("🥇")
    elif completed >= 5:
        badges.append("🥈")
    else:
        badges.append("🥉")
    return "".join(badges)

def bids_keyboard(bids, project_id: int):
    builder = InlineKeyboardBuilder()
    for bid in bids:
        vip_stars = {1: "🥈 ", 2: "🥇 ", 3: "💎 "}
        vip_star = vip_stars.get(bid['is_vip'], "") if bid['is_vip'] else ""
        boost_label = ""
        try:
            if bid['boost_bids'] > 0:
                boost_label = f" 🚀 [+{bid['boost_bids']}]"
        except:
            pass
        name = bid['full_name'] or bid['username'] or 'ناشناس'
        badges = get_freelancer_badges_sync(bid)
        try:
            avg_rating = bid['avg_rating']
            completed_projects = bid['completed_projects']
        except:
            avg_rating = None
            completed_projects = 0
        
        if completed_projects > 0 and avg_rating is not None:
            rating_str = f" (⭐ {avg_rating:.1f} از {completed_projects} کار)"
        else:
            rating_str = " (جدید)"
            
        builder.button(
            text=f"{vip_star}{badges} {name}{boost_label}{rating_str} — {bid['amount']:,}T",
            callback_data=f"bid_detail_{bid['bid_id']}"
        )
    builder.button(text="🔃 مرتب‌سازی پیشنهادها", callback_data=f"client_sort_bids_menu_{project_id}")
    builder.button(text="🔙 بازگشت", callback_data=f"client_project_{project_id}")
    builder.adjust(*([1] * len(bids) + [1, 1]))
    return builder.as_markup()

def bid_detail_keyboard(bid_id: int, project_id: int, freelancer_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ قبول پیشنهاد", callback_data=f"accept_bid_{bid_id}_{project_id}", style="success")
    builder.button(text="👤 مشاهده پروفایل فریلنسر", callback_data=f"client_view_fl_{freelancer_id}_{bid_id}", style="primary")
    builder.button(text="📂 مشاهده نمونه‌کارهای فریلنسر", callback_data=f"client_view_portfolios_{freelancer_id}_{bid_id}", style="primary")
    builder.button(text="💬 گفتگو با فریلنسر", callback_data=f"chat_start_{bid_id}", style="primary")
    builder.button(text="🔙 بازگشت", callback_data=f"view_bids_{project_id}", style="danger")
    builder.adjust(1)
    return builder.as_markup()

def freelancer_accepted_project_keyboard(project_id: int, project_status: str):
    builder = InlineKeyboardBuilder()
    if project_status == 'in_progress':
        builder.button(text="💬 گفتگو با کارفرما", callback_data=f"async_chat_client_{project_id}", style="primary")
        builder.button(text="📤 تحویل پروژه / ارسال فایل کار", callback_data=f"freelancer_deliver_{project_id}", style="success")
        builder.button(text="⚠️ درخواست لغو توافقی", callback_data=f"request_cancel_{project_id}", style="danger")
        builder.button(text="⚖️ ثبت شکایت / داوری", callback_data=f"dispute_project_{project_id}", style="danger")
    elif project_status == 'delivered':
        builder.button(text="💬 گفتگو با کارفرما", callback_data=f"async_chat_client_{project_id}", style="primary")
        builder.button(text="⏳ منتظر تأیید و تسویه کارفرما", callback_data="noop", style="primary")
        builder.button(text="⚠️ درخواست لغو توافقی", callback_data=f"request_cancel_{project_id}", style="danger")
        builder.button(text="⚖️ ثبت شکایت / داوری", callback_data=f"dispute_project_{project_id}", style="danger")
    elif project_status == 'completed':
        builder.button(text="✅ پروژه تمام و تسویه شد", callback_data="noop", style="success")
    elif project_status == 'disputed':
        builder.button(text="⚖️ ورود به چت داوری سه‌نفره", callback_data=f"user_enter_dispute_chat_{project_id}", style="primary")
        
    builder.button(text="📋 کپی آیدی پروژه", copy_text=CopyTextButton(text=str(project_id)))
    builder.adjust(1)
    return builder.as_markup()

def stars_rating_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    for i in range(1, 6):
        builder.button(text=f"{i} ⭐", callback_data=f"rate_{i}_{project_id}")
    builder.adjust(5)
    return builder.as_markup()

def join_channel_keyboard(channel_url: str):
    builder = InlineKeyboardBuilder()
    builder.button(text="📢 عضویت در کانال", url=channel_url)
    return builder.as_markup()

def skip_rating_review_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="⏭ رد کردن ثبت نظر", callback_data=f"skip_review_{project_id}")
    builder.adjust(1)
    return builder.as_markup()

def stars_rating_client_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    for i in range(1, 6):
        builder.button(text=f"{i} ⭐", callback_data=f"rate_client_{i}_{project_id}")
    builder.adjust(5)
    return builder.as_markup()

def skip_rating_client_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="⏭ رد کردن ثبت نظر", callback_data=f"skip_review_client_{project_id}")
    builder.adjust(1)
    return builder.as_markup()

def freelancer_profile_keyboard(is_verified: int = 1):
    builder = InlineKeyboardBuilder()
    builder.button(text="✏️ ویرایش مهارت‌ها", callback_data="profile_edit_skills", style="primary")
    builder.button(text="✏️ ویرایش بیوگرافی", callback_data="profile_edit_bio", style="primary")
    builder.button(text="📂 مدیریت نمونه‌کارها", callback_data="profile_portfolio_menu", style="primary")
    builder.button(text="🎓 آزمون‌های مهارت", callback_data="profile_quiz_menu", style="primary")
    if is_verified != 1:
        builder.button(text="🔐 احراز هویت (تایید هویت حساب)", callback_data="profile_start_verification", style="danger")
    builder.adjust(2, 2, 1 if is_verified != 1 else 0)
    return builder.as_markup()

def cancel_resolution_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ موافقت با لغو و برگشت وجه", callback_data=f"cancel_approve_{project_id}", style="danger")
    builder.button(text="❌ مخالفت با لغو (ادامه پروژه)", callback_data=f"cancel_reject_{project_id}", style="success")
    builder.adjust(1)
    return builder.as_markup()

def my_bids_keyboard(bids, offset: int, total: int, limit: int = 8):
    builder = InlineKeyboardBuilder()
    for bid in bids:
        status_icons = {'pending': '⏳', 'accepted': '✅', 'rejected': '❌'}
        icon = status_icons.get(bid['status'], '❓')
        builder.button(
            text=f"{icon} {bid['project_title'][:30]}",
            callback_data=f"bid_info_{bid['bid_id']}_{offset}"
        )
    # Pagination
    nav = []
    if offset > 0:
        nav.append(("⬅️ قبلی", f"my_bids_page_{offset - limit}"))
    if offset + limit < total:
        nav.append(("بعدی ➡️", f"my_bids_page_{offset + limit}"))
    for text, data in nav:
        builder.button(text=text, callback_data=data)
    builder.adjust(*([1] * len(bids) + ([len(nav)] if nav else [])))
    return builder.as_markup()

def vip_tier_keyboard(is_extension: bool = False):
    builder = InlineKeyboardBuilder()
    label = "تمدید" if is_extension else "انتخاب"
    builder.button(text=f"🥉 {label} سطح برنزی", callback_data="select_vip_tier_1", style="primary")
    builder.button(text=f"🥈 {label} سطح نقره‌ای", callback_data="select_vip_tier_2", style="primary")
    builder.button(text=f"🥇 {label} سطح طلایی", callback_data="select_vip_tier_3", style="success")
    builder.adjust(1)
    return builder.as_markup()

def vip_duration_keyboard(tier: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="اشتراک ۱ ماهه", callback_data=f"buy_vip_{tier}_1", style="primary")
    builder.button(text="اشتراک ۳ ماهه", callback_data=f"buy_vip_{tier}_3", style="primary")
    builder.button(text="اشتراک ۶ ماهه", callback_data=f"buy_vip_{tier}_6", style="primary")
    builder.button(text="اشتراک سالانه", callback_data=f"buy_vip_{tier}_12", style="success")
    builder.button(text="🔙 انصراف / بازگشت", callback_data="back_to_vip_tiers", style="danger")
    builder.adjust(2, 2, 1)
    return builder.as_markup()

def wallet_keyboard(role: str = 'client'):
    builder = InlineKeyboardBuilder()
    builder.button(text="💳 شارژ دلخواه", callback_data="wallet_deposit_custom", style="success")
    builder.button(text="🎁 ثبت کد هدیه", callback_data="wallet_redeem_promo", style="primary")
    builder.button(text="📜 تاریخچه تراکنش‌ها", callback_data="wallet_tx_history", style="primary")
    if role == 'freelancer':
        builder.button(text="🪙 خرید بسته بید (پیشنهاد)", callback_data="wallet_buy_bids_menu", style="primary")
    builder.button(text="💳 درخواست تسویه حساب (برداشت)", callback_data="wallet_withdraw_start", style="danger")
    if role == 'freelancer':
        builder.adjust(2, 1, 1, 1)
    else:
        builder.adjust(2, 1, 1)
    return builder.as_markup()
    return builder.as_markup()

def admin_keyboard(pending_verifs: int = 0, pending_projs: int = 0, pending_withdraws: int = 0, pending_deposits: int = 0, pending_tickets: int = 0):
    builder = InlineKeyboardBuilder()
    builder.button(text="📊 آمار کلی", callback_data="admin_stats", style="primary")
    builder.button(text="👥 لیست کاربران", callback_data="admin_users", style="primary")
    builder.button(text="🔍 جستجوی کاربر (CRM)", callback_data="admin_search_user", style="primary")
    builder.button(text="⚖️ پرداخت‌های امن فعال", callback_data="admin_escrows", style="primary")
    
    withdraw_label = f"💸 درخواست‌های تسویه ({pending_withdraws})" if pending_withdraws > 0 else "💸 درخواست‌های تسویه"
    builder.button(text=withdraw_label, callback_data="admin_withdrawals", style="danger")
    
    builder.button(text="⚖️ پروژه‌های مورد اختلاف", callback_data="admin_disputes", style="danger")
    
    proj_label = f"📌 پروژه‌های در انتظار تایید ({pending_projs})" if pending_projs > 0 else "📌 پروژه‌های در انتظار تایید"
    builder.button(text=proj_label, callback_data="admin_pending_projects", style="danger")
    
    verif_label = f"🔐 درخواست‌های تایید هویت ({pending_verifs})" if pending_verifs > 0 else "🔐 درخواست‌های تایید هویت"
    builder.button(text=verif_label, callback_data="admin_pending_verifications", style="danger")
    
    deposit_label = f"💳 تایید فیش‌ها ({pending_deposits})" if pending_deposits > 0 else "💳 تایید فیش‌ها"
    builder.button(text=deposit_label, callback_data="admin_pending_deposits", style="danger")
    
    ticket_label = f"📞 تیکت‌های پشتیبانی ({pending_tickets})" if pending_tickets > 0 else "📞 تیکت‌های پشتیبانی"
    builder.button(text=ticket_label, callback_data="admin_pending_tickets", style="danger")
    
    builder.button(text="🎁 مدیریت کدهای تخفیف", callback_data="admin_promos", style="success")
    builder.button(text="⚙️ تنظیمات پلتفرم", callback_data="admin_platform_settings", style="success")
    builder.button(text="📢 ارسال پیام همگانی", callback_data="admin_broadcast", style="success")
    builder.button(text="👥 مدیریت مدیران (Admins)", callback_data="admin_manage_admins", style="success")
    builder.adjust(2, 2, 2, 2, 2, 2, 2)
    return builder.as_markup()

def admin_manage_admins_keyboard(admins_info, static_admin_ids):
    builder = InlineKeyboardBuilder()
    for admin in admins_info:
        uid = admin['user_id']
        name = admin.get('full_name') or "کاربر ناشناس"
        username = f"@{admin['username']}" if admin.get('username') else f"ID: {uid}"
        
        label = f"👤 {name} ({username})"
        
        if uid in static_admin_ids:
            builder.button(text=f"👑 {label}", callback_data=f"admin_view_admin_{uid}")
            builder.button(text="🔒 غیرقابل حذف", callback_data="admin_static_explain")
        else:
            builder.button(text=label, callback_data=f"admin_view_admin_{uid}")
            builder.button(text="❌ حذف ادمین", callback_data=f"admin_remove_admin_{uid}")
            
    builder.button(text="➕ افزودن مدیر جدید", callback_data="admin_add_admin_start")
    builder.button(text="🔙 بازگشت به پنل", callback_data="admin_back_to_panel")
    
    adjust_pattern = [2] * len(admins_info) + [1, 1]
    builder.adjust(*adjust_pattern)
    return builder.as_markup()

def confirm_keyboard(yes_data: str, no_data: str = "back"):
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ بله", callback_data=yes_data, style="success")
    builder.button(text="❌ خیر", callback_data=no_data, style="danger")
    builder.adjust(2)
    return builder.as_markup()

def search_mode_keyboard():
    builder = InlineKeyboardBuilder()
    builder.button(text="📁 مشاهده همه پروژه‌ها (اینلاین)", switch_inline_query_current_chat="")
    builder.button(text="🔎 جستجو با کلمه کلیدی (اینلاین)", switch_inline_query_current_chat="")
    builder.button(text="🎯 پروژه‌های منطبق با مهارت‌های من", callback_data="projects_list_matching_skills")
    builder.button(text="💵 جستجو بر اساس حداقل بودجه", callback_data="projects_search_budget")
    builder.adjust(1)
    return builder.as_markup()

def project_search_list_keyboard(projects, offset: int, total: int, limit: int = 8):
    builder = InlineKeyboardBuilder()
    for p in projects:
        builder.button(
            text=f"{'⭐ ' if p['is_featured'] else ''}📌 {p['title'][:30]}",
            callback_data=f"view_project_{p['project_id']}_search_{offset}"
        )
    # Pagination
    nav = []
    if offset > 0:
        nav.append(("⬅️ قبلی", f"psearch_page_{offset - limit}"))
    if offset + limit < total:
        nav.append(("بعدی ➡️", f"psearch_page_{offset + limit}"))
    for text, data in nav:
        builder.button(text=text, callback_data=data)
    builder.button(text="🔙 جستجوی مجدد", callback_data="projects_search_start")
    builder.adjust(*([1] * len(projects) + ([len(nav)] if nav else []) + [1]))
    return builder.as_markup()

def admin_withdrawal_keyboard(withdrawal_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ تایید و واریز", callback_data=f"admin_withdraw_approve_{withdrawal_id}")
    builder.button(text="❌ رد درخواست", callback_data=f"admin_withdraw_reject_{withdrawal_id}")
    builder.adjust(2)
    return builder.as_markup()

def project_skills_list_keyboard(projects, offset: int, total: int, limit: int = 8):
    builder = InlineKeyboardBuilder()
    for p in projects:
        builder.button(
            text=f"{'⭐ ' if p['is_featured'] else ''}📌 {p['title'][:30]}",
            callback_data=f"view_project_{p['project_id']}_skills_{offset}"
        )
    # Pagination
    nav = []
    if offset > 0:
        nav.append(("⬅️ قبلی", f"pskills_page_{offset - limit}"))
    if offset + limit < total:
        nav.append(("بعدی ➡️", f"pskills_page_{offset + limit}"))
    for text, data in nav:
        builder.button(text=text, callback_data=data)
    builder.button(text="🔙 بازگشت به منوی جستجو", callback_data="projects_find_back")
    builder.adjust(*([1] * len(projects) + ([len(nav)] if nav else []) + [1]))
    return builder.as_markup()

def portfolios_keyboard(portfolios):
    builder = InlineKeyboardBuilder()
    for item in portfolios:
        builder.button(
            text=f"📂 {item['title'][:30]}",
            callback_data=f"portfolio_view_{item['portfolio_id']}"
        )
    builder.button(text="➕ افزودن نمونه‌کار جدید", callback_data="portfolio_add_start")
    builder.button(text="🔙 بازگشت به پروفایل", callback_data="profile_view_back")
    builder.adjust(1)
    return builder.as_markup()

def portfolio_detail_keyboard(portfolio_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="🗑 حذف نمونه‌کار", callback_data=f"portfolio_delete_{portfolio_id}")
    builder.button(text="🔙 بازگشت", callback_data="profile_portfolio_menu")
    builder.adjust(1)
    return builder.as_markup()

def client_portfolios_list_keyboard(portfolios, freelancer_id: int, bid_id: int):
    builder = InlineKeyboardBuilder()
    for item in portfolios:
        builder.button(
            text=f"📂 {item['title'][:30]}",
            callback_data=f"client_view_p_item_{item['portfolio_id']}_{bid_id}"
        )
    builder.button(text="🔙 بازگشت به پیشنهاد", callback_data=f"bid_detail_{bid_id}")
    builder.adjust(1)
    return builder.as_markup()

def client_portfolio_detail_keyboard(freelancer_id: int, bid_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="🔙 بازگشت به نمونه‌کارها", callback_data=f"client_view_portfolios_{freelancer_id}_{bid_id}")
    builder.adjust(1)
    return builder.as_markup()

def rate_client_stars_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    for i in range(1, 6):
        builder.button(text=f"{i} ⭐", callback_data=f"rateclient_{i}_{project_id}")
    builder.adjust(5)
    return builder.as_markup()

def skip_client_rating_review_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="⏭ رد کردن ثبت نظر", callback_data=f"skip_client_review_{project_id}")
    builder.adjust(1)
    return builder.as_markup()

def transactions_list_keyboard(offset: int, total: int, limit: int = 10):
    builder = InlineKeyboardBuilder()
    nav = []
    if offset > 0:
        nav.append(("⬅️ قبلی", f"tx_history_page_{offset - limit}"))
    if offset + limit < total:
        nav.append(("بعدی ➡️", f"tx_history_page_{offset + limit}"))
    for text, data in nav:
        builder.button(text=text, callback_data=data)
    builder.button(text="🔙 بازگشت به کیف پول", callback_data="wallet_menu_back")
    builder.adjust(*([len(nav)] if nav else []) + [1])
    return builder.as_markup()

def bid_sorting_options_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="🌟 اولویت با VIP", callback_data=f"client_sort_bids_{project_id}_vip")
    builder.button(text="💵 کمترین بودجه", callback_data=f"client_sort_bids_{project_id}_budget_asc")
    builder.button(text="⭐ بالاترین امتیاز", callback_data=f"client_sort_bids_{project_id}_rating_desc")
    builder.button(text="⏱ سریع‌ترین تحویل", callback_data=f"client_sort_bids_{project_id}_delivery_asc")
    builder.button(text="🔙 بازگشت به پیشنهادها", callback_data=f"view_bids_{project_id}")
    builder.adjust(1)
    return builder.as_markup()

def admin_verification_decision_keyboard(user_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ تایید هویت", callback_data=f"admin_verify_approve_{user_id}", style="success")
    builder.button(text="❌ رد درخواست", callback_data=f"admin_verify_reject_{user_id}", style="danger")
    builder.adjust(2)
    return builder.as_markup()

def admin_project_approval_decision_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ تایید پروژه", callback_data=f"admin_proj_approve_{project_id}", style="success")
    builder.button(text="❌ رد پروژه", callback_data=f"admin_proj_reject_{project_id}", style="danger")
    builder.adjust(2)
    return builder.as_markup()

SETTINGS_LABELS = {
    'commission_free': 'کمیسیون کاربر عادی (درصد)',
    'commission_vip': 'کمیسیون کاربر VIP (درصد) - قدیمی',
    'vip_monthly_price': 'هزینه اشتراک VIP (تومان) - قدیمی',
    'vip_bronze_price': 'هزینه VIP برنزی (تومان)',
    'vip_silver_price': 'هزینه VIP نقره‌ای (تومان)',
    'vip_gold_price': 'هزینه VIP طلایی (تومان)',
    'commission_bronze': 'کمیسیون VIP برنزی (درصد)',
    'commission_silver': 'کمیسیون VIP نقره‌ای (درصد)',
    'commission_gold': 'کمیسیون VIP طلایی (درصد)',
    'featured_project_price': 'هزینه ویژه کردن پروژه (تومان)',
    'max_free_bids': 'سهمیه بید رایگان ماهانه',
    'connects_monthly_bronze': 'سهمیه بید ماهانه VIP برنزی',
    'connects_monthly_silver': 'سهمیه بید ماهانه VIP نقره‌ای',
    'connects_monthly_gold': 'سهمیه بید ماهانه VIP طلایی',
    'channel_id': 'آیدی کانال تلگرام پروژه‌ها',
    'admin_card': 'شماره کارت مدیریت',
    'admin_card_name': 'نام صاحب کارت',
    'invite_reward': 'پاداش دعوت نقدی (تومان)',
    'default_connects': 'بید هدیه اولیه ثبت‌نام',
    'invite_connects': 'بید هدیه پاداش دعوت',
    'bid_pack_10_price': 'قیمت بسته ۱۰ بید (تومان)',
    'bid_pack_30_price': 'قیمت بسته ۳۰ بید (تومان)',
    'bid_pack_100_price': 'قیمت بسته ۱۰۰ بید (تومان)',
    'fulltime_project_price': 'هزینه ثبت پروژه تمام‌وقت (تومان)',
    'last_monthly_grant_month': 'آخرین ماه تخصیص کانکت رایگان',
    'zarinpal_enabled': 'درگاه زرین‌پال فعال (۱/۰)',
    'zarinpal_merchant': 'مرچنت کد زرین‌پال',
    'zarinpal_sandbox': 'زرین‌پال سندباکس (۱/۰)',
    'zibal_enabled': 'درگاه زیبال فعال (۱/۰)',
    'zibal_merchant': 'مرچنت کد زیبال',
    'card_to_card_enabled': 'کارت به کارت فعال (۱/۰)',
    'payment_callback_domain': 'دامنه کال‌بک پرداخت',
    'bot_status': 'وضعیت ربات (۱: فعال / ۰: تعمیرات)',
    'bot_domain': 'دامنه/IP وب‌سرور ربات',
    'min_project_budget': 'حداقل بودجه ثبت پروژه (تومان)',
    'min_wallet_deposit': 'حداقل شارژ کیف پول (تومان)',
    'min_wallet_withdraw': 'حداقل برداشت از کیف پول (تومان)',
    'admin_group_payments': 'گروه بررسی پرداخت‌ها (واریز/برداشت)',
    'admin_group_disputes': 'گروه بررسی داوری و اختلافات',
    'admin_group_services': 'گروه بررسی خدمات فریلنسرها',
    'admin_group_projects': 'گروه بررسی پروژه‌ها',
    'admin_group_support': 'گروه پشتیبانی و تیکت‌ها',
    'admin_group_verifications': 'گروه تایید هویت کاربران',
    'join_mandatory': 'عضویت اجباری کانال (۱/۰)'
}

def admin_settings_categories_keyboard():
    builder = InlineKeyboardBuilder()
    builder.button(text="💰 تعرفه‌ها و هزینه‌ها", callback_data="admin_settings_cat_tariffs", style="primary")
    builder.button(text="🪙 کانکت‌ها و هدایا", callback_data="admin_settings_cat_connects", style="primary")
    builder.button(text="💳 درگاه‌های پرداخت", callback_data="admin_settings_cat_gateways", style="primary")
    builder.button(text="📢 تنظیمات عمومی ربات", callback_data="admin_settings_cat_general", style="primary")
    builder.button(text="👥 گروه‌های بررسی ادمین", callback_data="admin_settings_cat_groups", style="primary")
    builder.button(text="🔙 بازگشت به پنل", callback_data="admin_back_to_panel", style="danger")
    builder.adjust(1)
    return builder.as_markup()

SETTINGS_CATEGORIES = {
    'tariffs': ['commission_free', 'commission_bronze', 'commission_silver', 'commission_gold', 'vip_bronze_price', 'vip_silver_price', 'vip_gold_price', 'featured_project_price', 'fulltime_project_price', 'min_project_budget', 'min_wallet_deposit', 'min_wallet_withdraw'],
    'connects': ['max_free_bids', 'connects_monthly_bronze', 'connects_monthly_silver', 'connects_monthly_gold', 'default_connects', 'invite_connects', 'invite_reward', 'bid_pack_10_price', 'bid_pack_30_price', 'bid_pack_100_price'],
    'gateways': ['zarinpal_enabled', 'zarinpal_merchant', 'zarinpal_sandbox', 'zibal_enabled', 'zibal_merchant', 'card_to_card_enabled', 'payment_callback_domain', 'admin_card', 'admin_card_name'],
    'general': ['channel_id', 'join_mandatory', 'bot_status', 'bot_domain', 'last_monthly_grant_month'],
    'groups': ['admin_group_payments', 'admin_group_disputes', 'admin_group_services', 'admin_group_projects', 'admin_group_support', 'admin_group_verifications']
}

def admin_settings_keyboard(settings, category: str):
    builder = InlineKeyboardBuilder()
    allowed_keys = SETTINGS_CATEGORIES.get(category, [])
    toggle_keys = ['bot_status', 'zarinpal_enabled', 'zarinpal_sandbox', 'zibal_enabled', 'card_to_card_enabled', 'join_mandatory']
    for s in settings:
        if s['key'] in allowed_keys:
            label = SETTINGS_LABELS.get(s['key'], s['key'])
            if s['key'] in toggle_keys:
                is_on = s['value'] == '1'
                status_icon = "🟢" if is_on else "🔴"
                clean_label = label.replace(" (۱/۰)", "").replace(" (۱: فعال / ۰: تعمیرات)", "")
                if s['key'] == 'bot_status':
                    status_text = "فعال" if is_on else "تعمیرات"
                else:
                    status_text = "روشن" if is_on else "خاموش"
                builder.button(
                    text=f"{status_icon} {clean_label}: {status_text}",
                    callback_data=f"admin_toggle_setting_{s['key']}_{category}",
                    style="success" if is_on else "danger"
                )
            else:
                val_text = s['value']
                btn_style = "primary"
                if s['key'].startswith('admin_group_'):
                    if not val_text or not val_text.strip():
                        val_text = "❌ پیش‌فرض (همه ادمین‌ها)"
                        btn_style = "danger"
                    else:
                        val_text = f"✅ {val_text}"
                        btn_style = "success"
                    builder.button(
                        text=f"{label}: {val_text}",
                        callback_data=f"admin_edit_setting_{s['key']}",
                        style=btn_style
                    )
                else:
                    val_display = val_text
                    if s['key'] == 'last_monthly_grant_month' and val_text:
                        try:
                            parts = val_text.split('-')
                            if len(parts) == 2 and len(parts[0]) == 4 and len(parts[1]) == 2:
                                gy, gm = int(parts[0]), int(parts[1])
                                import jdatetime
                                jdt = jdatetime.date.fromgregorian(year=gy, month=gm, day=1)
                                jalali_months = [
                                    "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور",
                                    "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند"
                                ]
                                shamsi_month_name = jalali_months[jdt.month - 1]
                                val_display = f"{jdt.year}/{jdt.month:02d} ({shamsi_month_name} {jdt.year}) - [{val_text}]"
                        except Exception as e:
                            pass
                    builder.button(
                        text=f"✏️ {label}: {val_display}",
                        callback_data=f"admin_edit_setting_{s['key']}",
                        style=btn_style
                    )
    builder.button(text="🔙 بازگشت به تنظیمات", callback_data="admin_platform_settings", style="danger")
    builder.adjust(1)
    return builder.as_markup()

def admin_users_pagination_keyboard(users, offset: int, total: int, limit: int = 10):
    builder = InlineKeyboardBuilder()
    for u in users:
        role_icon = "👔" if u['role'] == 'client' else "💻"
        vip_icon = "⭐" if u['is_vip'] else ""
        ban_icon = "🚫" if u['is_banned'] else ""
        name = u['full_name'] or u['username'] or str(u['user_id'])
        builder.button(
            text=f"{role_icon}{vip_icon}{ban_icon} {name} ({u['balance']:,}₸)",
            callback_data=f"admin_crm_user_{u['user_id']}"
        )
    # Pagination
    nav = []
    if offset > 0:
        nav.append(("⬅️ قبلی", f"admin_users_page_{offset - limit}"))
    if offset + limit < total:
        nav.append(("بعدی ➡️", f"admin_users_page_{offset + limit}"))
    for text, data in nav:
        builder.button(text=text, callback_data=data)
    builder.button(text="🔙 بازگشت به پنل", callback_data="admin_back_to_panel")
    
    adjust_pattern = [1] * len(users)
    if nav:
        adjust_pattern.append(len(nav))
    adjust_pattern.append(1)
    builder.adjust(*adjust_pattern)
    return builder.as_markup()

def deposit_methods_keyboard(amount: int, card_active: bool, zarinpal_active: bool, zibal_active: bool):
    builder = InlineKeyboardBuilder()
    if zarinpal_active:
        builder.button(text="💎 پرداخت آنلاین زرین‌پال", callback_data=f"deposit_method_zarinpal_{amount}")
    if zibal_active:
        builder.button(text="🌀 پرداخت آنلاین زیبال", callback_data=f"deposit_method_zibal_{amount}")
    if card_active:
        builder.button(text="💳 کارت به کارت (دستی)", callback_data=f"deposit_method_card_{amount}")
    builder.button(text="🔙 انصراف", callback_data="wallet_menu_back")
    builder.adjust(1)
    return builder.as_markup()

def admin_ticket_action_keyboard(ticket_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="✍️ پاسخ به تیکت", callback_data=f"admin_ticket_reply_{ticket_id}")
    builder.button(text="❌ بستن تیکت", callback_data=f"admin_ticket_close_{ticket_id}")
    builder.adjust(2)
    return builder.as_markup()

def project_creation_confirmation_keyboard():
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ تایید و ارسال جهت بررسی", callback_data="project_confirm_submit")
    builder.button(text="❌ لغو و انصراف", callback_data="project_confirm_cancel")
    builder.adjust(1)
    return builder.as_markup()


def onboarding_step_1():
    builder = InlineKeyboardBuilder()
    builder.button(text="بعدی ➡️", callback_data="onboarding_2")
    return builder.as_markup()

def onboarding_step_2():
    builder = InlineKeyboardBuilder()
    builder.button(text="🎯 بزن بریم!", callback_data="onboarding_done")
    return builder.as_markup()

def category_inline_menu():
    cats = [
        "💻 برنامه‌نویسی و وب", "🎨 طراحی گرافیک و UI/UX",
        "📝 تولید محتوا و نویسندگی", "🗣 ترجمه و تایپ",
        "📈 دیجیتال مارکتینگ و سئو", "📱 ادمین شبکه‌های اجتماعی",
        "🎬 تدوین ویدیو و انیمیشن", "🎵 صداگذاری و موسیقی",
        "📐 معماری و نقشه‌کشی", "📊 مهندسی و علوم داده",
        "📱 برنامه‌نویسی موبایل", "🤖 توسعه ربات تلگرام",
        "💼 مشاوره کسب‌وکار", "🏫 آموزش و تدریس خصوصی",
        "📞 پشتیبانی مشتریان", "🌐 سایر زمینه‌ها"
    ]
    builder = InlineKeyboardBuilder()
    for cat in cats:
        builder.button(text=cat, callback_data=f"selcat_{cat}")
    builder.button(text="🔙 لغو و بازگشت", callback_data="cancel_fsm")
    builder.adjust(2)
    return builder.as_markup()

def project_type_inline_menu():
    builder = InlineKeyboardBuilder()
    builder.button(text="💼 پروژه‌ای (مقطعی)", callback_data="seltype_project")
    builder.button(text="👔 تمام‌وقت / استخدام", callback_data="seltype_full_time")
    builder.button(text="🔙 لغو و بازگشت", callback_data="cancel_fsm")
    builder.adjust(1)
    return builder.as_markup()


def service_list_keyboard(services, offset: int, total: int, limit: int = 10, is_freelancer: bool = False):
    builder = InlineKeyboardBuilder()
    for s in services:
        prefix = "edit" if is_freelancer else "view"
        status_label = ""
        if is_freelancer:
            status = s.get('status', 'approved')
            if status == 'pending':
                status_label = " (⏳ در انتظار تایید)"
            elif status == 'rejected':
                status_label = " (❌ رد شده)"
        builder.button(text=f"🛍 {s['title'][:20]}{status_label} - {s['price']:,}T", callback_data=f"{prefix}_service_{s['service_id']}")
    
    if is_freelancer:
        builder.button(text="➕ ایجاد خدمت جدید", callback_data="create_service_start", style="success")
        
    nav = []
    if offset > 0:
        nav.append(("⬅️ قبلی", f"services_page_{offset - limit}"))
    if offset + limit < total:
        nav.append(("بعدی ➡️", f"services_page_{offset + limit}"))
    for text, data in nav:
        builder.button(text=text, callback_data=data)
        
    builder.adjust(*([1] * len(services) + ([1] if is_freelancer else []) + ([len(nav)] if nav else [])))
    return builder.as_markup()

def service_action_keyboard(service_id: int, is_freelancer: bool = False):
    builder = InlineKeyboardBuilder()
    if is_freelancer:
        builder.button(text="❌ حذف این خدمت", callback_data=f"delete_service_{service_id}", style="danger")
    else:
        builder.button(text="💳 خرید این خدمت (پرداخت امن)", callback_data=f"buy_service_{service_id}", style="success")
    builder.adjust(1)
    return builder.as_markup()

def admin_service_approval_keyboard(service_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ تایید خدمت", callback_data=f"admin_svc_approve_{service_id}", style="success")
    builder.button(text="❌ رد خدمت", callback_data=f"admin_svc_reject_{service_id}", style="danger")
    builder.adjust(2)
    return builder.as_markup()

def admin_tickets_filter_keyboard(open_count: int, resolved_count: int):
    builder = InlineKeyboardBuilder()
    builder.button(text=f"🟢 تیکت‌های باز ({open_count})", callback_data="admin_tickets_filter_open")
    builder.button(text=f"🔴 تیکت‌های حل شده ({resolved_count})", callback_data="admin_tickets_filter_resolved")
    builder.button(text="🔙 بازگشت به پنل ادمین", callback_data="admin_back_to_panel")
    builder.adjust(2, 1)
    return builder.as_markup()

def admin_dispute_split_keyboard(project_id: int):
    builder = InlineKeyboardBuilder()
    builder.button(text="🥇 ۱۰۰٪ فریلنسر (آزادسازی کل وجه)", callback_data=f"admin_escrow_release_{project_id}")
    builder.button(text="👔 ۱۰۰٪ کارفرما (استرداد کل وجه)", callback_data=f"admin_escrow_refund_{project_id}")
    builder.button(text="🌓 ۵۰ / ۵۰ نصف نصف", callback_data=f"admin_dispute_split_50_50_{project_id}")
    builder.button(text="✏️ تقسیم سهم دستی / دلخواه", callback_data=f"admin_dispute_split_custom_{project_id}")
    builder.button(text="🔙 بازگشت به پرونده", callback_data=f"admin_view_dispute_{project_id}")
    builder.adjust(1)
    return builder.as_markup()

