from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.filters.callback_data import CallbackData
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
from typing import Optional

class PhotoeditingCallbackFactory(CallbackData, prefix="payment"):
    act: Optional[str] = None
    num: Optional[int] = None
    param: Optional[str] = None
    menu_id: Optional[int] = None

def menu_kb():
    builder = ReplyKeyboardBuilder()

    builder.button(text="✏Редактировать изображение")
    builder.button(text="⚠Поддержка")

    builder.adjust(1)
    return builder.as_markup(resize_keyboard=True)

def position_numbers_kb():
    builder = InlineKeyboardBuilder()
    builder_generate = InlineKeyboardBuilder()

    for i in range(1, 21):
        builder.button(text=f'·{i}·', callback_data=PhotoeditingCallbackFactory(num=i))

    builder.adjust(4)

    builder_generate.button(text='⚙Выставить настройки по умолчанию', callback_data=PhotoeditingCallbackFactory(act='default'))
    builder_generate.button(text='🖼Генерировать изображение', callback_data=PhotoeditingCallbackFactory(act='generate'))

    builder_generate.adjust(1)

    builder.attach(builder=builder_generate)

    return builder.as_markup()

def start_editing_kb():
    builder = InlineKeyboardBuilder()

    builder.button(text='Начать редактировать', callback_data=PhotoeditingCallbackFactory(act='start'))

    return builder.as_markup()

def editing_position(index):
    builder = InlineKeyboardBuilder()

    builder.button(text='🔝Редактировать верхний текст', callback_data=PhotoeditingCallbackFactory(act='edit_up', num=index, param='up'))
    builder.button(text='⏺Редактировать основной текст', callback_data=PhotoeditingCallbackFactory(act='edit_main', num=index, param='main'))
    builder.button(text='🌡Редактировать градус', callback_data=PhotoeditingCallbackFactory(act='edit_cel', num=index, param='celsius'))
    builder.button(text='💲Редактировать стоимость', callback_data=PhotoeditingCallbackFactory(act='edit_price', num=index, param='price'))
    builder.button(text='🔙Назад', callback_data=PhotoeditingCallbackFactory(act='back_to_number', num=index))
    
    builder.adjust(1)

    return builder.as_markup()

def editing_params(index, param):
    builder = InlineKeyboardBuilder()

    builder.button(text='📝Текст', callback_data=PhotoeditingCallbackFactory(act='edit_text', num=index, param=param))
    builder.button(text='⬛Размер шрифта', callback_data=PhotoeditingCallbackFactory(act='edit_font', num=index, param=param))
    builder.button(text='📏Расположение (X,Y)', callback_data=PhotoeditingCallbackFactory(act='edit_xy', num=index, param=param))
    builder.button(text='🔙Назад', callback_data=PhotoeditingCallbackFactory(act='back_to_position', num=index, param=param))

    builder.adjust(1)

    return builder.as_markup()

def back(index, param, menu_id=1):
    builder = InlineKeyboardBuilder()

    builder.button(text='♻Очистить поле', callback_data=PhotoeditingCallbackFactory(act='clear', num=index, param=param, menu_id=menu_id))
    builder.button(text='🔙Назад', callback_data=PhotoeditingCallbackFactory(act='back_to_params', num=index, param=param, menu_id=menu_id))

    return builder.as_markup()

def menu_selection_kb():
    """Клавиатура для выбора меню"""
    builder = InlineKeyboardBuilder()
    
    builder.button(text='📋 Меню 1', callback_data=PhotoeditingCallbackFactory(act='select_menu', menu_id=1))
    builder.button(text='📋 Меню 2', callback_data=PhotoeditingCallbackFactory(act='select_menu', menu_id=2))
    builder.button(text='📋 Меню 3', callback_data=PhotoeditingCallbackFactory(act='select_menu', menu_id=3))
    
    builder.adjust(1)
    return builder.as_markup()

def position_numbers_kb_with_menu(menu_id=1):
    """Клавиатура с номерами позиций для конкретного меню"""
    builder = InlineKeyboardBuilder()
    builder_generate = InlineKeyboardBuilder()

    # Для меню 1 показываем 20 позиций, для остальных - 18 (без 17-й позиции)
    if menu_id == 1:
        # Меню 1: позиции 1-20
        for i in range(1, 21):
            builder.button(text=f'·{i}·', callback_data=PhotoeditingCallbackFactory(num=i, menu_id=menu_id))
    else:
        # Меню 2 и 3: позиции 1-16 и 18-19 (без 17-й)
        for i in range(1, 17):
            builder.button(text=f'·{i}·', callback_data=PhotoeditingCallbackFactory(num=i, menu_id=menu_id))
        for i in range(18, 20):
            builder.button(text=f'·{i}·', callback_data=PhotoeditingCallbackFactory(num=i, menu_id=menu_id))

    builder.adjust(4)

    builder_generate.button(text='⚙Выставить настройки по умолчанию', callback_data=PhotoeditingCallbackFactory(act='default', menu_id=menu_id))
    builder_generate.button(text='🖼Генерировать изображение', callback_data=PhotoeditingCallbackFactory(act='generate', menu_id=menu_id))
    builder_generate.button(text='🔄Сменить меню', callback_data=PhotoeditingCallbackFactory(act='change_menu'))

    builder_generate.adjust(1)

    builder.attach(builder=builder_generate)

    return builder.as_markup()

def editing_position_with_menu(index, menu_id=1):
    """Клавиатура редактирования позиции с учетом меню"""
    builder = InlineKeyboardBuilder()

    builder.button(text='🔝Редактировать верхний текст', callback_data=PhotoeditingCallbackFactory(act='edit_up', num=index, param='up', menu_id=menu_id))
    builder.button(text='⏺Редактировать основной текст', callback_data=PhotoeditingCallbackFactory(act='edit_main', num=index, param='main', menu_id=menu_id))
    builder.button(text='🌡Редактировать градус', callback_data=PhotoeditingCallbackFactory(act='edit_cel', num=index, param='celsius', menu_id=menu_id))
    builder.button(text='💲Редактировать стоимость', callback_data=PhotoeditingCallbackFactory(act='edit_price', num=index, param='price', menu_id=menu_id))
    builder.button(text='🔙Назад', callback_data=PhotoeditingCallbackFactory(act='back_to_number', num=index, menu_id=menu_id))
    
    builder.adjust(1)

    return builder.as_markup()

def editing_params_with_menu(index, param, menu_id=1):
    """Клавиатура редактирования параметров с учетом меню"""
    builder = InlineKeyboardBuilder()

    builder.button(text='📝Текст', callback_data=PhotoeditingCallbackFactory(act='edit_text', num=index, param=param, menu_id=menu_id))
    builder.button(text='⬛Размер шрифта', callback_data=PhotoeditingCallbackFactory(act='edit_font', num=index, param=param, menu_id=menu_id))
    builder.button(text='📏Расположение (X,Y)', callback_data=PhotoeditingCallbackFactory(act='edit_xy', num=index, param=param, menu_id=menu_id))
    builder.button(text='🔙Назад', callback_data=PhotoeditingCallbackFactory(act='back_to_position', num=index, param=param, menu_id=menu_id))

    builder.adjust(1)

    return builder.as_markup()