using ManagerService.DTOs;
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
namespace ManagerService.Data
{
///
/// Resource Information
///
[Index(nameof(InstanceId))]
public class Resource : IAuditableEntity
{
[Key]
[Required]
/*[BsonId]
[BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]*/
public string Id { get; set; }
/*[BsonElement("Type")]
[BsonRequired]*/
[Required]
public ResourceType Type { get; set; }
/*[BsonElement("Label")]
[BsonRequired]*/
[Required]
public string Label { get; set; }
/*[BsonElement("DateCreation")]*/
public DateTime DateCreation { get; set; }
public DateTime DateUpdate { get; set; }
/*[BsonElement("InstanceId")]
[BsonRequired]*/
[Required]
public string InstanceId { get; set; }
/*[BsonElement("URL")]*/
public string Url { get; set; } // Firebase url
public long SizeBytes { get; set; } = 0;
///
/// Clé relative dans le stockage (`pictures/{instanceId}/{resourceId}`), source de vérité.
/// L'URL absolue à jeton reste dans Url, mais elle n'est plus ce dont on part.
///
public string StoragePath { get; set; }
///
/// Vrai nom de fichier ("brochure-2026.pdf"). Ni Label (libellé libre) ni Url (jeton)
/// ne le donnent — nécessaire pour choisir l'extracteur et citer la source.
///
public string FileName { get; set; }
/// Inclure ce document dans les connaissances du guide IA. Exposé dans l'UI en V2 seulement.
public bool IncludeInAiKnowledge { get; set; } = false;
public AiIndexStatus AiIndexStatus { get; set; } = AiIndexStatus.NotIndexed;
/// Raison de l'échec d'indexation, affichée telle quelle au client.
public string AiIndexMessage { get; set; }
public DateTime? AiIndexedAt { get; set; }
public int AiChunkCount { get; set; } = 0;
public ResourceDTO ToDTO()
{
return new ResourceDTO()
{
id = Id,
label = Label,
type = Type,
url = Url,
dateCreation = DateCreation,
instanceId = InstanceId,
sizeBytes = SizeBytes
};
}
}
public enum ResourceType
{
// ⚠️ Persisté en int. Ne JAMAIS réordonner ni insérer au milieu : les valeurs
// existantes en base se décaleraient (les PDF deviendraient des JSON).
// Toute nouvelle valeur s'ajoute à la fin.
Image, // 0
Video, // 1
ImageUrl, // 2
VideoUrl, // 3
Audio, // 4
PDF, // 5
JSON, // 6
JSONUrl, // 7
Word, // 8
PowerPoint, // 9
Text // 10
}
public enum AiIndexStatus
{
NotIndexed = 0,
Pending = 1,
Indexed = 2,
Failed = 3
}
}