using Microsoft.EntityFrameworkCore; using PnvPanel.Application.Auth; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Common.Messaging; using PnvPanel.Application.Common.Models; using PnvPanel.Application.Telegram; using PnvPanel.Domain.Billing; namespace PnvPanel.Application.Billing.SendRequisitesToTelegram; public sealed class SendRequisitesToTelegramCommandHandler( IAppDbContext dbContext, IIdentityService identityService, ITelegramNotifier telegramNotifier, ICurrentUser currentUser ) : ICommandHandler { public async Task Handle( SendRequisitesToTelegramCommand command, CancellationToken cancellationToken ) { if (currentUser.UserId is not { } userId) return Result.Failure(AuthErrors.Unauthorized); var request = await dbContext .PaymentRequests.AsNoTracking() .FirstOrDefaultAsync(r => r.Id == command.RequestId && r.UserId == userId, cancellationToken); if (request is null) return Result.Failure(BillingErrors.RequestNotFound); var linkInfo = await identityService.GetTelegramLinkInfoAsync(userId, cancellationToken); if (!linkInfo.IsLinked) return Result.Failure(TelegramErrors.NotLinked); var settings = await dbContext .BillingSettings.AsNoTracking() .FirstOrDefaultAsync(cancellationToken); var text = $"💳 Реквизиты для оплаты ({DescribeRequest(request)}, {request.AmountSnapshot} ₽):\n{settings?.RequisitesText}"; await telegramNotifier.NotifyUserAsync(userId, text, null, cancellationToken); return Result.Success(); } private static string DescribeRequest(PaymentRequest request) => request.Kind == PaymentRequestKind.RoleChangeTopUp ? "доплата за смену роли" : PeriodLabel(request.Period!.Value); private static string PeriodLabel(PaymentPeriod period) => period switch { PaymentPeriod.Quarter => "3 месяца", PaymentPeriod.HalfYear => "полгода", PaymentPeriod.Year => "год", _ => period.ToString(), }; }