using Manager.DTOs;
using ManagerService.DTOs;
using NetTopologySuite.Geometries;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
namespace ManagerService.Data.SubSection
{
///
/// Section map
///
public class SectionMap : Section
{
public int MapZoom { get; set; } // Default = 18
public MapTypeApp? MapMapType { get; set; } // Default = Hybrid for Google
public MapTypeMapBox? MapTypeMapbox { get; set; } // Default = standard for MapBox
public MapProvider? MapMapProvider { get; set; } // Default = Google
public List MapPoints { get; set; }
public string MapResourceId { get; set; }
public Resource MapResource { get; set; } // Icon
[Required]
[Column(TypeName = "jsonb")]
public List MapCategories { get; set; }
public string MapCenterLatitude { get; set; } // Center on
public string MapCenterLongitude { get; set; } // Center on
public MapDTO ToDTO()
{
return new MapDTO()
{
id = Id,
label = Label,
title = Title.ToList(),
description = Description.ToList(),
order = Order,
type = Type,
imageId = ImageId,
imageSource = ImageSource,
configurationId = ConfigurationId,
isSubSection = IsSubSection,
parentId = ParentId,
dateCreation = DateCreation,
instanceId = InstanceId,
isBeacon = IsBeacon,
beaconId = BeaconId,
latitude = Latitude,
longitude = Longitude,
meterZoneGPS = MeterZoneGPS,
zoom = MapZoom,
mapType = MapMapType,
mapTypeMapbox = MapTypeMapbox,
mapProvider = MapMapProvider,
iconResourceId = MapResourceId,
categories = MapCategories,
centerLatitude = MapCenterLatitude,
centerLongitude = MapCenterLongitude
};
}
}
public class GeoPoint
{
[Required]
public int? Id { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Title { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Description { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Contents { get; set; }
public int? CategorieId { get; set; }
public Geometry Geometry { get; set; }
public string PolyColor { get; set; } // color of the polyline or polygon
public string ImageResourceId { get; set; }
public string ImageUrl { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Schedules { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Prices { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Phone { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Email { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Site { get; set; }
public string? SectionMapId { get; set; }
[ForeignKey(nameof(SectionMapId))]
public SectionMap? SectionMap { get; set; }
public string? SectionEventId { get; set; }
[ForeignKey(nameof(SectionEventId))]
public SectionEvent? SectionEvent { get; set; }
}
public class GuidedPath // Parcours
{
[Key]
public string Id { get; set; }
[Required]
public string InstanceId { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Title { get; set; }
[Column(TypeName = "jsonb")]
public List Description { get; set; }
// Lié à une carte (optionnel)
public string? SectionMapId { get; set; }
[ForeignKey("SectionMapId")]
public SectionMap? SectionMap { get; set; }
// Lié à un événement (optionnel)
public string? SectionEventId { get; set; }
[ForeignKey("SectionEventId")]
public SectionEvent? SectionEvent { get; set; }
// Type de parcours
public bool IsLinear { get; set; } = true; // Avancer dans l’ordre - Ordre obligatoire
public bool RequireSuccessToAdvance { get; set; } = false; // Par exemple: résoudre une énigme
public bool HideNextStepsUntilComplete { get; set; } = false; // Étapes cachées tant que non terminées
public int Order { get; set; }
public List Steps { get; set; } = new();
}
public class GuidedStep // Étape d’un parcours
{
[Key]
public string Id { get; set; }
[Required]
public string GuidedPathId { get; set; }
[ForeignKey("GuidedPathId")]
public GuidedPath GuidedPath { get; set; }
public int Order { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List Title { get; set; }
[Column(TypeName = "jsonb")]
public List Description { get; set; }
public Geometry Geometry { get; set; } // Polygon ou centre du cercle
public double? ZoneRadiusMeters { get; set; } // Optionnel, utile si zone cercle ou point
public string ImageUrl { get; set; }
public int? TriggerGeoPointId { get; set; } // Lieu lié à l'étape et genre si on veut plus d'info ou pourrait afficher les infos du geopoint.
[ForeignKey("TriggerGeoPointId")]
public GeoPoint TriggerGeoPoint { get; set; }
public bool IsHiddenInitially { get; set; } = false;
// Exemple pour escape game
public List? QuizQuestions { get; set; } // One or multiple question
// Option : si true, cette étape a un compte à rebourds, false sinon
public bool IsStepTimer { get; set; } = false;
// Option : si true, cette étape doit être validée avant de passer à la suivante
public bool IsStepLocked { get; set; } = true;
// Timer en secondes (durée max pour valider cette étape, optionnel)
public int? TimerSeconds { get; set; }
// Option : message ou action à effectuer si timer expire (ex: afficher aide, fin du jeu...)
[Column(TypeName = "jsonb")]
public List TimerExpiredMessage { get; set; }
}
// SectionMap "normal" comme avant => Via geopoints. Si il y a des guidedPath lié à la sectionMap alors il y a un parcours lié à la sectionMap, tu peux aussi avoir des geopoints classique mis là + des parcours. et aussi lier un guidedstep à un geopoint (pour le trigger et aussi pour "afficher plus")
// parcours libre
/*{
"IsLinear": false,
"RequireSuccessToAdvance": false,
"HideNextStepsUntilComplete": false,
"Steps": [
{ "Title": "La tour", "GeoPointId": "...", "IsOptional": false },
{ "Title": "Les jardins", "GeoPointId": "...", "IsOptional": false }
]
}*/
// Parcours escape game
/*{
"IsLinear": true,
"RequireSuccessToAdvance": true,
"HideNextStepsUntilComplete": true,
"Steps": [
{ "Title": "Enigme 1", "RiddleQuestion": "Quel est le code ?", "RiddleAnswer": "1234" },
{ "Title": "Enigme 2", "RiddleQuestion": "Combien de colonnes ?", "RiddleAnswer": "6" }
]
}*/
/*
* {
"Id": "escape001",
"IsLinear": true,
"RequireSuccessToAdvance": true,
"HideNextStepsUntilComplete": true,
"Steps": [
{
"Id": "step1",
"Title": [{ "Lang": "fr", "Text": "Enigme 1" }],
"TriggerGeoPoint": {
"GeometryType": "Circle",
"Coordinates": [{ "Latitude": 49.5, "Longitude": 5.9 }],
"ZoneRadiusMeters": 30
},
"ValidationQuestion": [{ "Lang": "fr", "Text": "Quel est le code secret ?" }],
"ExpectedAnswer": [{ "Lang": "fr", "Text": "1234" }],
"IsStepTimer": true,
"TimerSeconds": 300,
"IsStepLocked": true
},
{
"Id": "step2",
"Title": [{ "Lang": "fr", "Text": "Enigme 2" }],
"TriggerGeoPoint": {
"GeometryType": "Point",
"Coordinates": [{ "Latitude": 49.51, "Longitude": 5.91 }]
},
"ValidationQuestion": [{ "Lang": "fr", "Text": "Combien de colonnes ?" }],
"ExpectedAnswer": [{ "Lang": "fr", "Text": "6" }],
"IsStepTimer": false,
"IsStepLocked": true
}
]
}
*/
}