const e = require("../registration"),
{ isMemberActive: t, getMemberForDeviceKey: l } = require("../query"),
a = require("b4a"),
{ KeetContractError: s } = require("../errors")
async function r({ header: e, key: r, label: c }, { db: o, writer: n }) {
const [b, k, d] = await Promise.all([
l(o, n.key),
o.get("@keet/members", { key: r }),
o.get("@keet/threads", { id: 0 }),
])
if (!t(b) || !k || a.equals(b.key, k.key)) throw s.ABORT()
if (await o.get("@keet/member-labels", { key: k.key, sender: b.key, label: c })) throw s.ABORT()
const u = { key: k.key, sender: b.key, clock: d.stats.chat.clock, label: c }
;(await o.insert("@keet/member-labels", u), await i(o, d, u, null, e.timestamp))
}
function c(e) {
e.add("@keet/add-member-label", r)
}
async function i(e, t, l, a, s) {
if ((l && a) || (!l && !a)) return
const r = l ? l.key : a.key,
c = (await e.get("@keet/member-label-digests", { key: r })) || {
key: r,
total: 0,
labels: [],
editedAt: 0,
flagsClock: 0,
}
;(1 === (l || a).label &&
!a &&
((t.stats.chat.flagsClock += 1), (c.flagsClock = t.stats.chat.flagsClock)),
(c.editedAt = s),
l
? (o(c, l.label), (t.stats.chat.clock += 1), (c.total += 1))
: (n(c, a.label), (t.stats.chat.clock -= 1), (c.total -= 1)),
await Promise.all([e.insert("@keet/threads", t), e.insert("@keet/member-label-digests", c)]))
}
function o(e, t) {
const l = e.labels.findIndex((e) => e.label === t)
;-1 === l ? e.labels.push({ label: t, count: 1 }) : (e.labels[l].count += 1)
}
function n(e, t) {
const l = e.labels.findIndex((e) => e.label === t)
if (-1 === l) return
const a = e.labels[l]
;((a.count -= 1), a.count > 0 || e.labels.splice(l, 1))
}
module.exports = { [e]: c }