#!/usr/bin/haserl --shell=/bin/bash

<%

VERSION=0.4
BASE="/tears"
HOST="zanthia.radionova.no"

path=$(pdecode <<<"${PATH_INFO#/}")

error() {
  echo -e "Content-Type: text/plain; charset=utf-8\n"
  echo "$1"
  exit 1
}

irc() {
  /opt/bin/birk -c radionova "$1"
}

byline() {
  echo "skrevet av $(ls -ld $1 | awk '{print $3}')"
}

info() {
  stat -c '%n: %U %G %a %Y' $1
}

link() {
  local raw=${REQUEST_URI%\?*}
  local clean="/${raw%/}"
  local rawt="$BASE/$2"
  local cleant="/${rawt%/}"
  [ $cleant = $clean ] && echo "$1" || echo "<a href='$BASE/$2'>$1</a>"
}

qlink() {
  text="$1" && url="$BASE/$2" && shift 2
  local IFS=\& && echo -ne "<a href='$url?$*'>$text</a>\n"
}

redirect() {
  echo -e "Content-Type: text/html; charset=utf-8"
  echo -e "Location: https://$HOST$1\n"
  echo "٩(͡๏̯͡๏)۶>"
}

stikkordsøk() {
  [ "$action" = index.html -o "$action" = ditt -o "$action" = gruppe ] || return
  echo "<form method=get>"
  echo "<p><b>stikkordsøk</b>"
  echo "<br><input type=text size=10 name=stikkord value='$GET_stikkord'>"
  echo "<input type=hidden name=dato value='$GET_dato'>"
  echo "</form>"
}

kalender() {
  [ "$action" = index.html -o "$action" = ditt -o "$action" = gruppe ] || return
  echo "<p><b>for mye? reis i tid…</b>"
  IFS=- read y m d <<<"$GET_dato"
  n=0
  [ -n "$GET_stikkord" ] && n=1
  if [ -z "$y" ]; then
    for directory in $(cut -d / -f $((n + 2)) | sort | uniq); do
      year=$(basename $directory)
      qlink "$year" "$action/$path" "dato=$year" "stikkord=$GET_stikkord"
    done
  elif [ -z "$m" ]; then
    echo "<b>"
    qlink "$y" "$action/$path" "stikkord=$GET_stikkord"
    echo "</b><br>"
    for directory in $(cut -d / -f $((n + 3)) | sort | uniq); do
      month=$(basename $directory)
      qlink "$month" "$action/$path" "dato=$y-$month" "stikkord=$GET_stikkord"
    done
  elif [ -z "$d" ]; then
    echo "<b>"
    qlink "$y" "$action/$path" "stikkord=$GET_stikkord"
    echo "/"
    qlink "$m" "$action/$path" "dato=$y" "stikkord=$GET_stikkord"
    echo "</b><br>"
    for directory in $(cut -d / -f $((n + 4)) | sort | uniq); do
      day=$(basename $directory)
      qlink "$day" "$action/$path" "dato=$y-$m-$day" "stikkord=$GET_stikkord"
    done
  else
    echo "<b>"
    qlink "$y" "$action/$path" "stikkord=$GET_stikkord"
    echo "/"
    qlink "$m" "$action/$path" "dato=$y" "stikkord=$GET_stikkord"
    echo "/"
    qlink "$d" "$action/$path" "dato=$y-$m" "stikkord=$GET_stikkord"
    echo "</b><br>"
  fi
}

meny() {
  echo -e "Content-Type: text/html; charset=utf-8\n"
  echo "<!doctype html>"
  echo "<title>tears</title>"
  echo "<link href=$BASE/tears.css rel=stylesheet>"
  echo "<script src=$BASE/tears.js></script>"
  echo "<div id='meny'>"
  link "<pre>$(figlet -f threepoint tears)</pre>" ""
  echo "<p><b>hei, $(whoami) &hearts;</b><br>"
  link 'skriv en artikkel' 'skriv'
  echo "<p><b>du har tilgang til…</b><br>"
  link 'dine artikler' 'ditt' && echo "<br>"
  for group in $available; do
    link "$group" "gruppe/$group"
  done
  kalender
  stikkordsøk
  echo "<p><b>kos deg! ٩(͡๏̯͡๏)۶</b>"
  echo "<p class=footer><b>tears $VERSION</b><br>"
  link 'todo' 'todo' && echo '|' && link 'teatime' 'teatime'
  echo "</div>"
}

liste() {
  n=$((${GET_n:-0} + 7))
  $finder -printf '%h\t%TT\t%f\n' | sort -r | head -$n | tail -7 | while read
  do
    d=$(cut -f 1 <<<"$REPLY")
    f=$(cut -f 3 <<<"$REPLY")
    kort $d/$f
  done
  echo "<hr><p>"
  qlink "eldre artikler…" "$action/$path" "dato=$GET_dato" "n=$n"
}

