using PowderCoating.Core.Entities; using PowderCoating.Core.Enums; namespace PowderCoating.Core.Interfaces; public interface ISubscriptionService { Task CanAddUserAsync(int companyId); Task CanAddJobAsync(int companyId); Task CanAddCustomerAsync(int companyId); Task CanAddQuoteAsync(int companyId); Task CanAddCatalogItemAsync(int companyId); Task CanAddJobPhotoAsync(int companyId, int jobId); Task CanAddQuotePhotoAsync(int companyId, int quoteId); Task<(int Used, int Max)> GetUserCountAsync(int companyId); Task<(int Used, int Max)> GetJobCountAsync(int companyId); Task<(int Used, int Max)> GetCustomerCountAsync(int companyId); Task<(int Used, int Max)> GetQuoteCountAsync(int companyId); Task<(int Used, int Max)> GetCatalogItemCountAsync(int companyId); Task<(int Used, int Max)> GetJobPhotoCountAsync(int companyId, int jobId); Task<(int Used, int Max)> GetQuotePhotoCountAsync(int companyId, int quoteId); Task GetStatusAsync(int companyId); // AI feature gating /// Returns true if the AI Inventory Assist lookup is enabled for this company. Task IsAiInventoryAssistEnabledAsync(int companyId); /// Returns true if the AI Photo Quote feature is enabled for this company (flag + quota check). Task CanUseAiPhotoQuoteAsync(int companyId); /// Returns (used this month, monthly max). Max = -1 means unlimited. Task<(int Used, int Max)> GetAiPhotoQuoteUsageAsync(int companyId); /// Returns true if the AI Catalog Price Check is enabled for this company (plan gate + per-company flag). Task CanUseAiCatalogPriceCheckAsync(int companyId); /// /// Returns days until expiry (negative = days past expiry). Returns null if no end date set. /// int? DaysUntilExpiry(Company company); }