from aiogram import Router, F
from aiogram.filters import Command
from aiogram.types import Message, CallbackQuery
from filters.admin import IsAdmin
from database.models import User, VPNSubscription
from utils.db import get_or_create_user, create_plan, search_user
from keyboards.admin import get_admin_keyboard, get_broadcast_keyboard, get_user_info_keyboard
from keyboards.admin_buttons import broadcast_button, stats_button, get_user_button
from aiogram.filters import CommandObject
from aiogram.fsm.context import FSMContext
from states.admin import AdminState
from utils.db import get_users_ids, update_user_ban
from utils.texts import get_admin_stats, get_user_info


router = Router()
router.message.filter(IsAdmin())


@router.message(Command("admin"))
async def admin_menu_handler(message: Message):
    user = await get_or_create_user(message.from_user)
    
    await message.answer("Добро пожаловать в меню администратора!", reply_markup=get_admin_keyboard())

# TEXT BUTTONS
@router.message(F.text == broadcast_button)
async def broadcast_handler(message: Message, state: FSMContext):
    await state.set_state(AdminState.broadcast)
    await message.answer("Введите текст рассылки:")

@router.message(F.text == stats_button)
async def stats_handler(message: Message):
    await message.answer(await get_admin_stats(), parse_mode="HTML")

@router.message(F.text == get_user_button)
async def get_user_handler(message: Message, state: FSMContext):
    await state.set_state(AdminState.search_user)
    await message.answer("Введите ID или username пользователя:")


# STATES TEXT HANDLERS
@router.message(AdminState.broadcast)
async def broadcast_text_handler(message: Message, state: FSMContext):
    await state.update_data(broadcast_message=message)
    await message.answer("Вы уверены, что хотите отправить рассылку?", reply_markup=get_broadcast_keyboard())

@router.message(AdminState.search_user)
async def search_user_handler(message: Message, state: FSMContext):
    user = await search_user(message.text)
    if user:
        await state.update_data(user=user)
        await message.answer(await get_user_info(user), reply_markup=get_user_info_keyboard(user), parse_mode="HTML")
    else:
        await message.answer("Пользователь не найден!")
    await state.clear()


# CALLBACK HANDLERS
@router.callback_query(F.data == "broadcast_send")
async def broadcast_send_handler(callback: CallbackQuery, state: FSMContext):
    data = await state.get_data()
    message = data.get("broadcast_message")
    if message is None:
        await callback.message.edit_text("Текст рассылки не найден! Попробуйте вернуться назад и ввести текст рассылки еще раз.")
        return
    
    users = await get_users_ids()
    goods = 0
    bads = 0
    for user in users:
        try:
            msg_id = await message.copy_to(user)
            if msg_id:
                goods += 1
            else:
                bads += 1
        except Exception as e:
            bads += 1
    await callback.message.edit_text(f"Рассылка отправлена! Успешно отправлено: {goods}, Неуспешно отправлено: {bads}")
    await state.clear()


@router.callback_query(F.data.startswith("ban_user_"))
async def ban_user_handler(callback: CallbackQuery):
    user_id = callback.data.split("_")[-1]
    user = await search_user(user_id)
    if user:
        user = await update_user_ban(user_id, True)
        await callback.answer("Пользователь заблокирован!")
        await callback.message.edit_reply_markup(reply_markup=get_user_info_keyboard(user))
    else:
        await callback.answer("Пользователь не найден!")


@router.callback_query(F.data.startswith("unban_user_"))
async def unban_user_handler(callback: CallbackQuery):
    user_id = callback.data.split("_")[-1]
    user = await search_user(user_id)
    if user:
        user = await update_user_ban(user_id, False)
        await callback.answer("Пользователь разблокирован!")
        await callback.message.edit_reply_markup(reply_markup=get_user_info_keyboard(user))
    else:
        await callback.answer("Пользователь не найден!")


@router.message(Command("add_plan"))
async def add_plan_handler(message: Message, command: CommandObject):
    if not command.args:
        await message.answer("❌ Неверный формат команды.\nИспользуйте: /add_plan НАЗВАНИЕ|ДЛИТЕЛЬНОСТЬ|ЦЕНА\nПример: /add_plan Базовый|30|1000")
        return

    try:
        # Split the arguments by |
        name, duration_days, price = command.args.split("|")
        
        # Convert to appropriate types and validate
        duration_days = int(duration_days.strip())
        price = float(price.strip())
        name = name.strip()
        
        if duration_days <= 0 or price <= 0:
            raise ValueError("Длительность и цена должны быть больше 0")
        
        # Create the plan
        plan = await create_plan(name, duration_days, price)
        
        # Send success message
        await message.answer(
            f"✅ План успешно создан!\n\n"
            f"📦 Название: <i>{plan.name}</i>\n"
            f"📅 Длительность: {plan.duration_days} дней\n"
            f"💰 Цена: {plan.price} руб.",
            parse_mode="HTML"
        )
        
    except ValueError as e:
        await message.answer(f"❌ Ошибка: {str(e)}\n\nИспользуйте формат: /add_plan НАЗВАНИЕ|ДЛИТЕЛЬНОСТЬ|ЦЕНА\nПример: /add_plan Базовый|30|1000")
    except Exception as e:
        print(e)
        await message.answer("❌ Произошла ошибка при создании плана. Попробуйте еще раз.")