stikkord() {
  find -L stikkord -samefile "$1" | while read file; do
    local imp=${file#stikkord/}
    local ord=${imp%%/*}
    [ -z "$first" ] || echo -n " "
    echo -n "$ord"
    first=1
  done
}

stikk() {
  find -L stikkord -samefile "$1" -delete
  for ord in $2; do
    local path="stikkord/$ord/${1#artikler/}"
    mkdir -p "$(dirname $path)"
    ln -s "../../../../../$1" "$path"
  done
}

skjema() {
  [ ! -f "$1" ] && echo "<p>finner ikke $1: <pre>$(xxd <<<$1)</pre>" && exit
  [ ! -w "$1" ] && echo "<p>du har ikke skrivetilgang" && exit
  echo "<form method='post' action='$BASE/oppdater/$1'>"
  lupin -f <$1
  echo "<p><label>Stikkord:</label>"
  echo "<input type='text' name='stikkord' value='$(stikkord $1)'>"
  echo "<p><input type='submit' value='Lagre'>"
  echo "</form>"
  echo "<p><b>$(info $1)</b>"
}

vis() {
  [ ! -f "$1" ] && echo "<p>finner ikke $1: <pre>$(xxd <<<$1)</pre>" && exit
  [ ! -r "$1" ] && echo "<p>du har ikke lesetilgang" && exit
  lupin -h <$1
}

lagre() {
  path=$(date +%Y/%m/%d -d $POST_publisert)
  slug=$(sed -e 's|[ /]|-|g' -e 's|[?:]||g' <<<$POST_title)
  [ -z "$slug" ] && error "Ugyldig overskrift"
  [ -f "artikler/$path/$slug.txt" ] && error "Artikkelen finnes allerede"
  mkdir -m 777 -p "artikler/$path"
  [ -z "$POST_privat" ] && umask 0002
  lupin -l -e >"artikler/$path/$slug.txt"
  chgrp $POST_gruppe "artikler/$path/$slug.txt"
  irc "$(whoami) skriver ny artikkel: $POST_title"
  redirect "$BASE/rediger/artikler/$path/$slug.txt"
}

oppdater() {
  [ ! -f "$1" ] && error "finner ikke $1"
  [ ! -w "$1" ] && error "ikke skrivetilgang til $1"
  [ -z "$POST_title" ] && error "ingen overskrift"
  [ -z "$POST_stikkord" ] && error "ingen stikkord"
  stikk "$1" "$POST_stikkord"
  lupin -l -e >$1
  irc "$(whoami) redigerte $POST_title"
  redirect "$BASE/rediger/$path"
}

kort() {
  IFS=/. read -r type y m d hhmm slug ext <<< "$1"
  lupin -t -h <$1
  echo "<p class='x'>$(byline $1), $y/$m/$d"
  [ -r "$1" ] && echo "·" && link "vis" $(pencode / <<<"vis/$1")
  [ -w "$1" ] && echo "·" && link "rediger" $(pencode / <<<"rediger/$1")
  lupin -s -h <$1
}

forbered() {
  echo "<form method=post action='$BASE/lagre/$path'>"
  echo "<p><label>Overskrift:</label>"
  echo "<input type=text name=title size=24>"
  echo "<p><label>Dato:</label>"
  echo "<input type=date name=publisert value=$(date +%Y-%m-%d) size=10>"
  echo "<p><label>*</label>"
  echo "<select name='type'>"
  for type in lupin/*; do
    id=$(basename $type .lua)
    echo "<option value='$id'>$(sed 's|.|\U&|' <<<$id)</option>"
  done
  echo "</select>"
  echo "for"
  echo "<select name=gruppe>"
  for group in $available; do
    echo "<option>$group</option>" 
  done
  echo "</select>"
  echo "(<input type=checkbox name=privat>privat artikkel?)"
  echo "<p><label>*</label><input type=submit value='Forbered artikkel...'>"
  echo "</form>"
}

[ -f tears.rc ] && . tears.rc

umask 0022

groups=$(groups | tr " " "\n" | sort)
available=$(comm -12 - <(ls redaksjoner | sort) <<<"$groups")
action=$(basename $SCRIPT_FILENAME)
if [[ "$action" == rediger && $path == stikkord/* ]]; then
  redirect "$BASE/rediger/artikler/${path#stikkord/*/}"
fi
mappe="artikler"
[ -n "$GET_stikkord" ] && mappe="stikkord/$GET_stikkord"
kilde="$mappe/$(sed 's|-|/|g' <<<$GET_dato)"
finder="find -L $kilde -type f"
[ "$action" = gruppe ] && finder="$finder -group $path"
[ "$action" = ditt ] && finder="$finder -user $REMOTE_USER"
[ "$REQUEST_METHOD" = GET ] && $finder | meny
case $action in
  index.html|ditt|gruppe) liste;;
  skriv) forbered;;
  rediger) skjema $path;;
  vis) vis $path;;
  lagre) lagre;;
  oppdater) oppdater $path;;
  teatime) irc "$(whoami) <3 teatime"; echo "<p><img src='http://kyber.io/orz/src/1352063360909860.jpg'><br>";;
  spökvåningen) echo "<p><img src='http://kyber.io/orz/src/1360086359591352.jpg'>";;
  todo) echo "<pre>$(cat TODO)</pre>";;
esac
%>