//
//  ViewController.swift
//  Sojourn
//
//  Created by Donald Dugger on 4/15/26.
//

import UIKit

class DayVC: UIViewController, UITableViewDelegate, UITableViewDataSource, PopupDelegate
{

weak var delegate: TripDelegate?

var day: Day?
var day_idx: Int!

@IBOutlet weak var DatesLabel: UILabel!
@IBOutlet weak var DatesTable: UITableView!

//  tableView(numberOfRowsInSection): return number in a section
//
//    Just the count of items in that associated data table.  On
//    exception is the BT section, it always just has 1 row (for
//    consistency we return the data count but it will always be 1)
//
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{

    return day?.events.count ?? 0
}

//  tableView(cellForRowAt): render a row of the table
//
//    Render a row
//
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    var msg: String

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "DatesItem", for: indexPath) as? DatesItem else {
        fatalError("Dequeued cell is not an instance of DatesItem")
    }
    guard let event = day?.events[indexPath.row] else {
        fatalError("DayVC:impossible - missing event")
    }
    let t = event.type
    var start = event.start
    let end = event.end
    var arrive = ""
    let type_img = ev_image(t)
    cell.EventType?.image = type_img
    if event.start >= 0 {
        msg = C.hm2str(event.start) }
    else {
        msg = C.hm2str(event.end) }

    if (t == .FLIGHT || t == .RIDE || t == .TRAIN) {
        if start <= 0 {
            start = end }
        else if end >= 0 {
            arrive = "Arrive: \(C.hm2str(end))" }
        msg += sh_field(event.to, pre: ": ")
    } else if t == .RENTAL {
        if start < 0 {
            msg += " (drop off)" }
        else if end < 0 {
            msg += " (pickup)" }
    } else if t == .LODGING {
        if start < 0 {
            msg += " (check out)" }
        else if end < 0 {
            msg += " (check in)" }
    } else if (t == .ACTIVITY) && (end >= 0) {
        arrive = "End: \(C.hm2str(end))" }

    if !arrive.isEmpty {
        msg += "\n  " + arrive }
    if !event.carrier.isEmpty {
        msg += " \n  \(event.carrier)" }
    if !event.ident.isEmpty {
        msg += ", \(event.get_lbl("ident")): \(event.ident)" }
    if !event.seat.isEmpty {
        if !event.gate.isEmpty {
            msg += " \n  \(event.get_lbl("gate")): \(event.gate), " }
        else {
            msg += " \n  " }
        msg += "\(event.get_lbl("seat")): \(event.seat)" }
    if !event.cf.isEmpty {
        msg += "\n  CF: " + event.cf }
    if !event.desc.isEmpty {
        msg += "\n  Activity: " + event.desc }
    cell.EventStart?.text = msg

    return cell
}

//  tableView(didSelectRowAt): handle user taps on a row
//
//  This code just connects to the device.  One kink is that
//  taps are ignored if the table is draggable (e.g. the user
//  is re-ordering the favorite section)
//
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{

//Log.d("tableView:Tap on row \(indexPath)")
    guard let popVC = storyboard?.instantiateViewController(withIdentifier: "PopupVC") as! PopupVC? else {
            return
    }
    popVC.delegate = self
    popVC.handler = EventPop()
    popVC.data = day?.get_event(indexPath.row)
    delegate?.sh_popup(popVC, mode: .popover)
}

//  Handle user long press on a row
//
//  Put up an alert that lets the user delete this entry
//
@objc
func long_tap(sender: UILongPressGestureRecognizer)
{

    if sender.state == .began {
        let loc = sender.location(in: DatesTable)
        if let which = DatesTable.indexPathForRow(at: loc) {
            let idx = which.row
            C.alert("Delete event", msg: "show event", vc: self) { () in
                self.day!.rm_event(idx)
                C.put_trip()
                self.DatesTable.reloadData()
            }
        }
    }
}

//  Called for an update to an event
//
public func event_upd(old: Event?, new: Event)
{

Log.l("DayVC: event_upd()")
    if let ev = old {
        day?.rm_event(ev) }
    day?.add_event(new)
    C.put_trip()
    DatesTable.reloadData()
}

override func viewDidLoad() {
	super.viewDidLoad()
	// Do any additional setup after loading the view.
Log.d("viewDidLoad()")

    DatesLabel.text = C.dow(day!.date)
    DatesLabel.isUserInteractionEnabled = true
    DatesLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(d_tapped)))

    DatesTable.delegate = self
    DatesTable.dataSource = self

    let longPress = UILongPressGestureRecognizer(target: self, action: #selector(long_tap))
    DatesTable.addGestureRecognizer(longPress)

    DatesTable.rowHeight = UITableView.automaticDimension
    DatesTable.estimatedRowHeight = 44
}

@objc
func d_tapped(_ sender: UITapGestureRecognizer)
{

Log.l("DatesLabel tapped")
    C.alert("Remove day", msg: C.epoch2str(day!.date), vc: self) { () in
        self.delegate?.rm_day(self.day_idx)
    }
}

private func ev_image(_ type: C.EV_TYPE?) -> UIImage
{

    switch type {

    case .FLIGHT:
        return UIImage(systemName: "airplane")!

    case .RIDE:
        return UIImage(systemName: "bus")!

    case .RENTAL:
        return UIImage(systemName: "car")!

    case .TRAIN:
        return UIImage(systemName: "cablecar")!

    case .LODGING:
        return UIImage(systemName: "bed.double")!

    case .ACTIVITY:
        return UIImage(systemName: "ticket")!

    default:
        return UIImage(systemName: "questionmark")!

    }
}

func sh_field(_ field: String, pre: String) -> String
{

    return field.isEmpty ? "" : (pre + field)
}

}
