-- vim: ft=terra
local pstr = lib.str.t

local obj = lib.tpl.mk [[{
	"\@context": "https://@+domain/s/litepub.jsonld",
	"type": "Note",
	"id": "https://@+domain/post/@^pid",
	"content": @$html,
	"source": @$raw,
	"attributedTo": "https://@+domain/user/@^uid",
	"actor": "https://@+domain/user/@^uid",
	"published": "@pubtime",
	"sensitive": false,
	"directMessage": false,
	"to": ["https://www.w3.org/ns/activitystreams#Public"],
	"summary": @$subj
	@extra
}]]

local wrap = lib.tpl.mk [[{
	"\@context": "https://@+domain/s/litepub.jsonld",
	"type": "@kind",
	"actor": "https://@+domain/user/@^uid",
	"published": "@pubtime",
	"id": "https://@+domain/api/lp/act/@^aid",
	"to": ["https://www.w3.org/ns/activitystreams#Public"],
	"object": @obj
}]]

local terra 
lp_tweet(co: &lib.srv.convo, p: &lib.store.post, act_wrap: bool): pstr
	var opdate = lib.munge.datetime(&co.srv.pool, p.posted)

	var extra: lib.str.acc extra:pool(&co.srv.pool,256)
	
	if p.parent ~= 0 then
		extra:lpush ',"inReplyTo":"'
		var par = co.srv:post_fetch(p.parent)
		if not par then
			lib.warn('database integrity violation: broken parent reference')
		else defer par:free()
			if par().localpost then -- gen uri for parent
				extra:lpush'https://':qpush(co.srv.cfg.domain):lpush'/post/':shpush(p.parent)
			else extra:push(par().uri,0) end
		end
		extra:lpush'"'
	end

	extra:lpush ',"conversation":"'
	if p.convoheaduri ~= nil then
		extra:qpush(p.convoheaduri)
	else
		var cid: uint64 = 0
		if p.parent ~= 0 then
			var top = co.srv:thread_top_find(p.parent)
			var tp = co.srv:post_fetch(top)
			if not tp then
				lib.warn('database integrity violation: missing thread parent')
				cid = p.id
			else
				if tp().convoheaduri ~= nil then
					extra:push(tp().convoheaduri,0)
				elseif tp().localpost == false then
					extra:push(tp().uri,0)
				else cid = top end
			end
		else
			cid = p.id
		end
		if cid ~= 0 then
			extra:lpush'https://':qpush(co.srv.cfg.domain)
			     :lpush'/post/':shpush(cid):lpush'/tree'
		end
	end
	extra:lpush'"'

	var tweet = (obj {
		domain = co.srv.cfg.domain, uid = p.author, pid = p.id;
		html = lib.smackdown.html(&co.srv.pool, p.body, false);
		raw = p.body, pubtime = opdate, extra = extra:finalize();
		subj = lib.trn(p.subject ~= nil, pstr(p.subject), pstr'');
	}):poolstr(&co.srv.pool)

	if act_wrap then
		return (wrap {
			domain = co.srv.cfg.domain, obj = tweet;
			kind = lib.trn(p.rtdby == 0, 'Create', 'Announce');
			uid = lib.trn(p.rtdby == 0, p.author, p.rtdby);
			aid = lib.trn(p.rtdby == 0, p.id, p.rtact);
			pubtime = lib.trn(p.rtdby == 0, opdate,
				lib.munge.datetime(&co.srv.pool,p.rtdat));
		}):poolstr(&co.srv.pool)
	else
		return tweet
	end
end

return lp_tweet
