import { IStorage } from './interface/IStorage';
import { ChatMessage } from './types/ChatMessage';
type BasicStorageProps = {
  initMessageList: ChatMessage[];
};

export class BasicStorage implements IStorage {
  constructor({ initMessageList }: BasicStorageProps) {
    this.messageList = initMessageList;
  }
  messageList: ChatMessage[] = [];

  /**
   * 更新list
   * @param messageList
   * @return void
   */
  setMessageList(messageList: ChatMessage[]) {
    this.messageList = messageList;
    return JSON.parse(JSON.stringify(this.messageList));
  }
  /*
   * add list
   */
  addMessageList(
    message: ChatMessage | ChatMessage[],
    addType: string = 'push',
  ) {
    let addMessage = Array.isArray(message) ? message : [message];
    if (addType === 'push') {
      this.messageList = [...this.messageList, ...addMessage];
    }
    if (addType === 'unshift') {
      this.messageList = [...addMessage, ...this.messageList];
    }

    return JSON.parse(JSON.stringify(this.messageList));
  }
  /*
   *获取 list
   */
  getMessageItem(key: string) {
    const keyx = this.messageList.findIndex((message) => message.key === key);

    if (keyx !== -1) {
      return [this.messageList[keyx], keyx];
    } else {
      return [undefined, undefined];
    }
  }
  getMessageList() {
    return this.messageList;
  }
  /**
   * Replace message in message collection
   * @param message
   */
  updateMessageItem(message: ChatMessage) {
    const [foundMessage, idx] = this.getMessageItem(message.key);

    if (foundMessage) {
      this.messageList = this.messageList
        .concat(this.messageList.slice(0, idx as number))
        .concat(message)
        .concat(this.messageList.slice((idx as number) + 1));
    }
    return JSON.parse(JSON.stringify(this.messageList));
  }

  removeMessageList(keys: string[] | string) {
    let removMessage = Array.isArray(keys) ? keys : [keys];
    this.messageList = this.messageList.filter(
      (item) => !removMessage.includes(item.key),
    );
    return JSON.parse(JSON.stringify(this.messageList));
  }
}
