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
}
}