using CMSMicroservice.Protobuf.Protos.Package; namespace FrontOffice.Main.Utilities; /// /// Package data transfer object for UI display /// public record PackageDto( long Id, string Title, string Description, string ImageUrl, long Price, long ActivationFee = 0, double DiscountMultiplier = 0, double MagicWalletMultiplier = 0, long MagicWalletMaxDeposit = 0, long MagicWalletMaxCredit = 0, bool IsBasePackage = false, bool SupportsDayaPurchase = false, bool SupportsDirectPurchase = false) { /// قیمت فرمت‌شده به تومان public string FormattedPrice => string.Format("{0:N0} تومان", Price); } /// /// User's package purchase status /// public record UserPackageStatusDto( bool HasPurchasedPackage, string? PackageTitle, string? PurchaseMethod, // DayaLoan, DirectPurchase, or null bool IsClubMemberActive, long WalletBalance, bool CanActivateClubMembership, DateTime? PurchaseDate); /// /// Service for managing packages in FrontOffice /// public class PackageService { private readonly CMSMicroservice.Protobuf.Protos.Package.PackageContract.PackageContractClient _client; public PackageService(CMSMicroservice.Protobuf.Protos.Package.PackageContract.PackageContractClient client) { _client = client; } /// /// Get all available packages /// public async Task> GetAllPackagesAsync(CancellationToken ct = default) { try { var request = new GetCustomerPackagesRequest(); var response = await _client.GetCustomerPackagesAsync(request, cancellationToken: ct); return response.Models .Select(m => new PackageDto( m.Id, m.Title, m.Description, m.ImagePath, m.Price, m.ActivationFee, m.DiscountMultiplier, m.MagicWalletMultiplier, m.MagicWalletMaxDeposit, m.MagicWalletMaxCredit, m.IsBasePackage, m.SupportsDayaPurchase, m.SupportsDirectPurchase)) .ToList(); } catch (Exception ex) { #if DEBUG Console.WriteLine($"Error fetching packages: {ex.Message}"); #endif return new List(); } } /// /// Get a single package by ID /// public async Task GetPackageByIdAsync(long id, CancellationToken ct = default) { try { var response = await _client.GetCustomerPackageDetailsAsync( new GetCustomerPackageDetailsRequest { PackageId = id }, cancellationToken: ct); if (response == null) return null; return new PackageDto( response.Id, response.Title, response.Description, response.ImagePath, response.Price); } catch (Exception ex) { #if DEBUG Console.WriteLine($"Error fetching package {id}: {ex.Message}"); #endif return null; } } /// /// Get user's package purchase status /// public async Task GetUserPackageStatusAsync(CancellationToken ct = default) { try { var response = await _client.GetUserPackageStatusAsync( new GetUserPackageStatusRequest(), cancellationToken: ct); return new UserPackageStatusDto( HasPurchasedPackage: response.HasPurchasedPackage, PackageTitle: null, PurchaseMethod: response.PackagePurchaseMethod, IsClubMemberActive: response.IsClubMemberActive, WalletBalance: response.WalletBalance, CanActivateClubMembership: response.CanActivateClubMembership, PurchaseDate: response.LastPurchaseDate?.ToDateTime()); } catch { return new UserPackageStatusDto( HasPurchasedPackage: false, PackageTitle: null, PurchaseMethod: null, IsClubMemberActive: false, WalletBalance: 0, CanActivateClubMembership: false, PurchaseDate: null); } } }