import MessageEventBus from "./MessageEventBus";
import ResponseUtils, { SendMessage,ResponseMessage } from "../utils/ResponseUtils";
import IMessageInterface from "../interface/IMessageInterface";
import { isBackgroundScript, isPopupScript } from "../utils/Utils";
export class WindowEventBus extends MessageEventBus implements IMessageInterface{
  script='window';
  constructor(script?:string){
    super()
    let defaultScript='window'
    if(isBackgroundScript()){
      defaultScript='background'
    }else if(isPopupScript()){
      defaultScript='popup'
    }
    this.script=script||defaultScript;//当前脚本
    if(this.script==='window'){
      this.listener()
    }
  }
  listener(): void {
    let _this=this;
    window.addEventListener('message', function (e) {  // 监听 message 事件
      // console.log('window message--',e.origin,e.data)
      _this.handler(e.data)
    });
  }
  /**
   * 消息处理
   * @param {*} request 
   */
  async handler(request:any){
    let type=request.type||''//$emit提交时的事件
    let args=request.message
    let _this=this;
    let handler = _this._events.get(type)//所有该类型的函数集合
    if(!handler)return;//无任何监听则退出
    if (Array.isArray(handler)) {
      // 是数组，说明有多个监听者，需要依次触发里边的函数
      for (let i = 0; i < handler.length; ++i) {
        let res=await handler[i].call(_this, ...args)
      }
    } else {
      // 单个函数的情况直接触发即可
      let res=await handler.call(_this, ...args)
    }
    return this
  }
  $emitContent(type: string, ...args: any): Promise<any> {
    let _this=this;
    return new Promise((resolve,reject)=>{//调整成Promise
      _this.getCurrentTabs((tabs:any)=>{
        const tabId=tabs.length ? tabs[0].id: null
        if(!tabId){
          reject('找到激活的tab')
        }
        // console.log('ssss')
        const message:SendMessage={
          script:'content',
          type: type,//事件名
          message: args
        }
        chrome.tabs.sendMessage(tabId, message, function(response){
          // console.log('response=====',response);
          resolve(response)
        });
      })
    })
  }
  $emitBackground(type: string, ...args: any): Promise<any> {
    return new Promise((resolve,reject)=>{
      const message:SendMessage={
        script:'background',
        type: type,//事件名
        message: args
      }
      chrome.runtime.sendMessage(message,(response:ResponseMessage)=>{
        if(ResponseUtils.isSuccess(response)){
          resolve(response.data)
        }else{
          reject(response.message)
        }
      });
    })
  }
  $emitPopup(type: string, ...args: any): Promise<any> {
    return new Promise((resolve,reject)=>{
      const message:SendMessage={
        script:'popup',
        type: type,//事件名
        message: args
      }
      chrome.runtime.sendMessage(message,(response:ResponseMessage)=>{
        if(ResponseUtils.isSuccess(response)){
          resolve(response.data)
        }else{
          reject(response.message)
        }
      });
    })
  }
  $emitWindow(type: string, ...args: any): Promise<any> {
    return this.$emit(type,...args);
  }
  $emitAllTabs(type: string, ...args: any): Promise<any> {
    let _this=this
    return new Promise((resolve,reject)=>{//调整成Promise
      _this.getTabs((tabs:any)=>{
        if(tabs&&Array.isArray(tabs)&&tabs.length>0){
          for(let i=0;i<tabs.length;i++){
            const tabId=tabs[i].id|| null
            const message:SendMessage={
              script:'content',
              type: type,//事件名
              message: args
            }
            chrome.tabs.sendMessage(tabId, message, function(response){
              // console.log('response=====',response);
              if(i===tabs.length){//最后一个发送完成
                resolve(response)
              }
            });
          }
        }else{
          reject('找到激活的tab')
        }
        
      },{windowType:'normal'})
    })
  }
}
const $bus=new WindowEventBus()
export default $bus