// Copyright © 2015 Abhishek Banthia

import Cocoa
import EventKit

class MenubarHandler: NSObject {
    @objc func titleForMenubar() -> String? {

        if let nextEvent = checkForUpcomingEvents() {
            return nextEvent
        }

        guard let menubarTitles = DataStore.shared().retrieve(key: CLMenubarFavorites) as? [Data] else {
            return nil
        }

        // If the menubar is in compact mode, we don't need any of the below calculations; exit early
        if DataStore.shared().shouldDisplay(.menubarCompactMode) {
            return nil
        }

        if menubarTitles.count > 0 {
            let titles = menubarTitles.map({ (data) -> String? in
                let timezone = TimezoneData.customObject(from: data)
                let operationsObject = TimezoneDataOperations(with: timezone!)
                return "\(operationsObject.menuTitle().trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines))"
            })

            let titlesStringified = titles.compactMap { $0 }
            return titlesStringified.joined(separator: " ")
        }

        return nil
    }

    private func checkForUpcomingEvents() -> String? {

        if DataStore.shared().shouldDisplay(.showMeetingInMenubar) {

            let filteredDates = EventCenter.sharedCenter().eventsForDate
            let autoupdatingCal = EventCenter.sharedCenter().autoupdatingCalendar
            guard let events = filteredDates[autoupdatingCal.startOfDay(for: Date())] else {
                return nil
            }

            for event in events {

                if event.event.startDate.timeIntervalSinceNow > 0 && !event.isAllDay {

                    let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60

                    if timeForEventToStart > 30 {

                        print("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")

                        continue
                    }

                    return EventCenter.sharedCenter().format(event: event.event)
                }
            }
        }

        return nil
    }
}