#!/bin/zsh

help=(
	at.zsh v
	at.zsh d handle
	at.zsh u at-uri
	at.zsh c at-uri -r
	at.zsh docs
	at.zsh l handle password
	at.zsh r
	at.zsh s
	at.zsh cid handle cid
	at.zsh pro
	at.zsh col ai.syui.game.user self
)
host=(
	bsky.social
	public.api.bsky.app
	plc.directory
)
lexicon=(
	# https://github.com/bluesky-social/atproto/tree/main/lexicons
	com.atproto.repo.describeRepo
	com.atproto.repo.getRecord
	com.atproto.repo.listRecords
	com.atproto.identity.resolveHandle
	com.atproto.server.createSession
	com.atproto.server.refreshSession
	com.atproto.server.getSession
	com.atproto.sync.getBlob
 app.bsky.actor.getProfile
)
github=(
	https://github.com/bluesky-social/atproto
	https://github.com/bluesky-social/social-app
	https://github.com/bluesky-social/feed-generator
	https://github.com/bluesky-social/jetstream
	https://github.com/bluesky-social/indigo
	https://github.com/did-method-plc/did-method-plc
)
tag=( at bsky bsync pds bgs plc ozone feed jetstream social-app oauth )

function at-env() {
	host=bsky.social
	at_uri=at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/syui
	docs_uri=https://docs.bsky.app/docs/api
	handle=yui.syui.ai
	did=`echo $at_uri|cut -d / -f 3`
	collection=`echo $at_uri|cut -d / -f 4`
	rkey=`echo $at_uri|cut -d / -f 5`
	d=${0:a:h}
	f=~/.config/.at-zsh.json
	if [ -f $f ];then
		token=`cat $f|jq -r .accessJwt`
		did=`cat $f|jq -r .did`
		handle=`cat $f|jq -r .handle`
		actor=$did
	fi
}

function at-unset() {
	unset t password token refresh
}

function at-version() {
	curl -sL ${host}/xrpc/_health |jq .
}

function at-uri() {
	if [ -n "$1" ];then
		at_uri=$1
	fi
	req=/xrpc/com.atproto.repo.getRecord
	url=https://${host}${req}
	did=`echo $at_uri|cut -d / -f 3`
	collection=`echo $at_uri|cut -d / -f 4`
	rkey=`echo $at_uri|cut -d / -f 5`
	curl -sL "$url?repo=$did&collection=$collection&rkey=$rkey"|jq .
}

function at-did() {
	if [ -n "$1" ];then
		handle=$1
	fi
	req=/xrpc/com.atproto.repo.describeRepo
	url=https://${host}${req}
	curl -sL "$url?repo=$handle"|jq .
}

function at-collection() {
	reverse=false
	if [ -n "$1" ];then
		at_uri=$1
	fi
	if [ "$2" = "-r" ];then
		reverse=true
	fi
	req=/xrpc/com.atproto.repo.listRecords
	url=https://${host}${req}
	did=`echo $at_uri|cut -d / -f 3`
	collection=`echo $at_uri|cut -d / -f 4`
	curl -sL "$url?repo=$did&collection=$collection&reverse=$reverse"|jq .
}

function at-docs() {
	for i in $lexicon; do
		req=`echo $i|tr '.' '-'|sed 's/[A-Z]/-&/g'|tr '[A-Z]' '[a-z]'`
		url=$docs_uri/$req
		echo $url
	done
}

function at-login() {
	if [ -z "$1" ] || [ -z "$2" ];then
		echo handle password
		exit
	fi
	handle=$1
	password=$2
	echo $password
	json="{\"identifier\":\"$handle\",\"password\":\"$password\"}"
	req=/xrpc/com.atproto.server.createSession
	url=https://${host}${req}
	if [ ! -d ~/.config ];then
		mkdir -p ~/.config
	fi
	t=`curl -sL -X POST -H "Content-Type: application/json" -d $json $url`
	if echo $t |jq .;then
		echo $t >! $f
	fi
}

function at-refresh() {
	echo $f
	token=`cat $f|jq -r .refreshJwt`
	req=/xrpc/com.atproto.server.refreshSession
	url=https://${host}${req}
	t=`curl -sL -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url`
	if echo $t |jq .;then
		echo $t >! $f
	fi
}

function at-cid() {
	did=`at-did $1|jq -r .did`
	cid=$2
	req=/xrpc/com.atproto.sync.getBlob
	url="https://${host}${req}?did=${did}&cid=${cid}"
	curl -sL $url
}

function at-session() {
	req=/xrpc/com.atproto.server.getSession
	url=https://${host}${req}
	t=`curl -sL -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url`
	if ! echo $t |jq .;then
		echo refresh
		t=`at-refresh`
	fi
}

function at-profile() {
	if [ ! -f $f ];then
		echo login
		exit
	else
		t=`at-session`
	fi
	req=/xrpc/app.bsky.actor.getProfile
	url="https://${host}${req}?actor=$did"
	curl -sL -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url|jq .
}

at-env
case $1 in
	version|v)
		at-version
		;;
	uri|u)
		at-uri $2
		;;
	did|d)
		at-did $2
		;;
	collection|c)
		at-collection $2 $3
		;;
	at-docs|docs)
		at-docs
		;;
	cid)
		at-cid $2 $3
		;;
	login|l)
		at-login $2 $3
		;;
	refresh|r)
		at-refresh
		;;
	session|s)
		at-session
		;;
	profile|pro)
		at-profile
		;;
	*)
		echo "${help[@]}"
		echo "${host[@]}"
		echo "${lexicon[@]}"
		echo "${github[@]}"
		echo "${tag[@]}"
		;;
esac
at-unset