#!/bin/bash
#
# Et raskt bash-script for å hente ut nyeste temperaturobservasjon
# for et gitt stedsnavn fra yr.no.
# Skrevet av Einar Jørgen Haraldseid for #kopweb @ EFNet
#
# Værvarsel fra yr.no, levert av NRK og Meteorologisk institutt (http://www.yr.no)

# LISENS: http://sam.zoy.org/wtfpl/COPYING

# Fallback-sted (default)
FALLBACK="Gjøvik"

# Norsk format på tid
LC_TIME="nb_NO"
LANG="nb_NO"

# Cache-tid i sekunder (minimum 3600 = 60 minutter, per Yr.no sine bruksvilkår"
CACHETID="3600"

APIBASE="https://www.yr.no"

# Stedsnavn er alle paramterne vi får med, eller fallback
if [ $# -lt 1 ]; then
	STEDSNAVN="${FALLBACK}"
else
	STEDSNAVN="${*//[^a-zA-Z0-9\-ÆØÅæøå]/}"
fi

# Behandler Vårstien spesielt
if [ "$STEDSNAVN" == "Vårstien" ]; then
  TEMPERATURE=$(jq '.temperature_C' /var/tmp/heimdalsgate.json)
  LASTMEASURE=$(jq '.time' /var/tmp/heimdalsgate.json | tr -d \")
  LASTTIMESTAMP=$(LANG="nb_NO" date -d "TZ=\"UTC\" $LASTMEASURE" +%-d.\ %B\ kl.\ %H.%M)
  echo "Temperatur for Vårstien er ${TEMPERATURE}°C (Observasjon fra Vårstien ${LASTTIMESTAMP})"
  exit 0
fi

SEARCHFILE="/tmp/YrSearch-${STEDSNAVN}.json"

# Sjekk om vi har hentet filer allerede de siste X minuttene, hent ved behov
# Takk til Sakarias for elegant løsning
if [ -f "${SEARCHFILE}" ]; then
	if [ "$(stat --format=%Y "${SEARCHFILE}")" -le $(( $(date +%s) - CACHETID )) ]; then
		curl -s -G -X GET --header "Accept: application/json" --data-urlencode "q=${STEDSNAVN}" --data-urlencode "language=nb" "${APIBASE}/api/v0/locations/Search" > "${SEARCHFILE}"
	fi
else
	curl -s -G -X GET --header "Accept: application/json" --data-urlencode "q=${STEDSNAVN}" --data-urlencode "language=nb" "${APIBASE}/api/v0/locations/Search" > "${SEARCHFILE}"
fi

STEDSNAVN_MATCHED=$(jq -r '._embedded.location | .[0].name' "${SEARCHFILE}")
LOCATION_ID=$(jq -r '._embedded.location | .[0].id' "${SEARCHFILE}")
OBSFILE="/tmp/YrObservation-${LOCATION_ID}.json"
if OBSPATH=$(jq -r '._embedded.location | .[0]._links.observations[0].href' "${SEARCHFILE}" 2> /dev/null); then
	if [ -f "${OBSFILE}" ]; then
		if [ "$(stat --format=%Y "${OBSFILE}")" -le $(( $(date +%s) - CACHETID )) ]; then
			curl -s "${APIBASE}/${OBSPATH}" > "${OBSFILE}"
		fi
	else
		curl -s "${APIBASE}/${OBSPATH}" > "${OBSFILE}"
	fi
else
	echo "Fant ingen værobservasjoner for ${STEDSNAVN_MATCHED}, jeg funker bare i Norge"
	exit 0
fi

TEMP=$(jq -r ._embedded.stations[0].observations.temperature.intervals[-1].value "${OBSFILE}")
TIME_ZULU=$(jq -r ._embedded.stations[0].observations.temperature.intervals[-1].time "${OBSFILE}")
STASJON=$(jq -r ._embedded.stations[0].name "${OBSFILE}")

# Og litt ekstra datatygging
TIME=$(date +%H.%M -d "${TIME_ZULU}")

# Spytt ut en fin linje
echo "Temperatur for ${STEDSNAVN_MATCHED} er ca. ${TEMP}°C (Observasjon fra ${STASJON} målestasjon kl. ${TIME}) - Værvarsel fra yr.no, levert av NRK og Meteorologisk institutt"
