import { createSlice as o, createAction as i, createSelector as e } from "@reduxjs/toolkit"
import { EMPTY_ROOM_ID as t, ROOM_STATE_KEY as n } from "../room.constant"
import { PAIRING_STATUS as a } from "./room-joint.model"
const r = {
all: [],
activeSeedId: "",
lastPairingRoom: null,
pairError: "",
waitingDmMemberId: "",
},
m = { roomId: "", inProgress: !1, shouldConfirm: !1 }
export const ROOM_JOINT_INITIAL_STATE = {
invitationLink: "",
invitationPreviewByLink: {},
pairing: r,
leaving: m,
}
export const ROOM_JOINT_STATE_KEY = "joint"
export const roomJointSlice = o({
name: "joint",
initialState: ROOM_JOINT_INITIAL_STATE,
reducers: {
setRoomInvitation: (o, { payload: i }) => {
const { invitationLink: e, invitationPreview: t } = i
;((o.invitationLink = e), t && (o.invitationPreviewByLink[e] = { url: e, ...t }))
},
clearRoomInvitation: (o) => {
o.invitationLink = ROOM_JOINT_INITIAL_STATE.invitationLink
},
setRoomPairingActive: (o, { payload: i }) => {
;((o.pairing.activeSeedId = i ? i.seedId : o.pairing.all?.[0]?.seedId || t),
o.pairing.activeSeedId && (o.pairing.waitingDmMemberId = t))
},
setWaitingDmMemberId: (o, { payload: i }) => {
;((o.pairing.waitingDmMemberId = i.waitingDmMemberId),
i.waitingDmMemberId && (o.pairing.activeSeedId = t))
},
setPairingRoom: (o, { payload: i }) => {
const { seedId: e } = i || {}
if (!e) return
o.pairing.lastPairingRoom = i
const t = o.pairing.all.findIndex((o) => o.seedId === e)
;-1 !== t
? i.status === a.ASKED && i.messageId
? (o.pairing.all[t].messageId = i.messageId)
: (o.pairing.all[t] = { ...o.pairing.all[t], ...i })
: -1 === t && o.pairing.all.push(i)
},
setRoomPairError: (o, { payload: i }) => {
o.pairing.pairError = i
},
clearPairingRoom: (o, { payload: i }) => {
const { seedId: e, setNextActive: n, status: a } = i
if (!e) return
const r = o.pairing.all.findIndex((o) => o.seedId === e)
if (-1 !== r) {
const [i] = o.pairing.all.splice(r, 1)
o.pairing.lastPairingRoom = { ...i, status: a }
}
o.pairing.activeSeedId === e && n
? (o.pairing.activeSeedId = o.pairing.all?.[0]?.seedId || t)
: o.pairing.activeSeedId === e && (o.pairing.activeSeedId = t)
},
leaveRoomAsk: (o, { payload: i }) => {
i && !o.leaving.roomId && (o.leaving.roomId = i)
},
leaveRoomSubmit: (o) => {
o.leaving.inProgress = !0
},
leaveRoomConfirmationRequired: (o) => {
;((o.leaving.inProgress = !1), (o.leaving.shouldConfirm = !0))
},
leaveRoomConfirmForce: (o) => {
o.leaving.inProgress = !0
},
leaveRoomCleanup: (o) => {
o.leaving = m
},
},
})
export const getRoomJointState = (o) => o[n].joint
export const getRoomPairingState = (o) => getRoomJointState(o).pairing
export const getRoomPairingIdActive = (o) => getRoomPairingState(o).activeSeedId
export const getRoomAllPairing = (o) => getRoomPairingState(o).all || []
export const getWaitingDmMemberId = (o) => getRoomPairingState(o).waitingDmMemberId
export const getRoomPairingItemBySeedId = (o) => (i) =>
getRoomAllPairing(i).find((i) => i?.seedId === o)
export const getRoomLastPairing = (o) => getRoomPairingState(o).lastPairingRoom
export const getRoomPairingCount = (o) => getRoomAllPairing(o).length
export const getRoomLeavingId = (o) => getRoomJointState(o).leaving.roomId
export const getRoomLeavingInProgress = (o) => getRoomJointState(o).leaving.inProgress
export const getRoomLeavingShouldConfirm = (o) => getRoomJointState(o).leaving.shouldConfirm
export const getRoomInvitation = (o) => getRoomJointState(o).invitationLink
export const getRoomInvitePreviewsByInvitationLink = (o) =>
getRoomJointState(o).invitationPreviewByLink
export const getRoomPairError = (o) => getRoomPairingState(o).pairError
export const getRoomPairingMessageId = (o) =>
e([getRoomAllPairing], (i) => i.find((i) => i.roomId === o)?.messageId)
export const {
setPairingRoom: setPairingRoom,
clearPairingRoom: clearPairingRoom,
setRoomInvitation: setRoomInvitation,
clearRoomInvitation: clearRoomInvitation,
setRoomPairingActive: setRoomPairingActive,
leaveRoomAsk: leaveRoomAsk,
leaveRoomSubmit: leaveRoomSubmit,
leaveRoomConfirmationRequired: leaveRoomConfirmationRequired,
leaveRoomConfirmForce: leaveRoomConfirmForce,
leaveRoomCleanup: leaveRoomCleanup,
setRoomPairError: setRoomPairError,
setWaitingDmMemberId: setWaitingDmMemberId,
} = roomJointSlice.actions
export const joinRoomSubmit = i("room/join-submit")
export const leaveRoomRejectForce = i("room/leave-reject-force")
export const leaveRoomSuccessEvent = i("room/leave-room-success-event")
export const roomPairCancel = i("room/pair-cancel")
export const createRoomInvitation = i("room/create-invitation-submit")