// 基于浏览器原生 MediaRecorder 录制远端 WebRTC 视频流（recvonly 的被控端画面）。
// 输出封装：Chrome/Firefox 为 WebM(VP8/VP9 + Opus)；Safari 可出 MP4(H.264)。
// 无需第三方库，也不逐帧抽数据——直接把 MediaStream 交给 MediaRecorder。

function timestamp() {
  const d = new Date();
  const p = (n) => String(n).padStart(2, '0');
  return (
    `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}` +
    `_${p(d.getHours())}${p(d.getMinutes())}${p(d.getSeconds())}`
  );
}

export class VideoRecorder {
  constructor() {
    this.recorder = null;
    this.chunks = [];
    this.recording = false;
    this.startTime = 0;
  }

  // 浏览器是否支持 MediaRecorder
  get isSupported() {
    return typeof MediaRecorder !== 'undefined';
  }

  // 探测浏览器支持的录制 mimeType（优先 WebM/VP9，回落 WebM/VP8，再回落 MP4）
  static pickMimeType() {
    if (typeof MediaRecorder === 'undefined') return null;
    const candidates = [
      'video/webm;codecs=vp9,opus',
      'video/webm;codecs=vp8,opus',
      'video/webm',
      'video/mp4',
    ];
    if (typeof MediaRecorder.isTypeSupported === 'function') {
      for (const t of candidates) {
        if (MediaRecorder.isTypeSupported(t)) return t;
      }
    }
    return '';
  }

  // 开始录制；stream 为远端 MediaStream（含视频轨）。成功返回 true。
  start(stream) {
    if (this.recording || !stream) return false;
    if (!this.isSupported) throw new Error('当前浏览器不支持 MediaRecorder 录制');
    const mimeType = VideoRecorder.pickMimeType();
    try {
      this.recorder = mimeType
        ? new MediaRecorder(stream, { mimeType })
        : new MediaRecorder(stream);
    } catch (e) {
      throw new Error('创建 MediaRecorder 失败: ' + (e?.message || e));
    }
    this.chunks = [];
    this.recorder.ondataavailable = (e) => {
      if (e.data && e.data.size > 0) this.chunks.push(e.data);
    };
    // 每秒收集一次分片：即使意外中断也只丢失最近 1 秒，且 final chunk 更完整。
    this.recorder.start(1000);
    this.recording = true;
    this.startTime = Date.now();
    return true;
  }

  // 停止录制，返回 { blob, url, ext, filename, mimeType } 或 null。
  stop() {
    return new Promise((resolve) => {
      if (!this.recorder || !this.recording) {
        resolve(null);
        return;
      }
      this.recorder.onstop = () => {
        const type = this.recorder.mimeType || 'video/webm';
        const blob = new Blob(this.chunks, { type });
        const ext = type.includes('mp4') ? 'mp4' : 'webm';
        const filename = 'rec_' + timestamp() + '.' + ext;
        const url = URL.createObjectURL(blob);
        this.recording = false;
        this.chunks = [];
        this.recorder = null;
        resolve({ blob, url, ext, filename, mimeType: type });
      };
      this.recorder.stop();
    });
  }

  // 取消并丢弃（如断开连接时调用，不触发下载）。
  cancel() {
    if (this.recorder && this.recording) {
      try {
        this.recorder.onstop = null;
        this.recorder.stop();
      } catch { /* ignore */ }
    }
    this.recording = false;
    this.chunks = [];
    this.recorder = null;
  }
}
