const{PrivateMailboxSchema:e}=require("@holepunchto/keet-core-schemas"),{FEATURES:i}=require("@holepunchto/keet-core-api"),{AddPrivateMailboxRecordOperation:t,UpdatePrivateMailboxRecordOperation:a}=e.Operations;module.exports=class{static Operations=new Set([t.TYPE,a.TYPE]);constructor(e){this.profile=e,this.privateMailbox=null,this.sentPrivateMailbox=null,this.privateMailboxCounter=null,this.privateMailByMessageId=null,this.privateMailByPublicMail=null,this.dmByMember=null}initialize(){this.privateMailbox=this.profile.view.collections.privateMailbox,this.sentPrivateMailbox=this.profile.view.collections.sentPrivateMailbox,this.privateMailboxCounter=this.profile.view.indexes.privateMailboxCounter,this.privateMailByMessageId=this.profile.view.indexes.privateMailByMessageId,this.privateMailByPublicMail=this.profile.view.indexes.privateMailByPublicMail,this.dmByMember=this.profile.view.indexes.dmByMember}async _indexCounter(e,i,t){i&&!e&&(await this.privateMailboxCounter.insert(t[2]),await this.privateMailByMessageId.insert([i.id.key,i.id.seq],{timestamp:t[0],roomKey:t[1],seq:t[2]}))}async _indexPublicMail(e,i,t){i&&i.mailId&&!e&&await this.privateMailByPublicMail.insert([t[1],i.mailId.key,i.mailId.seq],{timestamp:t[0],roomKey:t[1],seq:t[2]})}async _indexReceiverDm(e,i,t){if(!e&&i&&i.senderKey&&i.invitation&&await this.dmByMember.insert(i.senderKey,{id:i.id,roomKey:null}),e&&i&&i.senderKey){const{id:e,targetRoomKey:t,status:a}=i;await this.dmByMember.insert(i.senderKey,{id:e,roomKey:t,status:a})}}async _indexSenderDm(e,i,t){!e&&i&&i.receiverKey&&await this.dmByMember.insert(i.receiverKey,{id:i.id,roomKey:null}),e&&i&&i.receiverKey&&i.targetRoomKey&&await this.dmByMember.insert(i.receiverKey,{id:i.id,roomKey:i.targetRoomKey})}async _applyAddPrivateMailboxRecordOperation(e,{id:i}){const{value:t}=e,a=[t.timestamp,t.roomKey,await this.getNextPrivateMailboxId()],{mailId:r}=t,s=!!t.receiverKey,l={id:i,mailId:t.mailId||null,seen:s,type:t.type||null,status:t.status||null,senderKey:t.senderKey||null,receiverKey:t.receiverKey||null,targetRoomKey:t.targetRoomKey||null,message:t.message||null,invitation:t.invitation||null};if(!s){if(await this.dmByMember.get(t.senderKey))return;if(await this.privateMailByPublicMail.get([t.roomKey,r.key,r.seq]))return;return await this.privateMailbox.update(a,l,{upsert:!0})}await this.dmByMember.get(t.receiverKey)||await this.sentPrivateMailbox.update(a,l,{upsert:!0})}async _applyUpdatePrivateMailboxRecordOperation(e){const{msgId:i,...t}=e.value,a=await this.privateMailByMessageId.get([i.key,i.seq]);if(!a||!a.value)return;const r=a.value,s=[r.timestamp,r.roomKey,r.seq],[l,o]=await Promise.all([this.privateMailbox.get(s),this.sentPrivateMailbox.get(s)]),n=l||o,d=t.targetRoomKey||n?.value.targetRoomKey,u=n?.value.seen||t.seen;let p=n?.value.status||3;3!==p||1!==t.status&&2!==t.status||(p=t.status);const y={...n.value,status:p,seen:u,targetRoomKey:d};return l?this.privateMailbox.update(s,y,{upsert:!0}):o?this.sentPrivateMailbox.update(s,y,{upsert:!0}):void 0}async getNextPrivateMailboxId(){const e=await this.privateMailboxCounter.peek({reverse:!0});return e?e.key+1:0}async autobaseApply(e,r){if(!await this.profile.view.isFeatureSupported(i.DMS))return null;switch(e.type){case t.TYPE:return this._applyAddPrivateMailboxRecordOperation(e,r);case a.TYPE:return this._applyUpdatePrivateMailboxRecordOperation(e,r)}}async autobaseIndex({prev:e,next:i,id:t}){await this._indexCounter(e,i,t),await this._indexPublicMail(e,i,t),await this._indexReceiverDm(e,i,t)}async autobaseIndexSent({prev:e,next:i,id:t}){await this._indexCounter(e,i,t),await this._indexSenderDm(e,i,t)}};