#!/bin/sh

odir=$HOME/out/easylang/run
mkdir -p $odir

wdir=$odir/../wrk
idir=$odir/../ide
v=$(cat $wdir/wvers)
cp $idir/easyw$v.wasm $idir/easyw$v.js $odir

xcp() {
	d=$2
	test -d $d && d=$d/$1
	test $1 -nt $d -o ! -e $d && cp -p $1 $d
}

xcp icon.svg $odir
xcp icon.png $odir
xcp mfst.json $odir

date=$(date +%y%m%d-%H%M)
echo "var CACHE = 'r$date'" > $odir/sw.js
echo "var VERS = '$v'" >>$odir/sw.js
cat >>$odir/sw.js <<EOF
var urls = [
	"/run/",
	"/run/easyw" + VERS + ".wasm",
	"/run/easyw" + VERS + ".js",
	"/run/icon.png",
	"/run/icon.svg",
	"/run/mfst.json",
]

console.log("sw " + CACHE)

self.addEventListener("install", evt => {
	console.log("install")
	evt.waitUntil(
		caches.open(CACHE).then(cache => Promise.all(
			urls.map(url => {
				var f = url
				if (f == "/run/") f += "?" + CACHE
				return fetch(f).then(resp => {
					if (!resp.ok) {
						console.log(f + " missing")
						return
					}
					return cache.put(f, resp)
				})
			})
		))
	)
})

self.addEventListener("fetch", evt => {
	evt.respondWith(async function() {
		var cache = await caches.open(CACHE)
		var res = await cache.match(evt.request, {ignoreSearch: true})
		if (res) return res
		console.log("fetch " + evt.request.url)
		return fetch(evt.request)
	}())
})

self.addEventListener("activate", function(evt) {
	evt.waitUntil(
		caches.keys().then(function(keys) {
			return Promise.all(
				keys.map(function(k) {
					if (k != CACHE && k[0] == CACHE[0]) return caches.delete(k)
				})
			)
		})
	)
})

self.addEventListener("message", function (evt) {
	if (evt.data.action == "skipWaiting") self.skipWaiting()
})
EOF

#--------------------------------------------------


cat run.html > $odir/index.html
cat run.html > $wdir/run.html

cat >>$odir/index.html <<'xxx'
if ("serviceWorker" in navigator) {
	window.addEventListener("load", function() {
		navigator.serviceWorker.register("sw.js").then(function(reg) {
			console.log("sw scope: ", reg.scope)
			reg.addEventListener("updatefound", () => {
				noti.nsw = reg.installing
				noti.nsw.addEventListener("statechange", () => {
					switch (noti.nsw.state) {
					case "installed":
						if (navigator.serviceWorker.controller) {
							show(noti)
						}
						break
					}
				})
			})
		})
	})
	navigator.serviceWorker.addEventListener("controllerchange", function () {
		if (noti.inRefresh) return
		window.location.reload()
		noti.inRefresh = true
	})
	noti.onclick = function(){
		noti.nsw.postMessage({ action: "skipWaiting" })
	}
}
xxx

#cat $wdir/vers_easy.js
#cat $wdir/../apps/easy_code.js
cat $wdir/vers_easy_code.js >> $odir/index.html

xcp ../apps/easy_code.js $wdir/easy_code.js
echo "</script><script src=easy.js></script>" >> $wdir/run.html
echo "<script src=easy_code.js></script><script>" >> $wdir/run.html


cat run.js | sed -e "s/\$date/$date/g" >> $odir/index.html
cat run.js | sed -e "s/\$date/$date/g" >> $wdir/run.html

