using CMSMicroservice.Protobuf.Protos.Package; using CMSMicroservice.Protobuf.Protos.UserAddress; using FrontOffice.Main.Utilities; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using MudBlazor; using Severity = MudBlazor.Severity; namespace FrontOffice.Main.Pages; public partial class Checkout { [Inject] private PackageService PackageService { get; set; } = default!; [Inject] private PackageContract.PackageContractClient PackageClient { get; set; } = default!; [Inject] private UserAddressContract.UserAddressContractClient UserAddressContract { get; set; } = default!; [Parameter] public long? PackageId { get; set; } private Pack? _selectedPackage; private List _addresses = new(); private CustomerAddressModel? _selectedAddress; private bool _isLoadingAddresses; private bool _isProcessingPayment; // Discount code private string _discountCode = string.Empty; private bool _isApplyingDiscount; private string _discountMessage = string.Empty; private bool _discountApplied; private long _discountAmount; private long _finalPrice; // Address management private bool _isSettingDefaultAddress; private long? _settingDefaultAddressId; private bool CanProceedToPayment => _selectedPackage != null && _selectedAddress != null; protected override async Task OnInitializedAsync() { await LoadPackageDetails(); await LoadAddresses(); } private async Task LoadPackageDetails() { if (PackageId.HasValue) { try { var packages = await PackageService.GetAllPackagesAsync(); var pkg = packages.FirstOrDefault(p => p.Id == PackageId.Value); if (pkg != null) { _selectedPackage = new Pack( Id: pkg.Id, Title: pkg.Title, Body: pkg.Description, Image: pkg.ImageUrl, Price: pkg.Price, SupportsDirectPurchase: pkg.SupportsDirectPurchase, SupportsDayaPurchase: pkg.SupportsDayaPurchase ); _finalPrice = _selectedPackage.Price; } } catch (Exception ex) { Snackbar.Add($"خطا در بارگذاری پکیج: {ex.Message}", Severity.Error); } } } private async Task LoadAddresses() { _isLoadingAddresses = true; try { var response = await UserAddressContract.GetCustomerAddressesAsync(request: new()); if (response?.Models?.Any() == true) { _addresses = response.Models.ToList(); // Select default address if available _selectedAddress = _addresses.FirstOrDefault(a => a.IsDefault) ?? _addresses.First(); } else { _addresses = new List(); } } catch (Exception ex) { Snackbar.Add($"خطا در بارگذاری آدرس‌ها: {ex.Message}", Severity.Error); _addresses = new List(); } finally { _isLoadingAddresses = false; await InvokeAsync(StateHasChanged); } } private async Task SetAddressAsDefault(long addressId) { if (_isSettingDefaultAddress) return; _isSettingDefaultAddress = true; _settingDefaultAddressId = addressId; try { await UserAddressContract.SetAddressAsDefaultAsync(new() { Id = addressId }); await LoadAddresses(); // Reload addresses to reflect the change Snackbar.Add("آدرس پیش‌فرض با موفقیت تغییر یافت.", Severity.Success); } catch (Exception ex) { Snackbar.Add($"خطا در تغییر آدرس پیش‌فرض: {ex.Message}", Severity.Error); } finally { _isSettingDefaultAddress = false; _settingDefaultAddressId = null; await InvokeAsync(StateHasChanged); } } private async Task ApplyDiscountCode() { if (string.IsNullOrWhiteSpace(_discountCode)) { _discountMessage = "لطفاً کد تخفیف را وارد کنید."; _discountApplied = false; return; } _isApplyingDiscount = true; _discountMessage = string.Empty; try { // TODO: Implement discount code validation with backend // For now, simulate a discount if (_discountCode.ToUpper() == "TEST10") { _discountAmount = (long)(_selectedPackage!.Price * 0.1); // 10% discount _finalPrice = _selectedPackage!.Price - _discountAmount; _discountMessage = "کد تخفیف با موفقیت اعمال شد."; _discountApplied = true; } else { _discountMessage = "کد تخفیف نامعتبر است."; _discountApplied = false; _discountAmount = 0; _finalPrice = _selectedPackage!.Price; } } catch (Exception ex) { _discountMessage = "خطا در اعمال کد تخفیف."; _discountApplied = false; _discountAmount = 0; _finalPrice = _selectedPackage!.Price; } finally { _isApplyingDiscount = false; await InvokeAsync(StateHasChanged); } } private async Task ProcessPayment() { if (!CanProceedToPayment || _selectedPackage == null || _selectedAddress == null) { Snackbar.Add("لطفاً پکیج و آدرس را انتخاب کنید.", Severity.Warning); return; } _isProcessingPayment = true; try { var callbackUrl = $"{Navigation.BaseUri}profile/payment-callback"; var response = await PackageClient.CustomerPurchasePackageAsync(new CustomerPurchasePackageRequest { PackageId = _selectedPackage.Id, CallbackUrl = callbackUrl, PurchaseMethod = PurchaseMethodEnum.PurchaseMethodGateway }); if (!response.Success) { Snackbar.Add(response.Message ?? "خطا در آغاز فرآیند پرداخت", Severity.Error); return; } if (!string.IsNullOrEmpty(response.PaymentGatewayUrl)) { Navigation.NavigateTo(response.PaymentGatewayUrl, forceLoad: true); } else { Snackbar.Add("خطا در دریافت آدرس درگاه پرداخت", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"خطا در پردازش پرداخت: {ex.Message}", Severity.Error); } finally { _isProcessingPayment = false; await InvokeAsync(StateHasChanged); } } private async Task DayaLoanPayment() { if (_selectedAddress == null) { Snackbar.Add("لطفاً آدرس را انتخاب کنید.", Severity.Warning); return; } var url = "https://dayadiamond.ir/profile/creditpurchase/?merchantcode=56146364"; await JSRuntime.InvokeVoidAsync("open", url, "_blank"); } private record Pack(long Id, string Title, string Body, string Image, long Price, bool SupportsDirectPurchase = true, bool SupportsDayaPurchase = false); }