import { select as e, call as r, put as i, takeLatest as o, fork as t } from "redux-saga/effects"
import { getCoreBackend as m } from "../../backend"
import { apiCall as s } from "../../api/core"
import { taskErrorSaga as d } from "../error"
import { apiSubscribeSaga as c, apiSubscribeLatest as b } from "../lib/external-src"
import {
getMemberListSearch as n,
setModerators as l,
setPeers as a,
initializeMemberListSubscriptionCmd as y,
searchMembers as u,
onScrollEnd as f,
getMemberListPeersLimit as p,
setSearchPeers as I,
setItemsInView as M,
getMemberListData as S,
setMemberById as h,
memberListInViewIdsChangeEvt as g,
setAdmins as x,
resetMemberList as E,
getMemberListPeers as k,
getMemberListLastPeer as L,
setAdminsModeratorsIsLoading as P,
getMemberListSubscribeToMemberTypes as v,
} from "./member-list.reducer"
import { forkChildren as A } from "../lib"
import { canIndex as j, canModerate as O, parseMemberResponse as T } from "../member"
import { cursorKey as D } from "./member-list.constants"
function* q() {
const r = {}
yield o(M, function* ({ payload: o }) {
const t = yield e(S),
{ top: m, bottom: s } = o
if (!m && !s && !t) return
const d = t?.slice(m, s)
let c = !1
;(Object.keys(r).forEach((e) => {
d.includes(e) || (delete r[e], (c = !0))
}),
d
.filter((e) => !r[e])
.forEach((e) => {
;((r[e] = !0), (c = !0))
}),
c && (yield i(g(Object.keys(r)))))
})
}
function* w(e) {
const r = e?.reduce((e, r) => {
const i = r?.memberId
return { ...e, [i]: T(r) }
}, {})
yield i(h({ data: r }))
}
function* z(e) {
const o = [],
t = []
for (const r of e) j(r.capabilities) ? o.push(r) : O(r.capabilities) && t.push(r)
;(yield i(x(o?.map((e) => e?.memberId))),
yield i(l(t?.map((e) => e?.memberId))),
yield r(w, [...o, ...t]))
}
export function* memberSubscribeModerators({ roomId: r }, o) {
if (E.match(o)) return
const { subscribeToAdminsAndModerators: t } = yield e(v)
if (!t) return
const b = m()
yield i(P(!0))
const n = yield s(b.getModerators, r)
;(yield z(n),
yield c([b.subscribeModerators, r], z, { onError: (e) => d("memberSubscribeModerators", e) }))
}
export function* memberSubscribePeers({ roomId: r }, o) {
if (E.match(o)) return
const { subscribeToPeers: t } = yield e(v)
if (!t) return
const c = yield e(n),
l = { limit: yield e(p) || 25 },
y = m()
if (c) {
const e = yield s(y.getSearchMembers, r, c, l)
return (yield i(I(e?.map((e) => e?.memberId))), void (yield w(e)))
}
const u = yield e(L),
f = u ? yield e(k) : [],
M = u || null
;((l[D] = M),
yield b(
[y.subscribeActiveMembers, r, l],
function* (e) {
const r = e.filter((e) => !O(e.capabilities) && !e.inactive),
o = r.map((e) => e?.memberId) || [],
t = [...f, ...o]
;(yield i(a(t)), yield w(r))
},
{ onError: (e) => d("memberSubscribePeers", e) },
))
}
export function* memberListSaga({ roomId: e }) {
try {
;(yield o([y, E], memberSubscribeModerators, { roomId: e }),
yield o([y, u, f, E], memberSubscribePeers, { roomId: e }),
yield t(q),
yield A(
g,
({ payload: e }) => e,
function* ({ taskId: r }) {
yield c([m().subscribeMember, e, r], (e) => i(h({ memberId: r, memberData: T(e) })), {
onError: (e) => d("memberList: subscribeMember", e),
})
},
(e) => d("memberListItem", e),
))
} catch (e) {
yield d("memberListSaga", e)
} finally {
yield i(E())
}
}