use std::lazy::SyncLazy;
use chrono::TimeZone;
use chrono_tz::US::Eastern;
use crate::calendars::calendar::{Calendar, DaySet};
use crate::calendars::us_holidays::{
AUGUST45_VICTORY_OVER_JAPAN, CHRISTMAS, CHRISTMAS_BEFORE1954, CHRISTMAS_EVES_ADHOC,
CHRISTMAS_EVE_BEFORE1993, CHRISTMAS_EVE_IN_OR_AFTER1993, DAY_AFTER_CHRISTMAS_ADHOC,
DAY_AFTER_INDEPENDENCE_DAY_ADHOC, DAY_BEFORE_DECORATION_ADHOC, FIRST_LUNAR_LANDING_CLOSING,
FRIDAY_AFTER_INDEPENDENCE_DAY_PRE2013, GOOD_FRIDAY, HURRICANE_GLORIA_CLOSING,
HURRICANE_SANDY_CLOSINGS, LINCOLNS_BIRTH_DAY_ADHOC, MARCH33_BANK_HOLIDAY,
MON_TUES_THURS_BEFORE_INDEPENDENCE_DAY, NEW_YORK_CITY_BLACKOUT77, NOVEMBER29_BACKLOG_RELIEF,
PAPERWORK_CRISIS68, SATURDAY, SEPTEMBER11_CLOSINGS, SUNDAY, US_BLACK_FRIDAY_BEFORE1993,
US_BLACK_FRIDAY_IN_OR_AFTER1993, US_COLUMBUS_DAY_BEFORE1954, US_ELECTION_DAY1848TO1967,
US_ELECTION_DAY1968TO1980, US_INDEPENDENCE_DAY, US_INDEPENDENCE_DAY_BEFORE1954, US_LABOR_DAY,
US_LINCOLNS_BIRTH_DAY_BEFORE1954, US_MARTIN_LUTHER_KING_JR_AFTER1998, US_MEMORIAL_DAY,
US_MEMORIAL_DAY1964TO1969, US_MEMORIAL_DAY_BEFORE1964, US_NATIONAL_DAYSOF_MOURNING,
US_NEW_YEARS_DAY, US_PRESIDENTS_DAY, US_THANKSGIVING_DAY, US_THANKSGIVING_DAY1939TO1941,
US_THANKSGIVING_DAY_BEFORE1939, US_VETERANS_DAY1934TO1953, US_WASHINGTONS_BIRTH_DAY1964TO1970,
US_WASHINGTONS_BIRTH_DAY_BEFORE1964, WEATHER_SNOW_CLOSING,
WEDNESDAY_BEFORE_INDEPENDENCE_DAY_POST2013,
};
use crate::op::{SpanOp, TOp};
use crate::time::Time;
static NYSE_SPECIAL: SyncLazy<DaySet> = SyncLazy::new(|| {
DaySet::new().with_adhoc(&[
Eastern.ymd(1997, 12, 26),
Eastern.ymd(1999, 12, 31),
Eastern.ymd(2003, 12, 26),
Eastern.ymd(2013, 7, 3),
])
});
#[must_use]
pub fn get_nyse() -> Calendar {
Calendar::new(
"NYSE",
Eastern,
&[SpanOp::new(Time::op(TOp::AddMins, 570), Time::op(TOp::AddHours, 16))],
&[
&SATURDAY,
&SUNDAY,
&US_NEW_YEARS_DAY,
&US_MARTIN_LUTHER_KING_JR_AFTER1998,
&US_LINCOLNS_BIRTH_DAY_BEFORE1954,
&US_WASHINGTONS_BIRTH_DAY_BEFORE1964,
&US_WASHINGTONS_BIRTH_DAY1964TO1970,
&US_PRESIDENTS_DAY,
&GOOD_FRIDAY,
&US_MEMORIAL_DAY_BEFORE1964,
&US_MEMORIAL_DAY1964TO1969,
&US_MEMORIAL_DAY,
&US_INDEPENDENCE_DAY_BEFORE1954,
&US_INDEPENDENCE_DAY,
&US_LABOR_DAY,
&US_THANKSGIVING_DAY_BEFORE1939,
&US_THANKSGIVING_DAY1939TO1941,
&US_THANKSGIVING_DAY,
&US_ELECTION_DAY1848TO1967,
&US_ELECTION_DAY1968TO1980,
&US_VETERANS_DAY1934TO1953,
&US_COLUMBUS_DAY_BEFORE1954,
&CHRISTMAS_BEFORE1954,
&CHRISTMAS,
&NOVEMBER29_BACKLOG_RELIEF,
&MARCH33_BANK_HOLIDAY,
&AUGUST45_VICTORY_OVER_JAPAN,
&CHRISTMAS_EVES_ADHOC,
&DAY_AFTER_CHRISTMAS_ADHOC,
&DAY_BEFORE_DECORATION_ADHOC,
&LINCOLNS_BIRTH_DAY_ADHOC,
&PAPERWORK_CRISIS68,
&DAY_AFTER_INDEPENDENCE_DAY_ADHOC,
&WEATHER_SNOW_CLOSING,
&FIRST_LUNAR_LANDING_CLOSING,
&SEPTEMBER11_CLOSINGS,
&NEW_YORK_CITY_BLACKOUT77,
&HURRICANE_GLORIA_CLOSING,
&HURRICANE_SANDY_CLOSINGS,
&US_NATIONAL_DAYSOF_MOURNING,
],
&[
(
&[SpanOp::new(Time::op(TOp::AddMins, 570), Time::op(TOp::AddHours, 13))],
&[
&MON_TUES_THURS_BEFORE_INDEPENDENCE_DAY,
&FRIDAY_AFTER_INDEPENDENCE_DAY_PRE2013,
&WEDNESDAY_BEFORE_INDEPENDENCE_DAY_POST2013,
&US_BLACK_FRIDAY_IN_OR_AFTER1993,
&CHRISTMAS_EVE_IN_OR_AFTER1993,
&NYSE_SPECIAL,
],
),
(
&[SpanOp::new(Time::op(TOp::AddMins, 570), Time::op(TOp::AddHours, 14))],
&[&CHRISTMAS_EVE_BEFORE1993, &US_BLACK_FRIDAY_BEFORE1993],
),
],
)
}