"""
Settings handlers for user profile and bot settings.
"""
import logging
from typing import Optional

from aiogram import Router, F
from aiogram.types import Message, CallbackQuery
from aiogram.fsm.context import FSMContext

from src.bot.states.survey import SettingsFSM
from src.bot.keyboards.settings import (
    kb_settings_main, kb_bot_settings, kb_bot_gender, 
    kb_user_profile, kb_user_gender
)
from src.database.enums import Gender
from src.database.db_methods.users import (
    get_user_with_profile_by_tg, create_or_update_bot_settings
)
from src.bot.handlers.state_handlers.survey import session_scope

logger = logging.getLogger(__name__)
router = Router(name="settings_handlers")


@router.message(F.text == "/settings")
async def settings_cmd(message: Message, state: FSMContext):
    """
    Start settings menu.
    """
    await state.clear()
    await state.set_state(SettingsFSM.main)
    
    await message.answer(
        "⚙️ <b>Настройки</b>\n\n"
        "Здесь ты можешь изменить свой профиль и настройки бота.",
        reply_markup=kb_settings_main()
    )


@router.callback_query(F.data == "settings:main")
async def settings_main(cb: CallbackQuery, state: FSMContext):
    """
    Show main settings menu.
    """
    await cb.answer()
    await state.set_state(SettingsFSM.main)
    
    await cb.message.edit_text(
        "⚙️ <b>Настройки</b>\n\n"
        "Здесь ты можешь изменить свой профиль и настройки бота.",
        reply_markup=kb_settings_main()
    )


@router.callback_query(F.data == "settings:profile")
async def settings_profile(cb: CallbackQuery, state: FSMContext):
    """
    Show user profile settings.
    """
    await cb.answer()
    await state.set_state(SettingsFSM.user_profile)
    
    # Get current user data
    tg_id = str(cb.from_user.id)
    async with session_scope() as session:
        user = await get_user_with_profile_by_tg(session, tg_id)
        
        if user:
            name = user.user_name or "Не указано"
            gender = "👨 Мужской" if user.user_gender == Gender.male else "👩 Женский" if user.user_gender == Gender.female else "Не указано"
            city = user.city or "Не указано"
        else:
            name = gender = city = "Не указано"
    
    await cb.message.edit_text(
        f"👤 <b>Мой профиль</b>\n\n"
        f"<b>Имя:</b> {name}\n"
        f"<b>Пол:</b> {gender}\n"
        f"<b>Город:</b> {city}\n\n"
        "Выбери, что хочешь изменить:",
        reply_markup=kb_user_profile()
    )


@router.callback_query(F.data == "settings:bot")
async def settings_bot(cb: CallbackQuery, state: FSMContext):
    """
    Show bot settings.
    """
    await cb.answer()
    await state.set_state(SettingsFSM.bot_settings)
    
    # Get current bot settings
    tg_id = str(cb.from_user.id)
    async with session_scope() as session:
        user = await get_user_with_profile_by_tg(session, tg_id)
        
        # Получаем настройки бота напрямую
        from src.database.db_methods.users import get_bot_settings_by_tg
        bot_settings = await get_bot_settings_by_tg(session, tg_id)
        
        if bot_settings:
            name = bot_settings.bot_voice_name or "Не указано"
            gender = "👨 Мужской" if bot_settings.bot_voice_gender == Gender.male else "👩 Женский" if bot_settings.bot_voice_gender == Gender.female else "Не указано"
        else:
            name = gender = "Не указано"
    
    await cb.message.edit_text(
        f"🤖 <b>Настройки бота</b>\n\n"
        f"<b>Имя бота:</b> {name}\n"
        f"<b>Пол бота:</b> {gender}\n\n"
        "Выбери, что хочешь изменить:",
        reply_markup=kb_bot_settings()
    )


@router.callback_query(F.data == "bot:name")
async def bot_name_setting(cb: CallbackQuery, state: FSMContext):
    """
    Start bot name input.
    """
    await cb.answer()
    await state.set_state(SettingsFSM.bot_name)
    
    await cb.message.edit_text(
        "🤖 <b>Имя бота</b>\n\n"
        "Введи имя для бота (например, Анна, Алексей, Мария):"
    )


@router.message(SettingsFSM.bot_name)
async def handle_bot_name(message: Message, state: FSMContext):
    """
    Handle bot name input.
    """
    name = (message.text or "").strip()
    if len(name) < 2:
        await message.answer("Имя должно содержать минимум 2 символа. Попробуй ещё раз:")
        return
    
    tg_id = str(message.from_user.id)
    async with session_scope() as session:
        await create_or_update_bot_settings(
            session, 
            tg_id=tg_id, 
            bot_voice_name=name
        )
        await session.commit()
    
    await state.set_state(SettingsFSM.bot_settings)
    await message.answer(
        f"✅ Имя бота изменено на: <b>{name}</b>\n\n"
        "Выбери, что ещё хочешь изменить:",
        reply_markup=kb_bot_settings()
    )


