import { Injectable, Inject, Logger } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import axios from 'axios';
import { Buffer } from 'buffer';
import { EventEmitter } from 'events';
import * as fs from 'fs';
import moment from 'moment';
import * as path from 'path';
import {
  createClient,
  LiveTTSEvents,
} from '@deepgram/sdk';
export class TextToSpeechService extends EventEmitter {
  private nextExpectedIndex = 0;
  private speechBuffer = {};
  private readonly logger = new Logger(TextToSpeechService.name);
  private is_audio_send = true
  constructor() {
    super();
  }

  set_is_audio_send(is_audio_send: boolean) {
    this.is_audio_send = is_audio_send;
  }

  get_is_audio_send() {
    return this.is_audio_send
  }
  async generate(gptReply: any, interactionCount: number) {
    const { partialResponseIndex, partialResponse,voice } = gptReply;

    if (!partialResponse) {
      return;
    }

    try {

      // console.time('deepgram audio convert time');
      // const response = await axios.post(
      //   `https://api.deepgram.com/v1/speak?model=aura-asteria-en`,
      //   { text: partialResponse },
      //   {
      //     headers: {
      //       'Content-Type': 'application/json',
      //       Authorization: `Token ${process.env.DEEPGRAM_API_KEY}`,
      //     },
      //     responseType: 'arraybuffer', // To get the response as a buffer
      //   }
      // );

      // if (response.status === 200) {
      //   try {
      //     const audioArrayBuffer = response.data;
      //     console.timeEnd('deepgram audio convert time');
      //     // let folder_path = path.resolve(__dirname + '/assets/' + 'data.mp3');
      //     // fs.writeFileSync(folder_path, audioArrayBuffer);
      //     console.log('audioArrayBuffer', audioArrayBuffer)
      //     // const base64String = Buffer.from(audioArrayBuffer).toString('base64');
      //     // console.log('base64String', base64String)
      //     // console.timeEnd('deepgram audio convert time');

      //     this.emit(
      //       'speech',
      //       partialResponseIndex,
      //       audioArrayBuffer,
      //       partialResponse,
      //       interactionCount
      //     );
      //   } catch (err) {
      //     this.logger.error('Error processing audio buffer', err);
      //   }
      // } else {
      //   this.logger.error('Deepgram TTS error:', response.statusText);
      // }


      /** STREAMING CODE */

      console.time('deepgram audio convert time');

      const deepgram = createClient(process.env.DEEPGRAM_API_KEY);

      const dgConnection = deepgram.speak.live({ model: "aura-asteria-en" });

      let audioBuffer = Buffer.alloc(0);

      dgConnection.on(LiveTTSEvents.Open, () => {
        console.log("Connection opened");
        
        
        dgConnection.on(LiveTTSEvents.Metadata, (data) => {
          console.log('Metadata:', data);
        });

        dgConnection.sendText(partialResponse);

        dgConnection.flush();

        dgConnection.on(LiveTTSEvents.Close, () => {
          console.log("Connection closed");
        });

        dgConnection.on(LiveTTSEvents.Metadata, (data) => {
          console.dir(data, { depth: null });
        });

        dgConnection.on(LiveTTSEvents.Audio, (data) => {
          // console.log("Deepgram audio data received");
          const buffer = Buffer.from(data);
          audioBuffer = Buffer.concat([audioBuffer, buffer]);

        });

        dgConnection.on(LiveTTSEvents.Flushed, () => {
          console.log("Deepgram Flushed");
          this.emit(
            'speech',
            partialResponseIndex,
            audioBuffer,
            partialResponse,
            interactionCount
          );
          console.timeEnd('deepgram audio convert time');
        });

        dgConnection.on(LiveTTSEvents.Error, (err) => {
          console.error(err);
        });
      });
    } catch (err) {
      this.logger.error('Error occurred in TextToSpeech service', err);
    }
  }
}
