const{encodeChatMessage:e,encodeReactionsDigest:t,encodeMyReactions:s}=require("./encode"),{getMemberForDeviceKey:n}=require("../../core/contract/query"),a=require("b4a");async function i({roomKey:e,local:n,snapshot:a,room:i,oplog:r,msgId:o}){const[l,c]=await Promise.all([o?{id:o}:a.get("@keet/chat-by-message-id",{oplog:r}),i||n.get("@local/rooms",{roomKey:e})]);if(!l||!c)return null;const{selfMember:u}=c,[d,m]=await Promise.all([a.get("@keet/reaction-digests",{id:l.id}),u?a.find("@keet/reactions",{gte:{id:l.id,sender:u.key},lte:{id:l.id,sender:u.key}}).toArray():[]]);return{digest:t(d),mine:s(m)}}async function r({snapshot:e,msgId:t,localRoom:s}){if(!t||!s)return null;const{selfMember:n}=s,[a,i]=await Promise.all([e.get("@keet/chat-label-digests",{id:t}),n?e.find("@keet/chat-labels",{gte:{id:t,sender:n.key},lte:{id:t,sender:n.key}}).toArray():[]]);return a&&{digest:a,mine:i}}function o({dm:e,readLengths:t,selfMember:s},n){return!!(e?.length&&n&&t?.length&&s)&&!!t.find(e=>!a.equals(e.memberKey,s.key)&&n.index<e.length)}async function l(t,s,a,l,c,d){const m=n(s,d.oplog.key),{filePromises:f,linkFilePromises:y}=function(e,t,s,n,a){const i=[],r=[];if(a.message?.files?.length>0)for(const r of a.message.files)i.push(u(e,n,t,s,r));const o=a.message?.display?.httpLink||[];for(const e of o)c(e);const l=a.message?.display?.pearLink||[];for(const e of l)c(e);return{filePromises:i,linkFilePromises:r};function c(a){if((a?.preview?.files||[]).length){const i=a.preview.files.map(async i=>{a.preview.file=await u(e,n,t,s,i)});r.push(...i)}}}(t,s,a,c,d),[g,b,h,k]=await Promise.all([m,Promise.all(f),i({snapshot:s,room:l,msgId:d.id}),r({snapshot:s,localRoom:l,msgId:d.id}),Promise.all(y)]);return d.reactions=h,b.length&&(d.message.files=b),d.read=o(l,d.id),e({record:d,labels:k,member:g,localRoom:l})}async function c(e,t,s){if(e.bee){const s=await t.get("@keet/blobs",e.bee);return s?s.data:null}return e.blob&&s?s.get(e.blob):null}async function u(e,t,s,n,a){const i=await s.get("@keet/files",{id:a});if(!i)return null;const r=await t.getFileEntryWithPreview(e,i.file,{loadBlob:e=>c(e,s,n)});return{...i.file,entry:r}}function d(e){return async function(e){return{...e,members:await t(e)}};async function t({callKey:t}){return m(e.find("@keet/call-members",{gte:{callKey:t},lte:{callKey:t}}),async e=>({...e,devices:await s(e)}))}async function s({callKey:t,memberKey:s}){const a={gte:{callKey:t,memberKey:s},lte:{callKey:t,memberKey:s}};return m(e.find("@keet/call-devices-by-member-key",a),async e=>({...e,streams:await n(e)}))}async function n({callKey:t,deviceKey:s}){const n={gte:{callKey:t,deviceKey:s},lte:{callKey:t,deviceKey:s}};return m(e.find("@keet/call-streams-by-device-key",n),async t=>{const s=await e.get("@keet/call-stream-statuses",{statusKey:t.statusKey});return{...t,muted:!!s&&s.muted}})}}async function m(e,t){const s=[];for await(const n of e)s.push(t(n));return Promise.all(s)}module.exports={getChatMessages:async function(e,t,s,n,a,i){const[r,o]=await Promise.all([s.get("@local/rooms",{roomKey:t}),e()]);if(!o||!r)return[];const c=Array.isArray(o)?o:[o],u=[];for(const e of c)u.push(l(t,n,a,r,i,e));return Promise.all(u)},getReactions:i,getChatLabels:r,getChatMessage:l,getCalls:async function(e,t){const s=d(e);return m(e.find(t),s)},getCall:async function(e,t){const s=d(e),n=await e.findOne(t);return n?s(n):null},isDMRead:o,roomHasUnread:function(e,t,s){if(!e||e.status?.isRemoved||e.status?.isPrivateProfile)return!1;if(!t||!t.isActive)return!1;if(t.isUnread)return!0;const n=e.lastMessage;return!!n?.id&&!!s&&n.id.index>=s.length},loadBlob:c,parallel:m};