using System; using UnityEngine; using UnityEngine.Purchasing; namespace ShiroginSDK.Runtime.Modules.Events { public static partial class ShiroginEvents { public static class IAP { /// /// Fired when an in-app purchase is successfully completed. /// Contains both logical and analytical data for tracking and rewards. /// [Serializable] public class PurchaseCompletedEvent { public int Quantity; public string TransactionId; public string PaymentType; public Product Product; public DateTime Timestamp; public PurchaseCompletedEvent(Product product, int quantity = 1) { Product = product; Quantity = quantity; TransactionId = product?.transactionID ?? Guid.NewGuid().ToString(); PaymentType = Application.platform == RuntimePlatform.Android ? "Google Play" : "App Store"; Timestamp = DateTime.UtcNow; } // Computed properties public string ItemId => Product?.definition?.id ?? "undefined"; public string ItemName => Product?.metadata?.localizedTitle ?? "undefined"; public string ItemCategory => Product?.definition?.type.ToString() ?? "unknown"; public double Price => (double)(Product?.metadata?.localizedPrice ?? 0); public double Revenue => Price * Quantity; public string Currency => Product?.metadata?.isoCurrencyCode ?? "USD"; public override string ToString() { return $"[PurchaseCompletedEvent] {ItemName} ({ItemId}) | {Price:F2} {Currency} x{Quantity} | {PaymentType} | {TransactionId}"; } } /// /// Fired when an in-app purchase fails. /// Used for error handling, analytics, and failure reporting. /// [Serializable] public class PurchaseFailedEvent { public string Error; public string FailureReason; public string PaymentType; public Product Product; public DateTime Timestamp; public PurchaseFailedEvent(Product product, string error, string reason = "") { Product = product; Error = error; FailureReason = reason; PaymentType = Application.platform == RuntimePlatform.Android ? "Google Play" : "App Store"; Timestamp = DateTime.UtcNow; } // Computed properties public string ItemId => Product?.definition?.id ?? "undefined"; public string ItemName => Product?.metadata?.localizedTitle ?? "undefined"; public string ItemCategory => Product?.definition?.type.ToString() ?? "unknown"; public double Price => (double)(Product?.metadata?.localizedPrice ?? 0); public string Currency => Product?.metadata?.isoCurrencyCode ?? "USD"; public override string ToString() { return $"[PurchaseFailedEvent] {ItemName} ({ItemId}) | {Price:F2} {Currency} | Error={Error} | Reason={FailureReason}"; } } } } }