import { Test, TestingModule } from '@nestjs/testing';
import { AiService } from './ai.service';
import { ConfigService } from '@nestjs/config';

describe('AiService', () => {
  let service: AiService;
  let configService: ConfigService;

  const mockConfigService = {
    get: jest.fn().mockImplementation((key: string) => {
      if (key === 'OPENROUTER_API_KEY') return 'test-key';
      return null;
    }),
  };

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        AiService,
        { provide: ConfigService, useValue: mockConfigService },
      ],
    }).compile();

    service = module.get<AiService>(AiService);
    configService = module.get<ConfigService>(ConfigService);
    jest.clearAllMocks();
  });

  describe('chat', () => {
    it('should generate simulated/streamed AI text response', async () => {
      const response = await service.chat([
        { role: 'user', content: 'Hello, what products do you have?' },
      ]);

      expect(response).toBeDefined();
      expect(response.text).toBe('Simulated AI response');
    });
  });

  describe('streamChat', () => {
    it('should stream chunks and end the HTTP response', async () => {
      const mockRes = {
        setHeader: jest.fn(),
        write: jest.fn(),
        end: jest.fn(),
        headersSent: false,
        status: jest.fn().mockReturnThis(),
        json: jest.fn(),
      };

      await service.streamChat(
        [{ role: 'user', content: 'Tell me about products' }],
        mockRes as any,
      );

      expect(mockRes.setHeader).toHaveBeenCalledWith('Content-Type', 'text/plain; charset=utf-8');
      expect(mockRes.write).toHaveBeenCalledWith('Simulated AI response');
      expect(mockRes.end).toHaveBeenCalled();
    });
  });
});
