using System.Text.Json; using eSPJ.Models; namespace eSPJ.Services { public class HistoryService { private readonly string _historyUpstFilePath; private readonly ILogger _logger; public HistoryService(IWebHostEnvironment env, ILogger logger) { _logger = logger; _historyUpstFilePath = Path.Combine(env.ContentRootPath, "Data", "history-upst.json"); } public async Task GetUpstHistoryAsync(DateOnly? fromDate, DateOnly? toDate, int page = 1, int pageSize = 5) { page = page < 1 ? 1 : page; pageSize = pageSize <= 0 ? 5 : pageSize; var items = await ReadUpstHistoryAsync(); var query = items.AsEnumerable(); if (fromDate.HasValue) { query = query.Where(item => DateOnly.FromDateTime(item.TanggalWaktu) >= fromDate.Value); } if (toDate.HasValue) { query = query.Where(item => DateOnly.FromDateTime(item.TanggalWaktu) <= toDate.Value); } var ordered = query .OrderByDescending(item => item.TanggalWaktu) .ToList(); var totalItems = ordered.Count; var totalPages = totalItems == 0 ? 1 : (int)Math.Ceiling(totalItems / (double)pageSize); var safePage = Math.Min(page, totalPages); var pagedItems = ordered .Skip((safePage - 1) * pageSize) .Take(pageSize) .ToList(); return new HistoryListResponse { Items = pagedItems, Page = safePage, PageSize = pageSize, TotalItems = totalItems, TotalPages = totalPages, FromDate = fromDate?.ToString("yyyy-MM-dd"), ToDate = toDate?.ToString("yyyy-MM-dd") }; } private async Task> ReadUpstHistoryAsync() { try { if (!File.Exists(_historyUpstFilePath)) { return new List(); } var json = await File.ReadAllTextAsync(_historyUpstFilePath); var items = JsonSerializer.Deserialize>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); return items ?? new List(); } catch (Exception ex) { _logger.LogError(ex, "Error reading UPST history JSON"); return new List(); } } } }