import { select as o, put as e, take as i, getContext as t } from "redux-saga/effects"
import { ERRORS as r } from "@holepunchto/keet-core/legacy-constants"
import { apiSubscribeSaga as n } from "../../lib"
import { getCoreBackend as a } from "../../../backend"
import { apiCall as s } from "../../../api/core"
import { PLATFORM_CONTEXT_KEY as d } from "../../constants"
import {
taskErrorSaga as m,
pairInvalidInviteError as c,
GENERIC_PAIRING_ERROR as l,
} from "../../error"
import {
parseInvitation as p,
removeInvitationQueryParams as I,
createInvitationLink as y,
} from "../../identity"
import { NOTIFICATION_CODE as f, userCustomNotification as g } from "../../notification"
import { getRoomListDiscoveryIds as u } from "../list/room-list.reducer"
import { createInvitationMessageId as P, getInvitationMessageId as v } from "./invitation"
import { switchRoomSubmit as E } from "../room.action"
import { getRoomIsFirstRoom as A } from "../room.selector"
import {
clearPairingRoom as b,
getRoomPairingIdActive as L,
setRoomInvitation as N,
setPairingRoom as R,
setRoomPairError as T,
setRoomPairingActive as h,
getRoomPairingMessageId as k,
getRoomAllPairing as S,
} from "./room-joint.reducer"
import {
PAIRING_STATUS as C,
createAskedPairing as x,
getRoomPairingItems as O,
parsePendingRoomResponse as _,
} from "./room-joint.model"
import { ROOM_INVITE_CONFIG_DEFAULT as w } from "../room.constant"
export function* createInvitationSaga(
{ appProtocol: o },
{ payload: { roomId: i, invitationPreview: t, messageId: n, isPublic: d = !1, opts: c = w } },
) {
try {
const r = a(),
m = yield s(r.createInvitation, i, c)
let l
;((l = y({ invitation: m, isPublic: d, appProtocol: o })),
n && (l = P({ invitationLink: l, messageId: n })),
yield e(N({ invitationLink: l, invitationPreview: t })))
} catch (o) {
o.code === r.AUTOBASE_IS_NOT_WRITEABLE
? yield e(g({ code: f.INVITATION_AUTOBASE_WRITABLE_ERROR }))
: yield m("createInvitationSaga", o)
}
}
export function* roomInvitationHandler({ link: o, skipParse: i = !1, setActive: n = !1 }) {
const y = a()
let f = !1
try {
const {
config: { recognizedAppProtocolList: r },
} = yield t(d)
let a = i ? o : p(o, r)
if (!a) return f
f = !0
const m = v(o)
i && m && (a = I(a))
const { seedId: c, key: l } = yield s(y.startPairingRoom, a)
if (l) yield e(E({ roomId: l, messageId: m }))
else {
if (!c) throw new Error("room pairing failed: no seedId")
;(yield e(R(x({ seedId: c, messageId: m }))), n && (yield e(h({ seedId: c }))))
}
} catch (o) {
;(yield m("roomInvitationHandler", o, { logWarn: !0 }),
o.code === r.INVALID_INVITATION_TYPE
? yield e(c())
: yield e(T(o.code && o.message ? o.message : l)))
}
return f
}
export function* roomPairingCancelSaga({ payload: o }) {
const i = a()
try {
;(yield s(i.stopPairingRoom, o), yield e(R({ seedId: o, status: C.CANCELLED })))
} catch (o) {
yield m("roomPairingCancelSaga", o)
}
}
export function* roomsPairingDataSaga({ pendingRoomChannel: e }) {
yield n(
[a().subscribePendingRooms],
function* (i) {
const t = yield o(u),
r = yield o(S),
n = O(r, i, t),
a = Object.values(n).flat()
for (const o of a) e.put(o)
},
{ onError: (o) => m("subscribePendingRooms", o) },
)
}
export function* roomPairingSaga({ pendingRoomChannel: t }) {
try {
for (;;) {
const r = yield i(t),
n = _(r)
switch (r.status) {
case C.NEW:
yield e(R(n))
break
case C.CANCELLED:
yield e(b({ seedId: n.seedId, status: n.status, setNextActive: !0 }))
break
case C.COMPLETED: {
const i = yield o(L),
t = i && n.roomId && i === n.seedId,
r = yield o(k(n.roomId)),
a = yield o(A, n.roomId)
;((t || (a && !i) || r) && (yield e(E({ roomId: n.roomId, messageId: r }))),
yield e(b({ seedId: n.seedId, status: n.status, setNextActive: !t })))
break
}
}
}
} catch (o) {
yield m("roomPairingSaga", o)
} finally {
t?.close()
}
}