from typing import Any
from aiogram_dialog import Dialog, Window
from aiogram_dialog.widgets.input import TextInput
from aiogram_dialog.widgets.kbd import Next, Row, Start
from aiogram_dialog.widgets.text import Const, Format
from shopbot.bot.services import broadcast_message, get_admin_statistics
from shopbot.bot.services.user import gift_balance_data, take_balance_user
from shopbot.bot.states import AdminSG, DistributionSG, GiftBalanceSG, TakeBalanceSG
from shopbot.bot.validations import error_number_handler
ADMIN_PANEL_BACK_BUTTON = Start(
Const("🔙 Вернуться в админ-панель"), id="back", state=AdminSG.panel
)
ADMIN_PANEL_TEXT = "🔧 Админ панель"
class AdminDialogWindow(Window):
def __init__(
self, text: str, state: Any, input_id: str, type_factory: Any, **kwargs
):
super().__init__(
Const(text),
TextInput(
id=input_id,
type_factory=type_factory,
on_success=Next(),
on_error=error_number_handler,
),
ADMIN_PANEL_BACK_BUTTON,
state=state,
**kwargs,
)
admin_dialog = Dialog(
Window(
Const(ADMIN_PANEL_TEXT),
Row(
Start(Const("📊 Статистика"), id="stats", state=AdminSG.stats),
Start(
Const("📨 Рассылка"),
id="distribution",
state=DistributionSG.message_input,
),
),
Row(
Start(
Const("💸 Выдать баланс"),
id="gift_balance",
state=GiftBalanceSG.gift_balance_user_id,
),
Start(
Const("❌ Отнять баланс"),
id="take_balance",
state=TakeBalanceSG.take_balance_user_id,
),
),
state=AdminSG.panel,
),
Window(
Const("📈 Статистика Магазина\n"),
Format(
"🔻 Общие данные:\n"
"├ Всего продано аккаунтов: {total_sold}\n"
"├ На продаже сейчас: {currently_for_sale}\n"
"└ Всего пользователей: {total_users}\n\n"
"💰 Продажи:\n"
"├ Сумма проданных аккаунтов: {total_sales:.2f}₽\n"
"├ Самая большая продажа: {highest_sale:.2f}₽\n"
"└ Средняя цена продажи: {average_sale:.2f}₽\n\n"
"📅 Прибыль:\n"
"├ За сегодня: {profit_today:.2f}₽\n"
"├ За неделю: {profit_week:.2f}₽\n"
"└ За месяц: {profit_month:.2f}₽\n\n"
"🔹 Обновлено: {current_time}"
),
ADMIN_PANEL_BACK_BUTTON,
state=AdminSG.stats,
getter=get_admin_statistics,
),
)
distribution_dialog = Dialog(
Window(
Const("📨 Введите сообщение для рассылки:"),
TextInput(
id="message_input",
type_factory=str,
on_success=Next(),
on_error=error_number_handler,
),
ADMIN_PANEL_BACK_BUTTON,
state=DistributionSG.message_input,
),
Window(
Format("{progress}"),
ADMIN_PANEL_BACK_BUTTON,
state=DistributionSG.progress,
getter=broadcast_message,
),
)
gift_balance_dialog = Dialog(
AdminDialogWindow(
text="💸 Выдача баланса\n\nВведите ID пользователя:",
state=GiftBalanceSG.gift_balance_user_id,
input_id="user_id_input",
type_factory=int,
),
AdminDialogWindow(
text="Введите сумму для пополнения баланса:",
state=GiftBalanceSG.gift_balance_amount,
input_id="amount_input",
type_factory=float,
),
Window(
Format("{result}"),
ADMIN_PANEL_BACK_BUTTON,
state=GiftBalanceSG.gift_balance_confirmation,
getter=gift_balance_data,
),
)
take_balance_dialog = Dialog(
AdminDialogWindow(
text="❌ Отнятие баланса\n\nВведите ID пользователя:",
state=TakeBalanceSG.take_balance_user_id,
input_id="user_id_input",
type_factory=int,
),
AdminDialogWindow(
text="Введите сумму для вычета из баланса:",
state=TakeBalanceSG.take_balance_amount,
input_id="amount_input",
type_factory=float,
),
Window(
Format("{result}"),
ADMIN_PANEL_BACK_BUTTON,
state=TakeBalanceSG.take_balance_confirmation,
getter=take_balance_user,
),
)