//  Class to define a event entry
//
class Itinerary
{

var dest: String? = nil
var days: [ Day? ] = []

init(_ str: String?)
{

    if !parse(str) {
        C.alert("No trip yet", msg: "There is no trip defined.  A default one has been added, use the navigation bar controls to define your trip")
        _ = parse("{\"where\":\"Going somewhere\"," +
                    "\"date_fmt\":\"M/d/yyyy\"," +
                    "\"days\":[" +
                                "{\"date\":\"" + C.today() + "\"," +
                                "\"events\":[]}]}") }
}

func parse(_ str: String?) -> Bool
{

    guard let json = Json.str2json(str) as? [ String: Any ],
          let dest = Json.get_str(json, key: "where"),
          let jdays = Json.get_json(json, key: "days") as? [ Any ] else {
            Log.d("bad JSON - \(str ?? "?")")
            return false
        }
    let fmt = Json.get_str(json, key: "date_fmt") ?? "M/d/yyyy"
    let idx = C.fmts.firstIndex(where: { $0 == fmt })
    C.date_fmt = C.DATE_FMT(rawValue: idx ?? 0) ?? .MDYYYY
    self.dest = dest
    for day in jdays {
        self.days.append(Day(day as! [ String: Any], first: 0))
    }
    return true
}

func get_where() -> String? { return dest }
func set_where(_ dest: String?) { self.dest = dest }

func get_day(_ idx: Int) -> Day? { return days[idx] }

func get_day_max() -> Int { return days.count }

func add_day(_ day: Day) -> Int
{
    var idx: Int = 0
    var d: Int

    let max = days.count
    for i in 0...max {
        idx = i
        if i == max {
            break }
        d = get_day(i)!.date
        if d == day.date {
            self.days[idx] = day
            return idx
        }
        if d > day.date {
            break }
    }
    days.insert(day, at: idx)
    return idx
}

func rm_day(_ idx: Int) -> Int
{

    if days.count <= 1 {
        return -1 }
    days.remove(at: idx)
    return (idx >= days.count) ? (idx - 1) : idx
}

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

    var map: [ String: Any ] = [:]
    map["where"] = dest
    map["date_fmt"] = C.fmts[C.date_fmt.rawValue]
    var list: [ Any ] = []
    for day in days {
        list.append(day!.marshall())
    }
    map["days"] = list
    return map
}

}
