import asyncio
import logging
from aiogram import Bot, Dispatcher, F, Router
from aiogram.filters import Command, StateFilter
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.types import Message, CallbackQuery
from aiogram.fsm.storage.memory import MemoryStorage

import config
from database import Database
import keyboards as kb

# Настройка логирования
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Инициализация бота и диспетчера
bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(storage=storage)
router = Router()

# База данных
db = Database()

# Состояния для FSM
class CreateServer(StatesGroup):
    waiting_for_name = State()

class SetupFTP(StatesGroup):
    server_id = State()
    waiting_for_data = State()

class SetupDB(StatesGroup):
    server_id = State()
    waiting_for_data = State()

class EditCfg(StatesGroup):
    server_id = State()
    waiting_for_content = State()

class BanUser(StatesGroup):
    waiting_for_id = State()

class UnbanUser(StatesGroup):
    waiting_for_id = State()

class AssignRole(StatesGroup):
    waiting_for_user_id = State()
    waiting_for_role_id = State()

class AssignIngameRank(StatesGroup):
    waiting_for_user_id = State()
    waiting_for_rank = State()

class CreateRole(StatesGroup):
    waiting_for_name = State()

class GrantServerAccess(StatesGroup):
    server_id = State()
    waiting_for_user_id = State()

# Проверка прав доступа
def is_admin(user_id: int) -> bool:
    return user_id == config.ADMIN_ID

async def check_banned(user_id: int) -> bool:
    return await db.is_user_banned(user_id)

# ===== ОБРАБОТЧИКИ КОМАНД =====

@router.message(Command("start"))
async def cmd_start(message: Message):
    user_id = message.from_user.id
    
    # Проверка бана
    if await check_banned(user_id):
        await message.answer("❌ Вы заблокированы и не можете использовать этого бота.")
        return
    
    # Добавляем пользователя в БД
    await db.add_user(
        user_id=user_id,
        username=message.from_user.username,
        first_name=message.from_user.first_name
    )
    
    welcome_text = f"👋 Привет, {message.from_user.first_name}!\n\n"
    welcome_text += "Это бот для управления сервером.\n"
    welcome_text += "Используй кнопки ниже для навигации."
    
    await message.answer(
        welcome_text,
        reply_markup=kb.main_menu(is_admin=is_admin(user_id))
    )

@router.message(Command("menu"))
async def cmd_menu(message: Message):
    user_id = message.from_user.id
    
    if await check_banned(user_id):
        await message.answer("❌ Вы заблокированы и не можете использовать этого бота.")
        return
    
    await message.answer(
        "📱 Главное меню:",
        reply_markup=kb.main_menu(is_admin=is_admin(user_id))
    )

# ===== ГЛАВНОЕ МЕНЮ =====

@router.callback_query(F.data == "main_menu")
async def show_main_menu(callback: CallbackQuery, state: FSMContext):
    await state.clear()
    user_id = callback.from_user.id
    
    await callback.message.edit_text(
        "📱 Главное меню:",
        reply_markup=kb.main_menu(is_admin=is_admin(user_id))
    )
    await callback.answer()

@router.callback_query(F.data == "my_servers")
async def show_my_servers(callback: CallbackQuery):
    user_id = callback.from_user.id
    
    if is_admin(user_id):
        servers = await db.get_all_servers()
    else:
        servers = await db.get_user_servers(user_id)
    
    if not servers:
        await callback.message.edit_text(
            "У вас нет доступа ни к одному серверу.",
            reply_markup=kb.back_to_main()
        )
    else:
        await callback.message.edit_text(
            "🎮 Ваши серверы:",
            reply_markup=kb.servers_list_keyboard(servers, prefix="manage_server")
        )
    await callback.answer()

