use foxtive_cron::builder::{CronExpression, Month, Weekday};
fn main() {
println!("=== Builder Edge Cases & Validation Examples ===\n");
println!("1. Boundary Value Testing:");
let min_values = CronExpression::builder()
.second(0)
.minute(0)
.hour(0)
.day_of_month(1)
.month(Month::January);
let max_values = CronExpression::builder()
.second(59)
.minute(59)
.hour(23)
.day_of_month(31)
.month(Month::December);
println!(" Minimum values: {}", min_values.build());
println!(" Maximum values: {}", max_values.build());
println!();
println!("2. Single Values vs Intervals:");
let single_minute = CronExpression::builder().minute(30).hourly();
let interval_minutes = CronExpression::builder().minutes_interval(30).hourly();
println!(" Single (at :30): {}", single_minute.build());
println!(" Interval (/30): {}", interval_minutes.build());
println!();
println!("3. Range Combinations:");
let morning_range = CronExpression::builder().hours_range(6, 12).daily();
let afternoon_range = CronExpression::builder().hours_range(12, 18).daily();
let evening_range = CronExpression::builder().hours_range(18, 23).daily();
println!(" Morning (6-12): {}", morning_range.build());
println!(" Afternoon (12-18): {}", afternoon_range.build());
println!(" Evening (18-23): {}", evening_range.build());
println!();
println!("4. List vs Range Equivalence:");
let as_list = CronExpression::builder()
.hours_list(&[1, 2, 3, 4, 5])
.daily();
let as_range = CronExpression::builder().hours_range(1, 5).daily();
println!(" As list [1,2,3,4,5]: {}", as_list.build());
println!(" As range 1-5: {}", as_range.build());
println!(" Both produce same schedule\n");
println!("5. Sparse Scheduling Patterns:");
let quarterly = CronExpression::builder()
.month(Month::March)
.day_of_month(1);
let semi_annual = CronExpression::builder()
.month(Month::June)
.day_of_month(30)
.hour(17);
println!(" Quarterly: {}", quarterly.build());
println!(" Semi-annual: {}", semi_annual.build());
println!();
println!("6. High-Frequency Scheduling:");
let every_10_sec = CronExpression::builder().seconds_interval(10);
let every_5_min = CronExpression::builder().minutes_interval(5);
let every_hour = CronExpression::builder().hourly();
println!(" Every 10 seconds: {}", every_10_sec.build());
println!(" Every 5 minutes: {}", every_5_min.build());
println!(" Every hour: {}", every_hour.build());
println!();
println!("7. Weekday Pattern Variations:");
let weekdays = CronExpression::builder().weekdays_only().hour(9);
let weekends = CronExpression::builder()
.day_of_week(Weekday::Saturday)
.day_of_week(Weekday::Sunday)
.hour(10);
let mon_fri = CronExpression::builder()
.day_of_week(Weekday::Monday)
.day_of_week(Weekday::Friday)
.hour(9);
println!(" Weekdays only: {}", weekdays.build());
println!(" Weekends only: {}", weekends.build());
println!(" Mon & Fri: {}", mon_fri.build());
println!();
println!("8. Seasonal Month Groupings:");
let spring = CronExpression::builder()
.month(Month::March)
.day_of_month(1);
let summer = CronExpression::builder().month(Month::June).day_of_month(1);
let fall = CronExpression::builder()
.month(Month::September)
.day_of_month(1);
let winter = CronExpression::builder()
.month(Month::December)
.day_of_month(1);
println!(" Spring start: {}", spring.build());
println!(" Summer start: {}", summer.build());
println!(" Fall start: {}", fall.build());
println!(" Winter start: {}", winter.build());
println!();
println!("9. Preset Methods Comparison:");
let hourly_preset = CronExpression::builder().hourly();
let daily_preset = CronExpression::builder().daily();
let weekly_preset = CronExpression::builder().weekly();
let monthly_preset = CronExpression::builder().monthly();
println!(" hourly(): {}", hourly_preset.build());
println!(" daily(): {}", daily_preset.build());
println!(" weekly(): {}", weekly_preset.build());
println!(" monthly(): {}", monthly_preset.build());
println!();
println!("10. Method Chaining Order:");
let chain_a = CronExpression::builder().daily().hour(9).minute(30);
let chain_b = CronExpression::builder().minute(30).hour(9).daily();
println!(" daily().hour(9).minute(30): {}", chain_a.build());
println!(" minute(30).hour(9).daily(): {}", chain_b.build());
println!(" Order doesn't affect result\n");
println!("11. Real-world Validation Scenarios:");
let banking_hours = CronExpression::builder()
.weekdays_only()
.hours_range(9, 15)
.minutes_interval(30);
let retail_hours = CronExpression::builder().daily().hours_range(10, 21);
let restaurant_hours = CronExpression::builder()
.daily()
.hours_list(&[11, 12, 13, 14, 15, 17, 18, 19, 20, 21]);
println!(" Banking (9-3): {}", banking_hours.build());
println!(" Retail (10-9): {}", retail_hours.build());
println!(" Restaurant hours: {}", restaurant_hours.build());
println!();
println!("12. Wildcard Patterns:");
let all_wildcards = CronExpression::builder().every_second();
let minute_wildcard = CronExpression::builder().every_minute();
println!(" Every second: {}", all_wildcards.build());
println!(" Every minute: {}", minute_wildcard.build());
println!();
println!("13. Day of Month Edge Cases:");
let first_day = CronExpression::builder().day_of_month(1).monthly();
let mid_month = CronExpression::builder().day_of_month(15).monthly();
let last_possible = CronExpression::builder().day_of_month(31).monthly();
println!(" 1st of month: {}", first_day.build());
println!(" 15th of month: {}", mid_month.build());
println!(" 31st of month: {}", last_possible.build());
println!(" Note: Skips months with <31 days\n");
println!("14. Timezone Interaction Patterns:");
use chrono_tz::US::Eastern;
let tz_with_range = CronExpression::builder()
.hours_range(9, 17)
.with_timezone(Eastern);
let tz_with_list = CronExpression::builder()
.hours_list(&[9, 12, 15])
.with_timezone(Eastern);
let tz_with_interval = CronExpression::builder()
.hours_list(&[9, 13, 17])
.with_timezone(Eastern);
println!(" TZ + range: {}", tz_with_range.build());
println!(" TZ + list: {}", tz_with_list.build());
println!(" TZ + intervals: {}", tz_with_interval.build());
println!();
println!("15. Jitter Across Frequencies:");
let low_freq_jitter = CronExpression::builder()
.daily()
.hour(2)
.with_jitter(std::time::Duration::from_secs(3600));
let high_freq_jitter = CronExpression::builder()
.seconds_interval(30)
.with_jitter(std::time::Duration::from_secs(5));
println!(" Daily ±1hr: {}", low_freq_jitter.build());
println!(" 30s ±5sec: {}", high_freq_jitter.build());
println!(" Jitter scales with frequency\n");
println!("=== All edge case examples completed! ===");
}