#!/usr/bin/python3

import csv
from datetime import datetime, timedelta

# from pprint import pprint

now = datetime.now()
since_date = now - timedelta(days=365 * 5)

airlines = {
    "British Airways": "BA",
    "Iberia Airlines": "IB",
    "Qatar Airways": "QR",
    "Ryanair": "FR",
    "easyJet": "U2",
    "SAS": "SK",
}

Flight = dict[str, str]
Flights = list[tuple[datetime, Flight]]


def format_row(dt: datetime, f: Flight) -> str:
    """Format flight."""
    d = dt.strftime("%a, %d %b %Y")
    days = (dt - now).days

    if days == 0 or days == -1:
        delta = "today"
    elif days < 0:
        delta = f"{-days:>3d} days ago"
    else:
        delta = f"{days:>3d} days"

    airline = f["Airline"]
    if len(airline) > 15:
        airline = "".join(t[0] for t in airline.split())

    flight_number = f["Flight_Number"]
    if flight_number.isdigit() and airline in airlines:
        flight_number = airlines[airline] + flight_number

    return (
        ("*" if delta == "today" else " ")
        + f' {d} {delta:>13s}  {f["From"]:4s} -> {f["To"]:4s}  '
        + f'{airline:>15s}  {flight_number:<7s}  {f["Class"]}  '
        + f'{f["Seat"]:>4s}  {f["Plane"]}'
    )


def read_flights(filename: str) -> Flights:
    """Read flights from CSV."""
    reader = csv.DictReader(open(filename))

    flights = []

    for row in reader:
        d = row.pop("\ufeffDate")
        if len(d) > 10:
            d = datetime.strptime(d, "%Y-%m-%d %H:%M:%S")
        else:
            d = datetime.strptime(d, "%Y-%m-%d")
        row = {k: v for k, v in row.items() if not k.endswith("OID")}
        # for key in "Trip", "Seat", "Seat_Type", "Class", "Reason", "Note":
        #     row.pop(key)
        if d < since_date:
            continue
        flights.append((d, row))

    flights.sort()

    return flights


def show_flights(flights: Flights) -> None:
    """Show list of flights."""
    for d, row in flights:
        print(format_row(d, row))


if __name__ == "__main__":
    filename = "/home/edward/backup/openflights/openflights-backup-2023-09-09.csv"
    flights = read_flights(filename)
    show_flights(flights)