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) { 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)) .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 Task GetUserPackageStatusAsync(CancellationToken ct = default) { // TODO: Connect to GetUserPackageStatus RPC when available in FrontOffice.BFF return Task.FromResult(new UserPackageStatusDto( HasPurchasedPackage: false, PackageTitle: null, PurchaseMethod: null, IsClubMemberActive: false, WalletBalance: 0, CanActivateClubMembership: false, PurchaseDate: null)); } }