#!/usr/bin/env rc

# Journal interval: daily, weekly, monthly, yearly
interval=daily

# Title format: full, date, day, year
# Examples:
#   full: "wednesday 12 november 2025 22:11"
#   date: "wednesday 12 november 2025"
#   day:  "wednesday"
#   year: "2025"
titleformat=full

# Signature (optional, added to filename as ==signature)
signature=''

# Parse time offset argument (e.g., +2d, -3h, +15m)
offset=0
if(! ~ $#* 0) {
	arg=$1
	# Extract components using awk
	sign=`{echo $arg | awk '{print substr($0,1,1)}'}
	num=`{echo $arg | awk '{s=substr($0,2); sub(/[a-z]$/,"",s); print s}'}
	unit=`{echo $arg | awk '{print substr($0,length($0))}'}

	# Calculate offset in seconds
	switch($unit) {
	case d
		offset=`{hoc -e 'int('$num' * 86400)'}
	case h
		offset=`{hoc -e 'int('$num' * 3600)'}
	case m
		offset=`{hoc -e 'int('$num' * 60)'}
	}

	# Apply sign
	if(~ $sign '-') {
		offset=`{hoc -e 'int(-1 * '$offset')'}
	}
}

# Calculate reference timestamp based on interval
epoch=`{date -n}

# Adjust epoch to interval start if no offset provided
if(~ $#* 0) {
	switch($interval) {
	case weekly
		# Get start of week (Monday)
		# date outputs: Sun Nov 24 07:30:00 EST 2025
		dow=`{date $epoch | awk '{print $1}'}
		# Calculate days since Monday (Mon=0, Tue=1, ..., Sun=6)
		daysback=0
		switch($dow) {
		case Mon; daysback=0
		case Tue; daysback=1
		case Wed; daysback=2
		case Thu; daysback=3
		case Fri; daysback=4
		case Sat; daysback=5
		case Sun; daysback=6
		}
		epoch=`{hoc -e 'int('$epoch' - ('$daysback' * 86400))'}
	case monthly
		# Get start of month (day 1)
		# Extract year, month from current date
		yearmonth=`{date $epoch | awk '{print $6 " " $2}'}
		# Use date with format: Nov 1 2025
		epoch=`{date -n `{echo $yearmonth | awk '{print $2 " 1 " $1}'}}
	case yearly
		# Get start of year (Jan 1)
		year=`{date $epoch | awk '{print $6}'}
		epoch=`{date -n 'Jan 1 '^$year}
	}
}

targetepoch=`{hoc -e 'int('$epoch' + '$offset')'}

# Get formatted date (e.g., "Wednesday 12 November 2025 22:11")
datefull=`{date $targetepoch | awk '
BEGIN {
    m["Jan"]="January"; m["Feb"]="February"; m["Mar"]="March"
    m["Apr"]="April"; m["May"]="May"; m["Jun"]="June"
    m["Jul"]="July"; m["Aug"]="August"; m["Sep"]="September"
    m["Oct"]="October"; m["Nov"]="November"; m["Dec"]="December"
    d["Sun"]="Sunday"; d["Mon"]="Monday"; d["Tue"]="Tuesday"
    d["Wed"]="Wednesday"; d["Thu"]="Thursday"; d["Fri"]="Friday"
    d["Sat"]="Saturday"
}
{
    split($4, t, ":")
    print d[$1], $3, m[$2], $6, t[1]":"t[2]
}'}

# Format title based on titleformat setting
switch($titleformat) {
case full
	title=`{echo $datefull | awk '{print tolower($0)}'}
case date
	title=`{echo $datefull | awk '{print tolower($1 " " $2 " " $3 " " $4)}'}
case day
	title=`{echo $datefull | awk '{print tolower($1)}'}
case year
	title=`{echo $datefull | awk '{print $4}'}
case *
	# Default to full if invalid format specified
	title=`{echo $datefull | awk '{print tolower($0)}'}
}

# Always filter by date only (ignore time) to find existing entries for the interval
filtertitle=`{echo $datefull | awk '{print tolower($1 " " $2 " " $3 " " $4)}'}

# Apply filter
echo 'filter title:'''$"filtertitle'''' | 9p write denote/ctl

# Check if there are any results
results=`{9p read denote/index}

# If no results, create new journal entry
if(~ $#results 0) {
    if(! ~ $signature '') {
        echo '''journal/:'$"title'=='^$signature''' journal' | 9p write denote/new
    }
    if not {
        echo '''journal/:'$"title''' journal' | 9p write denote/new
    }
}
if not Denote 'denote:'$results(1)

# Clear filter
echo 'filter' | 9p write denote/ctl
