if [ "$1" = "-r" ]; then func=register; shift; else func=login; fi
if [ "$1" = "-a" ]; then privilege=admin; shift; fi
instance=$1
user=$2
pass=$3 # lol, lmao

creds=~/tinker/fedi/oauth.shit
scopes='read write follow push'

if [ "$privilege" = admin ]; then
	creds=~/tinker/fedi/oauth.admin.shit
	scopes='read write follow push admin'
fi

accs=$(cat $creds)
i=0
tok=-1
while read insts[$i] cids[$i] secrets[$i]; do
	if [ "${insts[$i]}" = "$instance" ]; then tok=$i; fi
	i=$((i+1))
done <<< "${accs[*]}"


if [ $tok -eq -1 ]; then
	read cid secret <<< $(curl https://$instance/api/v1/apps --json '{"client_name":"fuck oauth","website":"https://rakka.au","scopes":"'"$scopes"'","redirect_uris":"urn:ietf:wg:oauth:2.0:oob"}' | jq -r '.client_id+" "+.client_secret')
	echo $instance $cid $secret >> $creds
else
	cid=${cids[$tok]}; secret=${secrets[$tok]}
fi

echo $tok $instance $cid $secret

function register
{
	toke="$(curl https://$instance/oauth/token -F client_id=$cid -F client_secret=$secret -F redirect_uri="urn:ietf:wg:oauth:2.0:oob" -F grant_type=client_credentials -F scope="$scopes" | jq -r '.access_token')"
	echo "email nick (lang optional)"
	read email nick lang
	[ -z "$lang" ] && lang=en
	echo "bio"
	bio="$(cat)"
	res="$(curl -X POST https://$instance/api/v1/accounts -H "Authorization:Bearer $toke" -F agreement=true -F username="$user" -F password="$pass" -F confirm="$pass" -F email="$email" -F fullname="$nick" -F bio="$bio" -F language="$lang")"
	if [ -n "`jq -r .error <<< "$res" | jq .captcha`" ]; then
		captcha=`curl -s https://$instance/api/v1/pleroma/captcha`
		read answer_data ctoke <<< "`echo $captcha | jq -r '.answer_data+" "+.token'`"
		jq -r .url <<< "$captcha" > captcha
		echo "captcha result"
		read csol
		curl -X POST https://$instance/api/v1/accounts -H "Authorization:Bearer $toke" -F agreement=true -F username="$user" -F password="$pass" -F confirm="$pass" -F email="$email" -F fullname="$nick" -F bio="$bio" -F language="$lang" -F captcha_answer_data="$answer_data" -F captcha_token="$ctoke" -F captcha_solution="$csol"
	else
		echo $res
	fi
}

function login
{
	csrf=$(curl -s "https://$instance/oauth/authorize?client_id=$cid&scope=${scopes// /+/}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code" | grep -Eo '<.*_csrf_token.*>' | grep -Eo 'value=".*"' | grep -Eo '".*"' | grep -Eo '[^"]+')
	echo $csrf;
	for scope in $scopes; do
		long_scopes=$long_scopes' -F authorization[scope][]= -F authorization[scope][]='$scope
	done
	echo $long_scopes;
	toke1=$(curl -s "https://$instance/oauth/authorize" -F _csrf_token=$csrf "$long_scopes" -F 'authorization[name]'=$user -F 'authorization[password]'=$pass -F 'authorization[client_id]'=$cid -F 'authorization[response_type]'=code -F 'authorization[redirect_uri]'='urn:ietf:wg:oauth:2.0:oob' -F 'authorization[state]'= | grep -Eo 'Token code is <br>.*<' | grep -Eo '>.*<' | grep -Eo '[^><]+')
	echo $toke1;
	curl -s https://$instance/oauth/token -F client_id=$cid -F client_secret=$secret -F redirect_uri="urn:ietf:wg:oauth:2.0:oob" -F grant_type=authorization_code -F code=$toke1 -F scope="$scopes" | jq -r '.refresh_token+" "+.access_token'
}

$func
