/**
 * @license
 * Copyright 2026 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

import { describe, it, afterEach } from 'vitest';
import { AppRig } from '../test-utils/AppRig.js';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { PolicyDecision } from '@google/gemini-cli-core';

const __dirname = path.dirname(fileURLToPath(import.meta.url));

describe('Model Steering Integration', () => {
  let rig: AppRig | undefined;

  afterEach(async () => {
    await rig?.unmount();
  });

  it('should steer the model using a hint during a tool turn', async () => {
    const fakeResponsesPath = path.join(
      __dirname,
      '../test-utils/fixtures/steering.responses',
    );
    rig = new AppRig({
      fakeResponsesPath,
      configOverrides: { modelSteering: true },
    });
    await rig.initialize();
    await rig.render();
    await rig.waitForIdle();

    rig.setToolPolicy('list_directory', PolicyDecision.ASK_USER);
    rig.setToolPolicy('read_file', PolicyDecision.ASK_USER);

    rig.setMockCommands([
      {
        command: /list_directory/,
        result: {
          output: 'file1.txt\nfile2.js\nfile3.md',
          exitCode: 0,
        },
      },
      {
        command: /read_file file1.txt/,
        result: {
          output: 'This is file1.txt content.',
          exitCode: 0,
        },
      },
    ]);

    // Start a long task
    await rig.type('Start long task');
    await rig.pressEnter();

    // Wait for the model to call 'list_directory' (Confirming state)
    await rig.waitForOutput('ReadFolder');

    // Injected a hint while the model is in a tool turn
    await rig.addUserHint('focus on .txt');

    // Resolve list_directory (Proceed)
    await rig.resolveTool('ReadFolder');

    // Then it should proceed with the next action
    await rig.waitForOutput(
      /Since you want me to focus on .txt files,[\s\S]*I will read file1.txt/,
    );
    await rig.waitForOutput('ReadFile');

    // Resolve read_file (Proceed)
    await rig.resolveTool('ReadFile');

    // Wait for final completion
    await rig.waitForOutput('Task complete.');
  });
});
