using ManagerService.DTOs; using Microsoft.EntityFrameworkCore; namespace ManagerService.Data { /// /// Le fond d'un lieu — §4 de DOCS/v2/immersif-frontiere-plan.md. /// /// Un type, deux porteurs. Une Configuration le porte pour le fond d'une /// visite, l'ApplicationInstance VR pour le fond du menu général. Poser un /// BackgroundResourceId à plat sur chacun aurait donné quatre champs /// « background » incohérents dans six mois — c'est le travers que ce type évite. /// /// ⚠️ Le repli n'est pas optionnel. Trois canaux sur quatre ne savent pas rendre /// un panorama : web le fait tourner, mobile et kiosk retombent sur une image plate. /// Sans FallbackResourceId, activer un fond immersif rendrait l'écran noir /// partout ailleurs que dans le casque, en silence. À défaut, c'est /// Configuration.ImageId qui sert de repli. /// [Owned] public class ImmersiveBackground { /// Ressource immersive : une 360, une vidéo 360 ou un GLB. public string ResourceId { get; set; } /// /// ⚠️ Persisté en int, comme tous les enums du projet : on ajoute en fin, /// on ne réordonne jamais. /// public ImmersiveBackgroundKind Kind { get; set; } /// Image plate pour les canaux qui ne rendent pas l'immersif. public string FallbackResourceId { get; set; } public ImmersiveBackgroundDTO ToDTO() => new ImmersiveBackgroundDTO { resourceId = ResourceId, kind = Kind, fallbackResourceId = FallbackResourceId }; /// /// Rend null quand aucune ressource n'est choisie : un fond sans ressource n'est /// pas un fond, et le porter quand même obligerait chaque lecteur à tester deux /// choses au lieu d'une. /// public static ImmersiveBackground FromDTO(ImmersiveBackgroundDTO dto) { if (dto == null || string.IsNullOrWhiteSpace(dto.resourceId)) return null; return new ImmersiveBackground { ResourceId = dto.resourceId, Kind = dto.kind, FallbackResourceId = dto.fallbackResourceId }; } } public enum ImmersiveBackgroundKind { Pano = 0, Video360 = 1, Scene3D = 2 } }