// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

'use strict';

const {assert} = require('chai');
const {describe, it} = require('mocha');
const sinon = require('sinon');

const projectId = process.env.CAIP_PROJECT_ID;
const {delay} = require('../../test/util');
const proxyquire = require('proxyquire');

describe('live-conversation-audio-with-audio', () => {
  it('should generate content in a live session conversation from a text prompt', async function () {
    const mockClient = {
      live: {
        connect: async (opts = {}) => {
          setImmediate(() =>
            opts.callbacks.onmessage({
              serverContent: {
                inputTranscription: 'Hello Gemini',
                outputTranscription: 'Hi Mocked Gemini there!',
                modelTurn: {
                  parts: [
                    {
                      inlineData: {
                        data: Buffer.from('fake audio data').toString('base64'),
                      },
                    },
                  ],
                },
                turnComplete: false,
              },
            })
          );

          setImmediate(() =>
            opts.callbacks.onmessage({
              serverContent: {
                modelTurn: {parts: []},
                turnComplete: true,
              },
            })
          );

          return {
            sendRealtimeInput: async () => {},
            close: async () => {},
          };
        },
      },
    };

    const sample = proxyquire('../live-conversation-audio-with-audio', {
      '@google/genai': {
        GoogleGenAI: function () {
          return mockClient;
        },
        Modality: {AUDIO: 'AUDIO'},
      },
      fs: {
        readFileSync: sinon.stub().returns(Buffer.alloc(100, 0)),
        writeFileSync: sinon.stub().returns(),
      },
      path: {
        join: (...args) => args.join('/'),
      },
    });

    this.timeout(180000);
    this.retries(4);
    await delay(this.test);
    const output = await sample.generateLiveConversation(projectId);
    console.log('Generated output:', output);
    assert(output.length > 0);
  });
});