@router.callback_query(F.data.startswith("manage_server_"))
async def manage_server(callback: CallbackQuery):
    server_id = int(callback.data.split("_")[2])
    user_id = callback.from_user.id
    
    # Проверка доступа
    if not is_admin(user_id):
        has_access = await db.has_server_access(user_id, server_id)
        if not has_access:
            await callback.answer("❌ У вас нет доступа к этому серверу!", show_alert=True)
            return
    
    server = await db.get_server(server_id)
    
    text = f"🖥️ Сервер: {server['name']}\n\n"
    text += "Выберите действие:"
    
    await callback.message.edit_text(
        text,
        reply_markup=kb.server_control_panel(server_id)
    )
    await callback.answer()

@router.callback_query(F.data == "my_role")
async def show_my_role(callback: CallbackQuery):
    user_id = callback.from_user.id
    user = await db.get_user(user_id)
    
    if not user:
        await callback.answer("❌ Ошибка получения данных!", show_alert=True)
        return
    
    text = "👤 Ваша информация:\n\n"
    
    # Роль
    if user['role_id']:
        role = await db.get_role(user['role_id'])
        text += f"🎭 Роль: {role['name']}\n"
    else:
        text += f"🎭 Роль: Не назначена\n"
    
    # Игровой ранг
    if user['ingame_rank']:
        text += f"🏆 Игровой ранг: {user['ingame_rank']}\n"
    else:
        text += f"🏆 Игровой ранг: Не назначен\n"
    
    # Онлайн за сутки
    hours = user['daily_online'] // 60
    minutes = user['daily_online'] % 60
    text += f"⏱️ Онлайн за сутки: {hours}:{minutes:02d}\n"
    
    await callback.message.edit_text(
        text,
        reply_markup=kb.back_to_main()
    )
    await callback.answer()

@router.callback_query(F.data == "admin_stats")
async def show_admin_stats(callback: CallbackQuery):
    user_id = callback.from_user.id
    user = await db.get_user(user_id)
    
    if not user or not user['role_id']:
        await callback.message.edit_text(
            "❌ У вас нет роли администрации.",
            reply_markup=kb.back_to_main()
        )
        await callback.answer()
        return
    
    role = await db.get_role(user['role_id'])
    
    text = "📊 Стата администрации:\n\n"
    text += f"🎭 Ваша роль: {role['name']}\n"
    
    if user['ingame_rank']:
        text += f"🏆 Игровой ранг: {user['ingame_rank']}\n"
    else:
        text += f"🏆 Игровой ранг: Не назначен\n"
    
    hours = user['daily_online'] // 60
    minutes = user['daily_online'] % 60
    text += f"⏱️ Онлайн за сутки: {hours}:{minutes:02d}\n"
    
    await callback.message.edit_text(
        text,
        reply_markup=kb.back_to_main()
    )
    await callback.answer()

# ===== АДМИН-ПАНЕЛЬ =====

@router.callback_query(F.data == "admin_panel")
async def show_admin_panel(callback: CallbackQuery):
    user_id = callback.from_user.id
    
    if not is_admin(user_id):
        await callback.answer("❌ У вас нет доступа к админ-панели!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "⚙️ Админ-панель:",
        reply_markup=kb.admin_panel_menu()
    )
    await callback.answer()

# ===== УПРАВЛЕНИЕ СЕРВЕРАМИ =====

@router.callback_query(F.data == "admin_servers")
async def admin_servers(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "🖥️ Управление серверами:",
        reply_markup=kb.admin_servers_menu()
    )
    await callback.answer()

@router.callback_query(F.data == "create_server")
async def create_server_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "✍️ Введите название сервера:",
        reply_markup=kb.cancel_keyboard()
    )
    await state.set_state(CreateServer.waiting_for_name)
    await callback.answer()

@router.message(CreateServer.waiting_for_name)
async def create_server_finish(message: Message, state: FSMContext):
    server_name = message.text
    server_id = await db.create_server(server_name)
    
    await state.clear()
    await message.answer(
        f"✅ Сервер '{server_name}' успешно создан!\nID: {server_id}",
        reply_markup=kb.admin_servers_menu()
    )

