"use strict";
var common_vendor = require("../../common/vendor.js");
var config_index = require("../../config/index.js");
var utils_wsRequest = require("../../utils/wsRequest.js");
var utils_audioUtil = require("../../utils/audioUtil.js");
var api_index = require("../../api/index.js");
require("../../utils/request.js");
const _sfc_main = {
  setup(__props) {
    const innerAudioContext = wx.createInnerAudioContext({
      useWebAudioImplement: false
    });
    common_vendor.reactive([]);
    innerAudioContext.playbackRate = 1.3;
    const recorderManager = wx.getRecorderManager();
    const ws = common_vendor.ref(null);
    const params = {
      audio: "",
      meta_info: {
        session_id: "",
        encoding: "raw"
      },
      is_close: false
    };
    const options = {
      duration: 6e5,
      sampleRate: 16e3,
      numberOfChannels: 1,
      encodeBitRate: 96e3,
      format: "PCM",
      frameSize: 12
    };
    innerAudioContext.onEnded(() => {
      playNext();
    });
    const startRecord = () => {
      isRecording.value = true;
      console.log("\u5F00\u59CB\u5F55\u97F3");
      recorderManager.start(options);
    };
    const stopRecord = () => {
      if (!isRecording.value) {
        console.log("\u6CA1\u6709\u5728\u5F55\u97F3...");
        return;
      }
      recorderManager.stop();
      isRecording.value = false;
      console.log("\u505C\u6B62\u5F55\u97F3");
    };
    const playNext = () => {
      if (aiVoices.length > 0) {
        isPlaying.value = true;
        let first = aiVoices.shift(0);
        if (first) {
          recorderManager.pause();
          innerAudioContext.src = first;
          innerAudioContext.play();
        }
      } else {
        isPlaying.value = false;
        recorderManager.resume();
      }
    };
    let aiVoices = common_vendor.reactive([]);
    let roleName = common_vendor.ref("");
    let currentRoleId = common_vendor.ref("");
    let status = common_vendor.ref("\u7B49\u5F85\u5BF9\u65B9\u63A5\u6536\u9080\u8BF7...");
    let isRecording = common_vendor.ref(false);
    let isPlaying = common_vendor.ref(false);
    let isLoudSpeaker = common_vendor.ref(true);
    let aiAvatarId = common_vendor.ref("");
    let backGroundList = common_vendor.reactive([]);
    const currentBackGroundImage = common_vendor.computed$1(() => {
      return backGroundList[0];
    });
    common_vendor.onShow(() => {
      common_vendor.index.getStorage({
        key: "chatInfo",
        success: ({
          data
        }) => {
          const {
            session_id,
            background_ids = "",
            role_name,
            avatar_id,
            role_id
          } = data;
          roleName.value = role_name;
          currentRoleId.value = role_id;
          params.meta_info.session_id = session_id;
          aiAvatarId.value = avatar_id;
          backGroundList.push(...background_ids.split(","));
        }
      });
      const pcmToArrayBuffer = (pcmData, sampleRate, channels, sampleBits) => {
        var _a;
        const chunkSize = 36 + pcmData.byteLength;
        const byteRate = sampleRate * channels * (sampleBits / 8);
        const blockAlign = channels * (sampleBits / 8);
        const wavHeader = new ArrayBuffer(44);
        const view = new DataView(wavHeader);
        view.setUint32(0, 1380533830, false);
        view.setUint32(4, chunkSize, true);
        view.setUint32(8, 1463899717, false);
        view.setUint32(12, 1718449184, false);
        view.setUint32(16, 16, true);
        view.setUint16(20, 1, true);
        view.setUint16(22, channels, true);
        view.setUint32(24, sampleRate, true);
        view.setUint32(28, byteRate, true);
        view.setUint16(32, blockAlign, true);
        view.setUint16(34, sampleBits, true);
        view.setUint32(36, 1684108385, false);
        view.setUint32(40, pcmData.byteLength, true);
        const wavArrayBuffer = new Uint8Array(wavHeader);
        const pcmArrayBuffer = new Uint8Array(pcmData);
        const combinedArrayBuffer = new Uint8Array(wavArrayBuffer.length + pcmArrayBuffer.length);
        combinedArrayBuffer.set(wavArrayBuffer, 0);
        combinedArrayBuffer.set(pcmArrayBuffer, wavArrayBuffer.length);
        const base64 = wx.arrayBufferToBase64(combinedArrayBuffer);
        const data = Object.assign({}, params);
        data.audio = base64;
        (_a = ws.value) == null ? void 0 : _a.sendMsg(data);
        console.log(data);
      };
      recorderManager.onFrameRecorded((res) => {
        const {
          frameBuffer,
          isLastFrame
        } = res;
        pcmToArrayBuffer(frameBuffer, 16e3, 1, 16);
      });
    });
    const usermessageIsEnd = common_vendor.ref(false);
    const llmmessageIsEnd = common_vendor.ref(false);
    const usermsg = common_vendor.reactive([]);
    const llmmsg = common_vendor.reactive([]);
    common_vendor.onMounted(() => {
      var _a;
      try {
        wx.setKeepScreenOn({
          keepScreenOn: true
        });
        ws.value = new utils_wsRequest.webSocketClass(config_index.wsVoiceCallUrl, 60);
        (_a = ws.value) == null ? void 0 : _a.initSocket().then((res) => {
          status.value = "\u5DF2\u63A5\u901A";
          setTimeout(() => {
            status.value = "";
          }, 2e3);
          common_vendor.index.$on("message", ({
            type,
            data
          }) => {
            status.value = "";
            console.log("\u6536\u5230\u56DE\u590D", data);
            if (data instanceof ArrayBuffer) {
              utils_audioUtil.savePCMBuffer(data, aiVoices);
              setTimeout(() => {
                if (!isPlaying.value) {
                  playNext();
                }
              }, 400);
            } else {
              const message = JSON.parse(data);
              if (message.type === "user_text") {
                usermsg.push(message.msg);
              } else if (message.type === "llm_text") {
                llmmsg.push(message.msg);
              } else if (message.type === "end") {
                usermessageIsEnd.value = true;
                llmmessageIsEnd.value = true;
                api_index.saveMessage({
                  role_id: currentRoleId.value,
                  direction: 0,
                  message: usermsg.join("")
                }).then(({ status: status2 }) => {
                  usermsg.length = 0;
                  api_index.saveMessage({
                    role_id: currentRoleId.value,
                    direction: 1,
                    message: llmmsg.join("")
                  }).then(({ status: status3 }) => {
                    llmmsg.length = 0;
                  });
                });
              }
            }
          });
          startRecord();
        });
      } catch (e) {
      }
    });
    const finlizer = () => {
      var _a, _b;
      wx.setKeepScreenOn({
        keepScreenOn: false
      });
      innerAudioContext.destroy();
      stopRecord();
      const data = Object.assign({}, params);
      data.audio = "";
      data.is_close = true;
      (_a = ws.value) == null ? void 0 : _a.sendMsg(data);
      (_b = ws.value) == null ? void 0 : _b.closeSocket();
    };
    const endCall = () => {
      common_vendor.index.navigateBack({
        delta: 1
      });
    };
    const goToChat = () => {
      common_vendor.index.redirectTo({
        url: "/pages/chatOnline/index"
      });
    };
    common_vendor.onUnmounted(() => {
      finlizer();
    });
    const changeLoudSpeaker = () => {
      innerAudioContext.pause();
      wx.setInnerAudioOption({
        speakerOn: !isLoudSpeaker.value
      });
      innerAudioContext.play();
      isLoudSpeaker.value = !isLoudSpeaker.value;
    };
    return (_ctx, _cache) => {
      return {
        a: `${common_vendor.unref(config_index.filePrefix)}${common_vendor.unref(currentBackGroundImage)}`,
        b: `${common_vendor.unref(config_index.filePrefix)}${common_vendor.unref(aiAvatarId)}`,
        c: common_vendor.t(common_vendor.unref(roleName)),
        d: common_vendor.t(common_vendor.unref(status)),
        e: common_vendor.unref(isRecording),
        f: common_vendor.o(($event) => goToChat()),
        g: common_vendor.o(($event) => endCall()),
        h: common_vendor.o(($event) => changeLoudSpeaker()),
        i: common_vendor.o(($event) => goToChat()),
        j: common_vendor.o(($event) => endCall()),
        k: common_vendor.t(common_vendor.unref(isLoudSpeaker) ? "\u626C\u58F0\u5668\u5DF2\u5F00" : "\u626C\u58F0\u5668\u5DF2\u5173"),
        l: common_vendor.o(($event) => changeLoudSpeaker())
      };
    };
  }
};
var MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-07f20a9a"], ["__file", "C:/Users/bzm15/Desktop/ix/mini_web-develop/pages/call/index.vue"]]);
wx.createPage(MiniProgramPage);
