using QRRapidoApp.Models; using QRRapidoApp.Models.ViewModels; namespace QRRapidoApp.Services { public interface IUserService { Task GetUserAsync(string userId); Task GetUserByEmailAsync(string email); Task GetUserByProviderAsync(string provider, string providerId); Task CreateUserAsync(string email, string name, string provider, string providerId); Task UpdateLastLoginAsync(string userId); Task ActivatePremiumStatus(string userId, string stripeSubscriptionId, DateTime expiryDate); Task DeactivatePremiumStatus(string stripeSubscriptionId); Task UpdateUserStripeCustomerIdAsync(string userId, string stripeCustomerId); Task GetUserByStripeCustomerIdAsync(string customerId); Task UpdateUserAsync(User user); Task GetDailyQRCountAsync(string? userId); Task IncrementDailyQRCountAsync(string userId); Task GetRemainingQRCountAsync(string userId); Task CanGenerateQRAsync(string? userId, bool isPremium); Task SaveQRToHistoryAsync(string? userId, QRGenerationResult qrResult, int costInCredits = 0); Task> GetUserQRHistoryAsync(string userId, int limit = 50); Task GetQRDataAsync(string qrId); Task DeleteQRFromHistoryAsync(string userId, string qrId); Task GetQRCountThisMonthAsync(string userId); Task GetUserEmailAsync(string userId); Task MarkPremiumCancelledAsync(string userId, DateTime cancelledAt); Task> GetUsersForHistoryCleanupAsync(DateTime cutoffDate); Task DeleteUserHistoryAsync(string userId); // QR Code Tracking (Analytics) - Premium feature Task GetQRByTrackingIdAsync(string trackingId); Task IncrementQRScanCountAsync(string trackingId); // Credit System & Deduplication Task DeductCreditAsync(string userId); Task AddCreditsAsync(string userId, int amount); Task IncrementFreeUsageAsync(string userId); Task FindDuplicateQRAsync(string userId, string contentHash); // Anonymous Security Task CheckAnonymousLimitAsync(string ipAddress, string deviceId); Task RegisterAnonymousUsageAsync(string ipAddress, string deviceId, string qrId); // API Key Management Task<(string rawKey, string prefix)> GenerateApiKeyAsync(string userId, string keyName = "Default"); Task RevokeApiKeyAsync(string userId, string prefix); Task GetUserByApiKeyAsync(string rawKey); // API Subscription Management Task ActivateApiSubscriptionAsync(string userId, string stripeSubscriptionId, ApiPlanTier tier, DateTime periodEnd, string stripeCustomerId); Task GetUserByApiSubscriptionIdAsync(string stripeSubscriptionId); Task UpdateApiSubscriptionStatusAsync(string stripeSubscriptionId, string status, ApiPlanTier? newTier = null, DateTime? periodEnd = null); } }