using System.Text.Json; using System.Globalization; using Application; namespace Infrastructure { public class CalendarioService : ICalendarioService { private const string Url = "https://www.ccee.org.br/en/web/guest/calendario?p_p_id=com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn&p_p_lifecycle=2&p_p_cacheability=cacheLevelPage&doAsUserId=&p_p_resource_id=calendarBookings"; public async Task ObterEventoLimiteColetaAsync(DateTime dataReferencia, CancellationToken ct = default) { var year = dataReferencia.Year; var month = dataReferencia.Month - 1; var dayFinal = DateTime.DaysInMonth(year, month + 1); var values = new Dictionary { ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_calendarIds"] = "55985", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeDay"] = dayFinal.ToString(), ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeHour"] = "23", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeMinute"] = "59", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeMonth"] = month.ToString(), ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeYear"] = year.ToString(), ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_eventsPerPage"] = "-1", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeDay"] = "1", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeHour"] = "0", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeMinute"] = "0", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeMonth"] = month.ToString(), ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeYear"] = year.ToString(), }; try { using var client = new HttpClient(); using var content = new FormUrlEncodedContent(values); var resp = await client.PostAsync(Url, content, ct); var resposta = await resp.Content.ReadAsStringAsync(ct); var alvo = $"Data limite para coleta diária dos dados de medição no SCDE"; try { using var doc = JsonDocument.Parse(resposta); string? found = null; void SearchJson(JsonElement el) { if (found != null) return; switch (el.ValueKind) { case JsonValueKind.String: var s = el.GetString() ?? ""; if (s.Contains(alvo, StringComparison.OrdinalIgnoreCase)) found = s; break; case JsonValueKind.Object: foreach (var prop in el.EnumerateObject()) SearchJson(prop.Value); break; case JsonValueKind.Array: foreach (var item in el.EnumerateArray()) SearchJson(item); break; } } SearchJson(doc.RootElement); if (found != null) return found; } catch { } var idx = resposta.IndexOf(alvo, StringComparison.OrdinalIgnoreCase); if (idx >= 0) { var start = Math.Max(0, idx - 60); var len = Math.Min(400, resposta.Length - start); return resposta.Substring(start, len).Replace("\r", " ").Replace("\n", " "); } return null; } catch { return null; } } } }