@router.callback_query(F.data == "list_servers")
async def list_servers(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    servers = await db.get_all_servers()
    
    if not servers:
        await callback.message.edit_text(
            "Серверов пока нет.",
            reply_markup=kb.admin_servers_menu()
        )
    else:
        await callback.message.edit_text(
            "📋 Список серверов:",
            reply_markup=kb.servers_list_keyboard(servers, prefix="server")
        )
    await callback.answer()

# Специфичные обработчики серверов идут первыми
@router.callback_query(F.data.startswith("delete_server_"))
async def delete_server_confirm(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    server_id = int(callback.data.split("_")[2])
    server = await db.get_server(server_id)
    
    await callback.message.edit_text(
        f"⚠️ Вы уверены, что хотите удалить сервер '{server['name']}'?",
        reply_markup=kb.confirm_keyboard("delete_server", server_id)
    )
    await callback.answer()

@router.callback_query(F.data.startswith("confirm_delete_server_"))
async def delete_server_execute(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    server_id = int(callback.data.split("_")[3])
    await db.delete_server(server_id)
    
    await callback.message.edit_text(
        "✅ Сервер успешно удален!",
        reply_markup=kb.admin_servers_menu()
    )
    await callback.answer()

# ===== НАСТРОЙКА FTP =====

@router.callback_query(F.data.startswith("setup_ftp_"))
async def setup_ftp_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    server_id = int(callback.data.split("_")[2])
    
    await state.update_data(server_id=server_id)
    await state.set_state(SetupFTP.waiting_for_data)
    
    await callback.message.edit_text(
        "✍️ Введите данные FTP в формате:\n"
        "host:port:user:password\n\n"
        "Пример: ftp.example.com:21:admin:password123",
        reply_markup=kb.cancel_keyboard()
    )
    await callback.answer()

@router.message(SetupFTP.waiting_for_data)
async def setup_ftp_finish(message: Message, state: FSMContext):
    try:
        parts = message.text.split(":")
        if len(parts) != 4:
            raise ValueError()
        
        host, port, user, password = parts
        port = int(port)
        
        data = await state.get_data()
        server_id = data['server_id']
        
        await db.update_server_ftp(server_id, host, port, user, password)
        await state.clear()
        
        await message.answer(
            "✅ FTP данные успешно сохранены!",
            reply_markup=kb.server_admin_actions(server_id)
        )
    except:
        await message.answer(
            "❌ Неверный формат! Попробуйте снова.",
            reply_markup=kb.cancel_keyboard()
        )

# ===== НАСТРОЙКА MariaDB =====

@router.callback_query(F.data.startswith("setup_db_"))
async def setup_db_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    server_id = int(callback.data.split("_")[2])
    
    await state.update_data(server_id=server_id)
    await state.set_state(SetupDB.waiting_for_data)
    
    await callback.message.edit_text(
        "✍️ Введите данные MariaDB в формате:\n"
        "host:port:database:user:password\n\n"
        "Пример: localhost:3306:gmod:root:password123",
        reply_markup=kb.cancel_keyboard()
    )
    await callback.answer()

@router.message(SetupDB.waiting_for_data)
async def setup_db_finish(message: Message, state: FSMContext):
    try:
        parts = message.text.split(":")
        if len(parts) != 5:
            raise ValueError()
        
        host, port, db_name, user, password = parts
        port = int(port)
        
        data = await state.get_data()
        server_id = data['server_id']
        
        await db.update_server_db(server_id, host, port, db_name, user, password)
        await state.clear()
        
        await message.answer(
            "✅ MariaDB данные успешно сохранены!",
            reply_markup=kb.server_admin_actions(server_id)
        )
    except:
        await message.answer(
            "❌ Неверный формат! Попробуйте снова.",
            reply_markup=kb.cancel_keyboard()
        )

# ===== РЕДАКТИРОВАНИЕ server.cfg =====

@router.callback_query(F.data.startswith("edit_cfg_"))
async def edit_cfg_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    server_id = int(callback.data.split("_")[2])
    
    await state.update_data(server_id=server_id)
    await state.set_state(EditCfg.waiting_for_content)
    
    await callback.message.edit_text(
        "✍️ Введите содержимое server.cfg:",
        reply_markup=kb.cancel_keyboard()
    )
    await callback.answer()

@router.message(EditCfg.waiting_for_content)
async def edit_cfg_finish(message: Message, state: FSMContext):
    cfg_content = message.text
    
    data = await state.get_data()
    server_id = data['server_id']
    
    await db.update_server_cfg(server_id, cfg_content)
    await state.clear()
    
    await message.answer(
        "✅ server.cfg успешно сохранен!",
        reply_markup=kb.server_admin_actions(server_id)
    )

# ===== ПРОСМОТР ИНФОРМАЦИИ О СЕРВЕРЕ =====

@router.callback_query(F.data.startswith("view_cfg_"))
async def view_cfg(callback: CallbackQuery):
    server_id = int(callback.data.split("_")[2])
    user_id = callback.from_user.id
    
    # Проверка прав
    if not is_admin(user_id):
        user = await db.get_user(user_id)
        if user and user['role_id']:
            has_perm = await db.has_permission(user_id, "server_cfg")
            if not has_perm:
                await callback.answer("❌ У вас нет прав на просмотр конфига!", show_alert=True)
                return
        else:
            await callback.answer("❌ У вас нет прав!", show_alert=True)
            return
    
    server = await db.get_server(server_id)
    
    if server['server_cfg']:
        text = f"📝 server.cfg сервера {server['name']}:\n\n{server['server_cfg']}"
    else:
        text = "❌ server.cfg еще не настроен."
    
    await callback.message.answer(text)
    await callback.answer()

@router.callback_query(F.data.startswith("view_ftp_"))
async def view_ftp(callback: CallbackQuery):
    server_id = int(callback.data.split("_")[2])
    user_id = callback.from_user.id
    
    # Проверка прав
    if not is_admin(user_id):
        user = await db.get_user(user_id)
        if user and user['role_id']:
            has_perm = await db.has_permission(user_id, "server_ftp")
            if not has_perm:
                await callback.answer("❌ У вас нет прав на доступ к FTP!", show_alert=True)
                return
        else:
            await callback.answer("❌ У вас нет прав!", show_alert=True)
            return
    
    server = await db.get_server(server_id)
    
    if server['ftp_host']:
        text = f"�� FTP данные сервера {server['name']}:\n\n"
        text += f"Host: {server['ftp_host']}\n"
        text += f"Port: {server['ftp_port']}\n"
        text += f"User: {server['ftp_user']}\n"
        text += f"Password: {server['ftp_password']}"
    else:
        text = "❌ FTP еще не настроен."
    
    await callback.message.answer(text)
    await callback.answer()

@router.callback_query(F.data.startswith("view_db_"))
async def view_db(callback: CallbackQuery):
    server_id = int(callback.data.split("_")[2])
    user_id = callback.from_user.id
    
    # Проверка прав
    if not is_admin(user_id):
        user = await db.get_user(user_id)
        if user and user['role_id']:
            has_perm = await db.has_permission(user_id, "server_db")
            if not has_perm:
                await callback.answer("❌ У вас нет прав на доступ к БД!", show_alert=True)
                return
        else:
            await callback.answer("❌ У вас нет прав!", show_alert=True)
            return
    
    server = await db.get_server(server_id)
    
    if server['db_host']:
        text = f"💾 MariaDB данные сервера {server['name']}:\n\n"
        text += f"Host: {server['db_host']}\n"
        text += f"Port: {server['db_port']}\n"
        text += f"Database: {server['db_name']}\n"
        text += f"User: {server['db_user']}\n"
        text += f"Password: {server['db_password']}"
    else:
        text = "❌ MariaDB еще не настроена."
    
    await callback.message.answer(text)
    await callback.answer()

# ===== УПРАВЛЕНИЕ СЕРВЕРОМ =====

@router.callback_query(F.data.startswith("start_"))
async def start_server(callback: CallbackQuery):
    server_id = int(callback.data.split("_")[1])
    user_id = callback.from_user.id
    
    # Проверка прав
    if not is_admin(user_id):
        has_perm = await db.has_permission(user_id, "server_start")
        if not has_perm:
            await callback.answer("❌ У вас нет прав на запуск сервера!", show_alert=True)
            return
    
    # Здесь будет интеграция с сервером
    await callback.answer("▶️ Команда на запуск сервера отправлена!", show_alert=True)

@router.callback_query(F.data.startswith("stop_"))
async def stop_server(callback: CallbackQuery):
    server_id = int(callback.data.split("_")[1])
    user_id = callback.from_user.id
    
    # Проверка прав
    if not is_admin(user_id):
        has_perm = await db.has_permission(user_id, "server_stop")
        if not has_perm:
            await callback.answer("❌ У вас нет прав на остановку сервера!", show_alert=True)
            return
    
    # Здесь будет интеграция с сервером
    await callback.answer("⏹️ Команда на остановку сервера отправлена!", show_alert=True)

@router.callback_query(F.data.startswith("restart_"))
async def restart_server(callback: CallbackQuery):
    server_id = int(callback.data.split("_")[1])
    user_id = callback.from_user.id
    
    # Проверка прав
    if not is_admin(user_id):
        has_perm = await db.has_permission(user_id, "server_restart")
        if not has_perm:
            await callback.answer("❌ У вас нет прав на перезапуск сервера!", show_alert=True)
            return
    
    # Здесь будет интеграция с сервером
    await callback.answer("🔄 Команда на перезапуск сервера отправлена!", show_alert=True)

# ===== УПРАВЛЕНИЕ ДОСТУПОМ К СЕРВЕРУ =====

@router.callback_query(F.data.startswith("server_access_"))
async def server_access_menu(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    server_id = int(callback.data.split("_")[2])
    
    await state.update_data(server_id=server_id)
    await state.set_state(GrantServerAccess.waiting_for_user_id)
    
    await callback.message.edit_text(
        "✍️ Введите ID пользователя для предоставления доступа к серверу:",
        reply_markup=kb.cancel_keyboard()
    )
    await callback.answer()

@router.message(GrantServerAccess.waiting_for_user_id)
async def grant_server_access_finish(message: Message, state: FSMContext):
    try:
        target_user_id = int(message.text)
        data = await state.get_data()
        server_id = data['server_id']
        
        # Проверяем, существует ли пользователь
        user = await db.get_user(target_user_id)
        if not user:
            await db.add_user(target_user_id)
        
        success = await db.grant_server_access(target_user_id, server_id)
        await state.clear()
        
        if success:
            await message.answer(
                f"✅ Доступ к серверу предоставлен пользователю {target_user_id}!",
                reply_markup=kb.server_admin_actions(server_id)
            )
        else:
            await message.answer(
                f"⚠️ Пользователь {target_user_id} уже имеет доступ к этому серверу.",
                reply_markup=kb.server_admin_actions(server_id)
            )
    except ValueError:
        await message.answer(
            "❌ Неверный формат ID! Введите число.",
            reply_markup=kb.cancel_keyboard()
        )

# Общий обработчик серверов (должен быть после всех специфичных)
@router.callback_query(F.data.startswith("server_"))
async def server_details(callback: CallbackQuery):
    # Исключаем специфичные обработчики
    if (callback.data.startswith("server_access_") or 
        callback.data.startswith("server_start") or 
        callback.data.startswith("server_stop") or 
        callback.data.startswith("server_restart") or
        callback.data.startswith("server_cfg") or
        callback.data.startswith("server_ftp") or
        callback.data.startswith("server_db")):
        return
    
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    server_id = int(callback.data.split("_")[1])
    server = await db.get_server(server_id)
    
    text = f"🖥️ Сервер: {server['name']}\n"
    text += f"🆔 ID: {server['id']}\n\n"
    text += "Выберите действие:"
    
    await callback.message.edit_text(
        text,
        reply_markup=kb.server_admin_actions(server_id)
    )
    await callback.answer()

# ===== УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ =====

@router.callback_query(F.data == "admin_users")
async def admin_users(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "👥 Управление пользователями:",
        reply_markup=kb.admin_users_menu()
    )
    await callback.answer()

@router.callback_query(F.data == "list_users")
async def list_users(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    users = await db.get_all_users()
    
    if not users:
        await callback.message.edit_text(
            "Пользователей пока нет.",
            reply_markup=kb.admin_users_menu()
        )
    else:
        text = "📋 Список пользователей:\n\n"
        for user in users:
            status = "🚫 BANNED" if user['is_banned'] else "✅"
            role_name = "Нет роли"
            if user['role_id']:
                role = await db.get_role(user['role_id'])
                if role:
                    role_name = role['name']
            
            text += f"{status} ID: {user['user_id']}\n"
            text += f"   Имя: {user['first_name'] or 'N/A'}\n"
            text += f"   Username: @{user['username'] or 'N/A'}\n"
            text += f"   Роль: {role_name}\n\n"
        
        await callback.message.edit_text(
            text,
            reply_markup=kb.admin_users_menu()
        )
    await callback.answer()

@router.callback_query(F.data == "ban_user")
async def ban_user_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "✍️ Введите ID пользователя для бана:",
        reply_markup=kb.cancel_keyboard()
    )
    await state.set_state(BanUser.waiting_for_id)
    await callback.answer()

@router.message(BanUser.waiting_for_id)
async def ban_user_finish(message: Message, state: FSMContext):
    try:
        user_id = int(message.text)
        
        if user_id == config.ADMIN_ID:
            await message.answer("❌ Нельзя забанить главного администратора!")
            return
        
        await db.ban_user(user_id)
        await state.clear()
        
        await message.answer(
            f"✅ Пользователь {user_id} успешно забанен!",
            reply_markup=kb.admin_users_menu()
        )
    except ValueError:
        await message.answer(
            "❌ Неверный формат ID! Введите число.",
            reply_markup=kb.cancel_keyboard()
        )

@router.callback_query(F.data == "unban_user")
async def unban_user_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "✍️ Введите ID пользователя для разбана:",
        reply_markup=kb.cancel_keyboard()
    )
    await state.set_state(UnbanUser.waiting_for_id)
    await callback.answer()

@router.message(UnbanUser.waiting_for_id)
async def unban_user_finish(message: Message, state: FSMContext):
    try:
        user_id = int(message.text)
        await db.unban_user(user_id)
        await state.clear()
        
        await message.answer(
            f"✅ Пользователь {user_id} успешно разбанен!",
            reply_markup=kb.admin_users_menu()
        )
    except ValueError:
        await message.answer(
            "❌ Неверный формат ID! Введите число.",
            reply_markup=kb.cancel_keyboard()
        )

@router.callback_query(F.data == "assign_role")
async def assign_role_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "✍️ Введите ID пользователя:",
        reply_markup=kb.cancel_keyboard()
    )
    await state.set_state(AssignRole.waiting_for_user_id)
    await callback.answer()

@router.message(AssignRole.waiting_for_user_id)
async def assign_role_get_role(message: Message, state: FSMContext):
    try:
        user_id = int(message.text)
        await state.update_data(user_id=user_id)
        
        roles = await db.get_all_roles()
        if not roles:
            await state.clear()
            await message.answer(
                "❌ Сначала создайте роли!",
                reply_markup=kb.admin_users_menu()
            )
            return
        
        text = "✍️ Введите ID роли:\n\n"
        for role in roles:
            text += f"{role['id']} - {role['name']}\n"
        
        await message.answer(text, reply_markup=kb.cancel_keyboard())
        await state.set_state(AssignRole.waiting_for_role_id)
    except ValueError:
        await message.answer(
            "❌ Неверный формат ID! Введите число.",
            reply_markup=kb.cancel_keyboard()
        )

@router.message(AssignRole.waiting_for_role_id)
async def assign_role_finish(message: Message, state: FSMContext):
    try:
        role_id = int(message.text)
        data = await state.get_data()
        user_id = data['user_id']
        
        # Проверяем существование роли
        role = await db.get_role(role_id)
        if not role:
            await message.answer("❌ Роль не найдена!")
            return
        
        # Проверяем/создаем пользователя
        user = await db.get_user(user_id)
        if not user:
            await db.add_user(user_id)
        
        await db.update_user_role(user_id, role_id)
        await state.clear()
        
        await message.answer(
            f"✅ Пользователю {user_id} назначена роль '{role['name']}'!",
            reply_markup=kb.admin_users_menu()
        )
    except ValueError:
        await message.answer(
            "❌ Неверный формат ID! Введите число.",
            reply_markup=kb.cancel_keyboard()
        )

@router.callback_query(F.data == "assign_ingame_rank")
async def assign_ingame_rank_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "✍️ Введите ID пользователя:",
        reply_markup=kb.cancel_keyboard()
    )
    await state.set_state(AssignIngameRank.waiting_for_user_id)
    await callback.answer()

@router.message(AssignIngameRank.waiting_for_user_id)
async def assign_ingame_rank_get_rank(message: Message, state: FSMContext):
    try:
        user_id = int(message.text)
        await state.update_data(user_id=user_id)
        
        await message.answer(
            "✍️ Введите игровой ранг (например: Администратор, Модератор и т.д.):",
            reply_markup=kb.cancel_keyboard()
        )
        await state.set_state(AssignIngameRank.waiting_for_rank)
    except ValueError:
        await message.answer(
            "❌ Неверный формат ID! Введите число.",
            reply_markup=kb.cancel_keyboard()
        )

@router.message(AssignIngameRank.waiting_for_rank)
async def assign_ingame_rank_finish(message: Message, state: FSMContext):
    rank = message.text
    data = await state.get_data()
    user_id = data['user_id']
    
    # Проверяем/создаем пользователя
    user = await db.get_user(user_id)
    if not user:
        await db.add_user(user_id)
    
    await db.update_user_ingame_rank(user_id, rank)
    await state.clear()
    
    await message.answer(
        f"✅ Пользователю {user_id} назначен игровой ранг '{rank}'!",
        reply_markup=kb.admin_users_menu()
    )

# ===== УПРАВЛЕНИЕ РОЛЯМИ =====

@router.callback_query(F.data == "admin_roles")
async def admin_roles(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "🎭 Управление ролями:",
        reply_markup=kb.admin_roles_menu()
    )
    await callback.answer()

@router.callback_query(F.data == "create_role")
async def create_role_start(callback: CallbackQuery, state: FSMContext):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    await callback.message.edit_text(
        "✍️ Введите название роли:",
        reply_markup=kb.cancel_keyboard()
    )
    await state.set_state(CreateRole.waiting_for_name)
    await callback.answer()

@router.message(CreateRole.waiting_for_name)
async def create_role_finish(message: Message, state: FSMContext):
    role_name = message.text
    role_id = await db.create_role(role_name)
    
    await state.clear()
    
    if role_id:
        await message.answer(
            f"✅ Роль '{role_name}' успешно создана!\nID: {role_id}",
            reply_markup=kb.admin_roles_menu()
        )
    else:
        await message.answer(
            f"❌ Роль с таким названием уже существует!",
            reply_markup=kb.admin_roles_menu()
        )

@router.callback_query(F.data == "list_roles")
async def list_roles(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    roles = await db.get_all_roles()
    
    if not roles:
        await callback.message.edit_text(
            "Ролей пока нет.",
            reply_markup=kb.admin_roles_menu()
        )
    else:
        await callback.message.edit_text(
            "📋 Список ролей:",
            reply_markup=kb.roles_list_keyboard(roles)
        )
    await callback.answer()

# Более специфичные обработчики идут первыми!
@router.callback_query(F.data.startswith("toggle_perm_"))
async def toggle_permission(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    parts = callback.data.split("_")
    role_id = int(parts[2])
    permission = "_".join(parts[3:])
    
    perms = await db.get_role_permissions(role_id)
    
    if permission in perms:
        await db.remove_permission(role_id, permission)
        await callback.answer("❌ Право доступа отозвано")
    else:
        await db.add_permission(role_id, permission)
        await callback.answer("✅ Право доступа предоставлено")
    
    # Обновляем клавиатуру
    role = await db.get_role(role_id)
    perms = await db.get_role_permissions(role_id)
    
    text = f"🔑 Управление правами роли '{role['name']}':\n\n"
    text += "Нажмите на право, чтобы включить/выключить его"
    
    await callback.message.edit_text(
        text,
        reply_markup=kb.permissions_keyboard(role_id, perms)
    )

@router.callback_query(F.data.startswith("role_perms_"))
async def role_permissions_menu(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    role_id = int(callback.data.split("_")[2])
    role = await db.get_role(role_id)
    perms = await db.get_role_permissions(role_id)
    
    text = f"🔑 Управление правами роли '{role['name']}':\n\n"
    text += "Нажмите на право, чтобы включить/выключить его"
    
    await callback.message.edit_text(
        text,
        reply_markup=kb.permissions_keyboard(role_id, perms)
    )
    await callback.answer()

@router.callback_query(F.data.startswith("role_"))
async def role_details(callback: CallbackQuery):
    # Исключаем специфичные обработчики
    if callback.data.startswith("role_perms_"):
        return
    
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    role_id = int(callback.data.split("_")[1])
    role = await db.get_role(role_id)
    
    perms = await db.get_role_permissions(role_id)
    
    text = f"🎭 Роль: {role['name']}\n"
    text += f"🆔 ID: {role['id']}\n\n"
    
    if perms:
        text += "🔑 Права доступа:\n"
        for perm in perms:
            perm_name = kb.PERMISSIONS.get(perm, perm)
            text += f"• {perm_name}\n"
    else:
        text += "🔑 Права доступа не назначены"
    
    await callback.message.edit_text(
        text,
        reply_markup=kb.role_actions(role_id)
    )
    await callback.answer()

@router.callback_query(F.data.startswith("delete_role_"))
async def delete_role_confirm(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    role_id = int(callback.data.split("_")[2])
    role = await db.get_role(role_id)
    
    await callback.message.edit_text(
        f"⚠️ Вы уверены, что хотите удалить роль '{role['name']}'?",
        reply_markup=kb.confirm_keyboard("delete_role", role_id)
    )
    await callback.answer()

@router.callback_query(F.data.startswith("confirm_delete_role_"))
async def delete_role_execute(callback: CallbackQuery):
    if not is_admin(callback.from_user.id):
        await callback.answer("❌ Доступ запрещен!", show_alert=True)
        return
    
    role_id = int(callback.data.split("_")[3])
    await db.delete_role(role_id)
    
    await callback.message.edit_text(
        "✅ Роль успешно удалена!",
        reply_markup=kb.admin_roles_menu()
    )
    await callback.answer()

# ===== ОТМЕНА ДЕЙСТВИЙ =====

@router.callback_query(F.data == "cancel")
async def cancel_action(callback: CallbackQuery, state: FSMContext):
    await state.clear()
    await callback.message.edit_text(
        "❌ Действие отменено.",
        reply_markup=kb.main_menu(is_admin=is_admin(callback.from_user.id))
    )
    await callback.answer()

@router.callback_query(F.data.startswith("cancel_"))
async def cancel_confirm(callback: CallbackQuery):
    await callback.message.edit_text(
        "❌ Действие отменено.",
        reply_markup=kb.admin_panel_menu()
    )
    await callback.answer()

# ===== ЗАПУСК БОТА =====

async def main():
    # Инициализация базы данных
    await db.init_db()
    logger.info("База данных инициализирована")
    
    # Регистрация роутера
    dp.include_router(router)
    
    # Запуск бота
    logger.info("Бот запущен")
    await dp.start_polling(bot)

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

