#!/bin/sh
set -euC

# Usage: firefox-session-export [<file>]

file="${1:-}"
if ! [ "$file" ]
then
  for file_ in \
    "$HOME/.mozilla/firefox/"*default*'/sessionstore.jsonlz4' \
    "$HOME/.mozilla/firefox/"*default*'/sessionstore-backups/recovery.jsonlz4' \
    "$HOME/.mozilla/firefox/"*default*'/sessionstore-backups/previous.jsonlz4' \
    "$HOME/.mozilla/firefox/"*default*'/sessionstore-backups/recovery.baklz4'
  do
    [ -r "$file_" ] || continue
    file="$file_" && break
  done
fi
if ! [ "$file" ]
then
  echo 'Could not find session.' >&2
  exit 1
fi

# session="$(basename "$file")"
session="${file#$HOME/.mozilla/firefox/}"
lz4jsoncat "$file" | jq --arg session "$session" --raw-output '
  def time:
    . / 1000 | strflocaltime("%Y-%m-%d %H:%M:%S");

  def entry($isSelected; $lastAccessed):
    (($isSelected | select(.) | "**") // "") as $bold |
    ("\($lastAccessed | time): "?     // "") as $time |
    "\($bold)\($time)[\(.title | @html)](\(.url))\($bold)";

  def tabs($selected):
    to_entries[] | (.key + 1) as $id | .value |
    ($id == $selected) as $isSlected |
    .lastAccessed      as $lastAccessed |
    .entries | reverse |
      (.[0]    | "-   \(entry($isSlected; $lastAccessed))"),
      (.[1:][] | "    -   \(entry(false; null))");

  def windows:
    to_entries[] | (.key + 1) as $id | .value |
    .selected as $selected |
      "### Window \($id)",
      "",
      "#### Open tabs",
      "",
      (.tabs | tabs($selected)),
      "",
      "#### Closed tabs",
      "",
      ([._closedTabs[].state] | tabs(0)),
      "";

  def session($session):
    "# Session `\($session)`",
    "",
    "|             |                     |",
    "| ---         | ---                 |",
    "| Start       | \(.session.startTime  | time) |",
    "| Last update | \(.session.lastUpdate | time) |",
    "",
    "## Open windows",
    "",
    (.windows | windows),
    "",
    "## Closed windows",
    "",
    (._closedWindows | windows);

  session($session)
'
