use chrono::{Duration, NaiveDate};
use icalendar::{Alarm, Calendar, Component, Event, EventLike, Property};

use crate::trash::TrashType;

pub(crate) fn calendar_from_pickup_dates(dates: Vec<(TrashType, NaiveDate)>) -> Calendar {
    let mut ical = Calendar::new();
    ical.name("Twente Milieu Afvalkalender");

    let events = dates.iter().map(|date| {
        let description = match date.0 {
            TrashType::Grey => "Restafval wordt opgehaald",
            TrashType::Green => "GFT wordt opgehaald",
            TrashType::Paper => "Papier wordt opgehaald",
            TrashType::Packages => "Verpakkingen worden opgehaald",
        };

        let color = Property::new(
            "COLOR",
            match date.0 {
                TrashType::Grey => "darkgray",
                TrashType::Green => "darkgreen",
                TrashType::Paper => "royalblue",
                TrashType::Packages => "darkorange",
            },
        );

        let reminder = Alarm::display(description, -Duration::hours(5));

        Event::new()
            .all_day(date.1)
            .summary(description)
            .append_property(color)
            .alarm(reminder)
            .done()
    });

    for event in events {
        ical.push(event);
    }

    ical.done()
}