using LiteDB; using VideoStudy.Shared; namespace VideoStudy.Shared.Services; public class PersistenceService { private readonly string _basePath; private readonly string _dbPath; public PersistenceService() { // Define a pasta base em %USERPROFILE%/MeuVideoStudy // Funciona em Windows, macOS e Linux (limitado pelo ambiente MAUI) _basePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "MeuVideoStudy"); _dbPath = Path.Combine(_basePath, "videostudy.db"); if (!Directory.Exists(_basePath)) { Directory.CreateDirectory(_basePath); } } public string GetBasePath() => _basePath; /// /// Retorna as subpastas físicas dentro do diretório base. /// public List GetFolders() { if (!Directory.Exists(_basePath)) return new List(); return Directory.GetDirectories(_basePath) .Select(Path.GetFileName) .Where(name => name != null) .ToList()!; } /// /// Cria uma nova pasta física. /// public void CreateFolder(string folderName) { var path = Path.Combine(_basePath, folderName); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } } /// /// Salva o PDF no disco e registra no LiteDB. /// public async Task SaveSessionAsync(byte[] pdfData, string title, string? youtubeId, string folderName = "Geral") { // Garantir que a pasta existe var folderPath = Path.Combine(_basePath, folderName); if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); } // Criar nome de arquivo seguro var safeTitle = string.Join("_", title.Split(Path.GetInvalidFileNameChars())); var fileName = $"{safeTitle}_{DateTime.Now:yyyyMMdd_HHmmss}.pdf"; var filePath = Path.Combine(folderPath, fileName); // Gravar arquivo físico await File.WriteAllBytesAsync(filePath, pdfData); // Registrar no LiteDB using var db = new LiteDatabase(_dbPath); var collection = db.GetCollection("sessions"); var session = new VideoStudySession { Title = title, YouTubeId = youtubeId ?? "local", FilePath = filePath, FolderName = folderName, CreatedAt = DateTime.Now }; collection.Insert(session); collection.EnsureIndex(x => x.Title); return session; } /// /// Recupera todas as sessões do banco. /// public List GetAllSessions() { using var db = new LiteDatabase(_dbPath); return db.GetCollection("sessions") .FindAll() .OrderByDescending(x => x.CreatedAt) .ToList(); } }