CalendarEvents.java

package com.tdmconsult.ete.services.yahoo.dto;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import lombok.Data;
import org.jspecify.annotations.Nullable;

@Data
public class CalendarEvents {

    @Nullable
    private Earnings earnings;

    public Optional<LocalDate> getFirstEarningsDate() {
        return Optional.ofNullable(earnings)
                .map(Earnings::getEarningsDate)
                .filter(Predicate.not(List::isEmpty))
                .map(List::getFirst)
                .map(EarningsDate::getRaw)
                .map(epochSeconds -> Instant.ofEpochSecond(epochSeconds)
                        .atZone(ZoneId.systemDefault())
                        .toLocalDate());
    }

    @Data
    public static class Earnings {
        private List<EarningsDate> earningsDate = new ArrayList<>();
        @Nullable
        private Boolean isEarningsDateEstimate;
    }

    @Data
    public static class EarningsDate {
        private long raw;
        @Nullable
        private String fmt;
    }

    //          {"calendarEvents":{
    //              "maxAge":1,
    //              "earnings":{
    //                  "earningsDate":[{
    //                      "raw":1793304000,
    //                      "fmt":"2026-10-29"}],
    //                  "earningsCallDate":[{
    //                      "raw":1785445200,
    //                      "fmt":"2026-07-30"}],
    //                  "isEarningsDateEstimate":true,
    //                  "earningsAverage":{"raw":0.44394,"fmt":"0.44"},
    //                  "earningsLow":{"raw":-0.81,"fmt":"-0.81"},
    //                  "earningsHigh":{"raw":1.0,"fmt":"1.00"},
    //                  "revenueAverage":{"raw":1187796000,"fmt":"1.19B","longFmt":"1,187,796,000"},
    //                  "revenueLow":{"raw":1187796000,"fmt":"1.19B","longFmt":"1,187,796,000"},
    //                  "revenueHigh":{"raw":1187796000,"fmt":"1.19B","longFmt":"1,187,796,000"}},
    //                  "exDividendDate":{},
    //                  "dividendDate":{}
    //              }
    //          }
}