#!/usr/bin/env bash
set -euo pipefail

tmp=$(mktemp)
sorted=$(mktemp)
items_html=$(mktemp)
items_rss=$(mktemp)
index_tmp=$(mktemp)
rss_tmp=$(mktemp)

# deletes temp files on exit
trap 'rm -f "$tmp" "$sorted" "$items_html" "$items_rss"' EXIT

# escapes problematic characters for sed
escape() { sed 's/[&|\\]/\\&/g'; }

# checks
[[ -f "feeds.csv"         ]] || die "missing feeds.csv"
[[ -f "template.html"     ]] || die "missing template.html"
[[ -f "template.xml"      ]] || die "missing template.xml"
[[ -f "item.html"         ]] || die "missing item.html"
[[ -f "item.xml"          ]] || die "missing item.xml"

# fetch + extract
while IFS="|" read -r url author class; do
    [[ -z "$url" || "$url" == \#* ]] && continue
    echo "Fetching: $url"
    feed=$(mktemp)
    if curl -fsS --connect-timeout 5 --max-time 15 "$url" -o "$feed"; then
        (
            xmlstarlet sel -T -t \
                -m '//item | //entry' \
                -v 'normalize-space(pubDate | updated | published)' -o '|' \
                -v 'normalize-space(title)' -o '|' \
                -v 'normalize-space(link/@href | link | enclosure/@url)' -n \
                "$feed" 2>/dev/null || true
        ) |
        awk -F'|' -v a="$author" -v c="$class" '
            NF>=3 && $1 && $2 && $3 {
                print $1 "|" $2 "|" $3 "|" a "|" c
            }
        ' >> "$tmp" || true
    fi
    rm -f "$feed"
done < feeds.csv

# sort
awk -F'|' '
{
    cmd="date -d \"" $1 "\" +%s 2>/dev/null"
    cmd | getline t
    close(cmd)
    if (!t) t=0
    print t "|" $0
}
' "$tmp" | sort -nr > "$sorted"

generated="$(date -Ru)"

# pure render function
render() {
    local date="$1"
    local pretty_date="$2"
    local title="$3"
    local link="$4"
    local author="$5"
    local class="$6"
    sed \
        -e "s|{{class}}|$class|g" \
        -e "s|{{pretty_date}}|$pretty_date|g" \
        -e "s|{{title}}|$title|g" \
        -e "s|{{link}}|$link|g" \
        -e "s|{{author}}|$author|g" \
        -e "s|{{date}}|$date|g"
}

# render items
while IFS="|" read -r _ date title link author class; do
    pretty_date=$(date -d "$date" "+%-d %b %Y" 2>/dev/null || echo "$date")
    date=$(printf '%s' "$date" | escape)
    pretty_date=$(printf '%s' "$pretty_date" | escape)
    title=$(printf '%s' "$title" | escape)
    link=$(printf '%s' "$link" | escape)
    author=$(printf '%s' "$author" | escape)
    class=$(printf '%s' "$class" | escape)
    render "$date" "$pretty_date" "$title" "$link" "$author" "$class" < item.html >> "$items_html"
    render "$date" "$pretty_date" "$title" "$link" "$author" "$class" < item.xml >> "$items_rss"
done < "$sorted"

# build HTML
sed "s|{{generated}}|$generated|g" template.html > "$index_tmp"
awk '
    NR==FNR { items = items (items ? ORS : "") $0; next }
    $0 ~ /{{items}}/ { print items; next }
    { print }
' "$items_html" "$index_tmp" > index.html

# build RSS
sed "s|{{generated}}|$generated|g" template.xml > "$rss_tmp"
awk '
    NR==FNR { items = items (items ? ORS : "") $0; next }
    $0 ~ /{{items}}/ { print items; next }
    { print }
' "$items_rss" "$rss_tmp" > rss.xml

rm $index_tmp $rss_tmp
chmod 644 index.html rss.xml
echo "done"
