/**
 * ============================================================================
 * MyClaw TTS — 讯飞语音合成
 * ============================================================================
 *
 * 功能：在每条消息的 .chat-group-footer 左侧注入播放按钮，用文字显示状态
 *
 * 状态：
 *   idle       → 默认，显示"播放"
 *   generating  → 合成中，显示"生成中"
 *   playing    → 播放中，显示"播放中"，点击停止并回到"播放"
 *
 * 依赖：voice-output.js（讯飞 VoiceOutput SDK，需先于本脚本加载）
 * ============================================================================
 */
(function () {
  'use strict';

  // ═══ 状态 ═══
  var tts = null;              // VoiceOutput 实例
  var playerState = 'idle';   // idle | generating | playing
  var currentBtn = null;      // 当前正在使用的按钮

  // ═══ 讯飞配置 ═══
  var IFLYTEK_CONFIG = {
    APPID: 'de6ec59e',
    APISecret: 'ZTA3ZDU3YjAyNDUyZGVkNjQwMGM5MWNi',
    APIKey: '37104a0463a5460d7571869324b667d5',
    vcn: 'x4_yezi',
  };

  // ═══ 公开接口 ═══
  window.MyClawTts = {
    setVcn: function (vcn) {
      IFLYTEK_CONFIG.vcn = vcn;
      if (tts) tts.vcn = vcn;
    },
    getVcn: function () {
      return IFLYTEK_CONFIG.vcn;
    },
    speak: function (text) {
      if (!tts) initTts();
      if (tts) tts.speak(text);
    },
  };

  // ═══ 状态文字（带 ↑ 图标） ═══
  var STATE_TEXT = {
    idle: '↑ 播放',
    generating: '↑ 生成中',
    playing: '↑ 播放中',
  };

  // ═══ 提取消息文字 ═══
  function extractMessageText(btn) {
    var group = btn.closest('.chat-group-messages');
    if (!group) return '';

    var bubble = group.querySelector('.chat-bubble');
    if (!bubble) return '';

    var chatText = bubble.querySelector('.chat-text');
    if (!chatText) return '';

    var text = chatText.textContent || '';
    text = text.replace(/\s+/g, ' ').trim();

    // 讯飞 TTS 长度限制：截断到 3200 字符
    var MAX_LENGTH = 3200;
    if (text.length > MAX_LENGTH) {
      text = text.substring(0, MAX_LENGTH);
    }

    // log 显示文本开头和结尾
    var preview = text.substring(0, 20) + '...' + text.substring(Math.max(0, text.length - 20));
    console.log('[myclaw-tts] 提取文本 (' + text.length + ' 字符):', preview);

    return text;
  }

  // ═══ 创建按钮 ═══
  function createTtsBtn() {
    var btn = document.createElement('button');
    btn.className = 'myclaw-tts-btn';
    btn.type = 'button';
    btn.textContent = STATE_TEXT.idle;
    return btn;
  }

  // ═══ 更新按钮状态 ═══
  function updateBtn(btn, state) {
    if (!btn) return;
    playerState = state;
    btn.textContent = STATE_TEXT[state];
    btn.classList.remove('myclaw-tts--generating', 'myclaw-tts--playing');

    if (state === 'generating') {
      btn.classList.add('myclaw-tts--generating');
    } else if (state === 'playing') {
      btn.classList.add('myclaw-tts--playing');
    }
  }

  // ═══ 注入按钮到 footer ═══
  function injectBtn(footer) {
    // 避免重复注入
    if (footer.querySelector('.myclaw-tts-btn')) return;

    var btn = createTtsBtn();

    btn.addEventListener('click', function (e) {
      e.preventDefault();
      e.stopPropagation();

      var state = playerState;
      var text = extractMessageText(btn);

      if (!text) {
        console.warn('[myclaw-tts] 未找到消息文字');
        return;
      }

      // 正在播放时，点击停止
      if (state === 'playing' && currentBtn === btn) {
        console.log('[myclaw-tts] 停止播放');
        if (tts) tts.stop();
        updateBtn(btn, 'idle');
        currentBtn = null;
        return;
      }

      // 已有其他按钮在播放，先停掉
      if (state === 'playing' && currentBtn && currentBtn !== btn) {
        if (tts) tts.stop();
        updateBtn(currentBtn, 'idle');
      }

      console.log('[myclaw-tts] 播放:', text.substring(0, 50) + (text.length > 50 ? '...' : ''));

      currentBtn = btn;
      updateBtn(btn, 'generating');

      if (!tts) initTts();
      if (tts) {
        tts.onAudioEnd = function () {
          console.log('[myclaw-tts] 播放结束');
          if (currentBtn) {
            updateBtn(currentBtn, 'idle');
            currentBtn = null;
          }
          playerState = 'idle';
        };
        tts.vcn = IFLYTEK_CONFIG.vcn;
        tts.speak(text);
      }
    });

    // 插入到 footer 最前面（左边），原有按钮保留在右边
    footer.insertBefore(btn, footer.firstChild);
    console.log('[myclaw-tts] ✅ 播放按钮已注入');
  }

  // ═══ 定期扫描 footer 并注入按钮 ═══
  function scanFooters() {
    document.querySelectorAll('.chat-group-footer').forEach(function (footer) {
      if (!footer.querySelector('.myclaw-tts-btn')) {
        injectBtn(footer);
      }
    });
  }

  // ═══ 初始化 TTS ═══
  function initTts() {
    if (typeof window.VoiceOutput === 'undefined') {
      console.error('[myclaw-tts] VoiceOutput SDK 未加载');
      return;
    }
    if (tts) return;

    tts = new window.VoiceOutput({
      APPID: IFLYTEK_CONFIG.APPID,
      APISecret: IFLYTEK_CONFIG.APISecret,
      APIKey: IFLYTEK_CONFIG.APIKey,
      vcn: IFLYTEK_CONFIG.vcn,
      onStatusChange: function (oldStatus, newStatus) {
        console.log('[myclaw-tts] status:', oldStatus, '->', newStatus);

        if (oldStatus === 'synthesizing' && newStatus === 'idle' && playerState === 'generating') {
          // 合成完成，开始播放
          if (currentBtn) updateBtn(currentBtn, 'playing');
        } else if (newStatus === 'idle' && playerState === 'generating' && oldStatus !== 'synthesizing') {
          // 连接失败或其他错误（非正常完成）
          if (currentBtn) updateBtn(currentBtn, 'idle');
          currentBtn = null;
        }
      },
      onError: function (err) {
        console.error('[myclaw-tts] error:', err);
        if (currentBtn) {
          updateBtn(currentBtn, 'idle');
          currentBtn = null;
        }
        playerState = 'idle';
      },
    });

    console.log('[myclaw-tts] ✅ 讯飞 TTS SDK 已初始化');
  }

  // ═══ 样式 ═══
  function injectStyles() {
    if (document.querySelector('#myclaw-tts-styles')) return;
    var style = document.createElement('style');
    style.id = 'myclaw-tts-styles';
    style.textContent = [
      /* 按钮基础样式 — 默认隐藏，生成完毕后显示，永远不透明 */
      '.myclaw-tts-btn {',
      '  display: none !important;',
      '  opacity: 1 !important;',
      '  background: rgba(59, 130, 246, 0.1);',
      '  border: 1px solid rgba(59, 130, 246, 0.3);',
      '  border-radius: 4px;',
      '  color: #3b82f6;',
      '  font-size: 12px;',
      '  padding: 2px 8px;',
      '  cursor: pointer;',
      '  transition: all 0.2s;',
      '  white-space: nowrap;',
      '}',
      '.myclaw-tts-btn:hover {',
      '  background: rgba(59, 130, 246, 0.2);',
      '}',
      /* 生成中 */
      '.myclaw-tts-btn.myclaw-tts--generating {',
      '  color: #f59e0b;',
      '  border-color: rgba(245, 158, 11, 0.4);',
      '  background: rgba(245, 158, 11, 0.1);',
      '  animation: myclaw-tts-blink 0.8s ease-in-out infinite;',
      '}',
      /* 播放中 */
      '.myclaw-tts-btn.myclaw-tts--playing {',
      '  color: #10b981;',
      '  border-color: rgba(16, 185, 129, 0.4);',
      '  background: rgba(16, 185, 129, 0.1);',
      '}',
      '@keyframes myclaw-tts-blink {',
      '  0%, 100% { opacity: 1; }',
      '  50% { opacity: 0.5; }',
      '}',
      /* 生成完毕（有 chat-delete-wrap）时显示 */
      '.chat-group-footer:has(.chat-delete-wrap) .myclaw-tts-btn {',
      '  display: inline-flex !important;',
      '}',
    ].join('\n');
    document.head.appendChild(style);
  }

  // ═══ 启动 ═══
  function init() {
    injectStyles();
    initTts();
    // 立即扫描一次
    scanFooters();
    // 定期扫描新出现的 footer
    setInterval(scanFooters, 1000);
    console.log('[myclaw-tts] ✅ 初始化完成');
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
  } else {
    init();
  }
})();
