using ManagerService.DTOs; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace ManagerService.Data { /// /// Instance Information /// public class Instance : IAuditableEntity { [Key] [Required] public string Id { get; set; } [Required] public string Name { get; set; } // UNIQUE !.. public DateTime DateCreation { get; set; } public DateTime DateUpdate { get; set; } public string PinCode { get; set; } public bool IsPushNotification { get; set; } public bool IsMobile { get; set; } public bool IsTablet { get; set; } public bool IsWeb { get; set; } public bool IsVR { get; set; } public bool IsAssistant { get; set; } /// /// Appose le filigrane du lieu sur les images téléversées. Remplace le /// `instanceId == "633ee379…"` en dur de ResourceController.Create. /// public bool IsImageWatermark { get; set; } /// Nom du guide affiché au visiteur, libre. Ex: "Léon". public string? GuideName { get; set; } /// /// Personnalité du guide : instruction envoyée au modèle, jamais affichée. /// Écrite dans une seule langue — le modèle répond dans celle du visiteur. /// public string? GuidePersonaPrompt { get; set; } /// Voix Gemini TTS : "Sulafat" (Viva, féminine) ou "Umbriel" (Marco, masculine). public string? GuideVoiceId { get; set; } /// /// Formulations utilisées quand le guide ne trouve pas de réponse. /// Liste à plat : plusieurs entrées peuvent partager la même langue, /// une est tirée au hasard parmi celles de la langue du visiteur. /// public List? GuideFallbackMessages { get; set; } public string? WebSlug { get; set; } public string? PublicApiKey { get; set; } public string? SubscriptionPlanId { get; set; } [ForeignKey("SubscriptionPlanId")] public SubscriptionPlan? SubscriptionPlan { get; set; } public long AiTokensThisMonth { get; set; } = 0; public string AiUsageMonthKey { get; set; } = ""; public long StorageQuotaBytes { get; set; } = 0; public long AiTokensPerMonth { get; set; } = 0; public bool HasStats { get; set; } = false; public int StatsHistoryDays { get; set; } = 30; public bool HasAdvancedStats { get; set; } = false; public bool IsActive { get; set; } = true; public bool IsTrialActive { get; set; } = false; public DateTime? TrialEndsAt { get; set; } public long TrialAiTokensUsed { get; set; } = 0; public bool TrialCheckInEmailSent { get; set; } = false; public bool TrialReminderEmailSent { get; set; } = false; public bool TrialLastDayEmailSent { get; set; } = false; public string? BillingAddress { get; set; } public string? BillingCountry { get; set; } public string? VatNumber { get; set; } public decimal? VatRate { get; set; } public string? StripeCustomerId { get; set; } public string? StripeSubscriptionId { get; set; } public InstanceDTO ToDTO(List applicationInstanceDTOs) { return new InstanceDTO() { id = Id, name = Name, dateCreation = DateCreation, pinCode = PinCode, isPushNotification = IsPushNotification, isMobile = IsMobile, isTablet = IsTablet, isWeb = IsWeb, isVR = IsVR, isAssistant = IsAssistant, isImageWatermark = IsImageWatermark, guideName = GuideName, guidePersonaPrompt = GuidePersonaPrompt, guideVoiceId = GuideVoiceId, guideFallbackMessages = GuideFallbackMessages, webSlug = WebSlug, publicApiKey = PublicApiKey, subscriptionPlanId = SubscriptionPlanId, subscriptionPlan = SubscriptionPlan?.ToDTO(), aiTokensThisMonth = AiTokensThisMonth, aiUsageMonthKey = AiUsageMonthKey, storageQuotaBytes = StorageQuotaBytes, aiTokensPerMonth = AiTokensPerMonth, hasStats = HasStats, statsHistoryDays = StatsHistoryDays, hasAdvancedStats = HasAdvancedStats, isTrialActive = IsTrialActive, trialEndsAt = TrialEndsAt, trialAiTokensUsed = TrialAiTokensUsed, billingAddress = BillingAddress, billingCountry = BillingCountry, vatNumber = VatNumber, vatRate = VatRate, applicationInstanceDTOs = applicationInstanceDTOs }; } public Instance FromDTO(InstanceDTO instanceDTO) { Name = instanceDTO.name; DateCreation = instanceDTO.dateCreation != null ? instanceDTO.dateCreation.Value : DateTime.Now.ToUniversalTime(); PinCode = instanceDTO.pinCode; IsPushNotification = instanceDTO.isPushNotification ?? false; IsMobile = instanceDTO.isMobile ?? false; IsTablet = instanceDTO.isTablet ?? false; IsWeb = instanceDTO.isWeb ?? false; IsVR = instanceDTO.isVR ?? false; IsAssistant = instanceDTO.isAssistant ?? false; IsImageWatermark = instanceDTO.isImageWatermark ?? false; if (instanceDTO.guideName != null) GuideName = instanceDTO.guideName; if (instanceDTO.guidePersonaPrompt != null) GuidePersonaPrompt = instanceDTO.guidePersonaPrompt; if (instanceDTO.guideVoiceId != null) GuideVoiceId = instanceDTO.guideVoiceId; if (instanceDTO.guideFallbackMessages != null) GuideFallbackMessages = instanceDTO.guideFallbackMessages; if (instanceDTO.webSlug != null) WebSlug = instanceDTO.webSlug; if (instanceDTO.publicApiKey != null) PublicApiKey = instanceDTO.publicApiKey; if (instanceDTO.subscriptionPlanId != null) SubscriptionPlanId = instanceDTO.subscriptionPlanId; if (instanceDTO.storageQuotaBytes.HasValue) StorageQuotaBytes = instanceDTO.storageQuotaBytes.Value; if (instanceDTO.aiTokensPerMonth.HasValue) AiTokensPerMonth = instanceDTO.aiTokensPerMonth.Value; if (instanceDTO.hasStats.HasValue) HasStats = instanceDTO.hasStats.Value; if (instanceDTO.statsHistoryDays.HasValue) StatsHistoryDays = instanceDTO.statsHistoryDays.Value; if (instanceDTO.hasAdvancedStats.HasValue) HasAdvancedStats = instanceDTO.hasAdvancedStats.Value; if (instanceDTO.billingAddress != null) BillingAddress = instanceDTO.billingAddress; if (instanceDTO.billingCountry != null) BillingCountry = instanceDTO.billingCountry; if (instanceDTO.vatNumber != null) VatNumber = instanceDTO.vatNumber; if (instanceDTO.vatRate.HasValue) VatRate = instanceDTO.vatRate.Value; return this; } } }