@router.callback_query(F.data == "bot:gender")
async def bot_gender_setting(cb: CallbackQuery, state: FSMContext):
    """
    Show bot gender selection.
    """
    await cb.answer()
    await state.set_state(SettingsFSM.bot_gender)
    
    await cb.message.edit_text(
        "⚧ <b>Пол бота</b>\n\n"
        "Выбери пол для бота. Это повлияет на то, как бот будет обращаться к тебе:",
        reply_markup=kb_bot_gender()
    )


@router.callback_query(F.data.startswith("bot_gender:"))
async def handle_bot_gender(cb: CallbackQuery, state: FSMContext):
    """
    Handle bot gender selection.
    """
    try:
        value = cb.data.split(":", 1)[1]
        gender = Gender(value)
    except Exception:
        await cb.answer("Неверное значение", show_alert=True)
        return

    await cb.answer()
    
    tg_id = str(cb.from_user.id)
    async with session_scope() as session:
        await create_or_update_bot_settings(
            session, 
            tg_id=tg_id, 
            bot_voice_gender=gender.value
        )
        await session.commit()
    
    gender_text = "👨 Мужской" if gender == Gender.male else "👩 Женский"
    await state.set_state(SettingsFSM.bot_settings)
    
    await cb.message.edit_text(
        f"✅ Пол бота изменён на: <b>{gender_text}</b>\n\n"
        "Теперь бот будет использовать соответствующие формы обращения.\n\n"
        "Выбери, что ещё хочешь изменить:",
        reply_markup=kb_bot_settings()
    )


@router.callback_query(F.data == "profile:gender")
async def user_gender_setting(cb: CallbackQuery, state: FSMContext):
    """
    Show user gender selection.
    """
    await cb.answer()
    
    await cb.message.edit_text(
        "⚧ <b>Твой пол</b>\n\n"
        "Выбери свой пол:",
        reply_markup=kb_user_gender()
    )


@router.callback_query(F.data.startswith("user_gender:"))
async def handle_user_gender(cb: CallbackQuery, state: FSMContext):
    """
    Handle user gender selection.
    """
    try:
        value = cb.data.split(":", 1)[1]
        gender = Gender(value)
    except Exception:
        await cb.answer("Неверное значение", show_alert=True)
        return

    await cb.answer()
    
    tg_id = str(cb.from_user.id)
    async with session_scope() as session:
        user = await get_user_with_profile_by_tg(session, tg_id)
        if user:
            user.user_gender = gender
            await session.commit()
    
    gender_text = "👨 Мужской" if gender == Gender.male else "👩 Женский"
    
    await cb.message.edit_text(
        f"✅ Твой пол изменён на: <b>{gender_text}</b>\n\n"
        "Выбери, что ещё хочешь изменить:",
        reply_markup=kb_user_profile()
    )


@router.callback_query(F.data == "profile:name")
async def profile_name_setting(cb: CallbackQuery, state: FSMContext):
    """
    Start user name input.
    """
    await cb.answer()
    await state.set_state(SettingsFSM.user_name)
    
    await cb.message.edit_text(
        "👤 <b>Твоё имя</b>\n\n"
        "Введи своё имя:"
    )


@router.message(SettingsFSM.user_name)
async def handle_user_name(message: Message, state: FSMContext):
    """
    Handle user name input.
    """
    name = (message.text or "").strip()
    if len(name) < 2:
        await message.answer("Имя должно содержать минимум 2 символа. Попробуй ещё раз:")
        return
    
    tg_id = str(message.from_user.id)
    async with session_scope() as session:
        user = await get_user_with_profile_by_tg(session, tg_id)
        if user:
            user.user_name = name
            await session.commit()
    
    await state.set_state(SettingsFSM.user_profile)
    await message.answer(
        f"✅ Твоё имя изменено на: <b>{name}</b>\n\n"
        "Выбери, что ещё хочешь изменить:",
        reply_markup=kb_user_profile()
    )


@router.callback_query(F.data == "profile:city")
async def profile_city_setting(cb: CallbackQuery, state: FSMContext):
    """
    Start user city input.
    """
    await cb.answer()
    await state.set_state(SettingsFSM.user_city)
    
    await cb.message.edit_text(
        "🏙️ <b>Твой город</b>\n\n"
        "Введи свой город:"
    )


@router.message(SettingsFSM.user_city)
async def handle_user_city(message: Message, state: FSMContext):
    """
    Handle user city input.
    """
    city = (message.text or "").strip()
    if len(city) < 2:
        await message.answer("Название города должно содержать минимум 2 символа. Попробуй ещё раз:")
        return
    
    tg_id = str(message.from_user.id)
    async with session_scope() as session:
        user = await get_user_with_profile_by_tg(session, tg_id)
        if user:
            user.city = city
            await session.commit()
    
    await state.set_state(SettingsFSM.user_profile)
    await message.answer(
        f"✅ Твой город изменён на: <b>{city}</b>\n\n"
        "Выбери, что ещё хочешь изменить:",
        reply_markup=kb_user_profile()
    )


@router.callback_query(F.data == "settings:back")
async def settings_back(cb: CallbackQuery, state: FSMContext):
    """
    Go back to main menu.
    """
    await cb.answer()
    await state.clear()
    
    await cb.message.edit_text(
        "Главное меню. Используй /start для начала работы или /settings для настроек."
    )
