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);
}
}
}