//  Class to define a day entry
//
class Day
{

var date: Int = 0
var date_idx: Int = 0

var events: [ Event? ] = []

init?(_ json: [ String: Any], first: Int)
{

    guard let date = Json.get_str(json, key: "date"),
          let evs = Json.get_json(json, key: "events") as? [ Any ] else {
        Log.d("Day: bad JSON")
        return nil
    }
    self.date = C.str2epoch(date)
    for event in evs {
        self.events.append(Event(event as! [ String: String] ))
    }
}

init?(_ date: Int, first: Int)
{

    self.date = date
}

func get_index(_ ev: Event) -> Int?
{

    if let index = events.firstIndex(where: { $0 === ev }) {
//Log.l("get_index:\(index)")
        return index }
    return nil
}

func get_event(_ idx: Int) -> Event? { return events[idx] }

func rm_event(_ idx: Int)
{

    if idx < 0 || idx >= events.count {
        Log.l("Day:\(idx) - invalid event index to remove") }
    else {
        events.remove(at: idx) }
}

func rm_event(_ event: Event)
{

    guard let idx = get_index(event) else {
        return
    }
    if idx < 0 || idx >= events.count {
        Log.l("Day:\(idx) - invalid event index to remove") }
    else {
        events.remove(at: idx) }
}

func sort_time(_ ev: Event) -> Int
{

    return (ev.start < 0) ? ev.end : ev.start
}

func add_event(_ event: Event)
{
    var idx: Int = -1

//Log.l("Day:add_event(\(C.hm2str(sort_time(event))) - \(C.epoch2str(date))")
    if let idx = get_index(event) {
        rm_event(idx) }

    let et_time = sort_time(event)
    for i in 0..<events.count {
        if sort_time(get_event(i)!) > et_time {
            break }
        idx = i
    }
    events.insert(event, at: idx + 1)
    return
}

func marshall() -> [ String: Any ]
{

    var map: [ String: Any ] = [:]
    map["date"] = C.epoch2str(date)
    var list: [ Any ] = []
    for event in events {
        list.append(event!.marshall())
    }
    map["events"] = list
    return map
}

}
