import { BadRequestException, Body, Controller, Post } from '@nestjs/common';
import { QuestionDto } from './dtos/question.dto';
import axios from 'axios';
import OpenAI from 'openai';

// 60请求/小时/IP,也就是每分钟只能请求一次
const aiModels = [
  new OpenAI({
    apiKey: 'sk-PygfD6zHoPSRE059lm7CGlD2MaypjFsAlZk4RKTYd1K4Ij70',
    baseURL: 'https://api.chatanywhere.com.cn/v1',
  }),
  new OpenAI({
    apiKey: 'sk-om2JJcplsNMqhoa2oTRxub52bMuhkleiOWMwURW405XLf1k8',
    baseURL: 'https://api.chatanywhere.com.cn/v1',
  }),
];

function runAiMode(q) {
  return aiModels.reduce((prev, cur) => {
    return prev.catch(() => {
      return cur.chat.completions
        .create({
          messages: [{ role: 'user', content: q }],
          model: 'gpt-3.5-turbo',
        })
        .then((res) => {
          return res.choices[0].message.content;
        });
    });
  }, Promise.reject());
}

@Controller('ai')
export class AiController {
  @Post('question')
  async questionAi(@Body() questionDto: QuestionDto) {
    const { q } = questionDto;

    try {
      // 第一个AI接口
      const token1 = axios.CancelToken.source();
      const promise1 = axios
        .get(`https://v1.apigpt.cn/?q=${q}&apitype=sql`, {
          cancelToken: token1.token,
        })
        .then((res) => res.data.ChatGPT_Answer);
      // 第二个AI接口
      const token2 = axios.CancelToken.source();
      const promise2 = axios
        .post(
          'https://us-central1-chat-for-chatgpt.cloudfunctions.net/basicUserRequestBeta',
          {
            data: {
              message: q,
            },
          },
          {
            headers: {
              'User-Agent':
                'com.tappz.aichat/1.2.2 iPhone/16.3.1 hw/iPhone12_5',
            },
            cancelToken: token2.token,
          },
        )
        .then((res) => {
          return res.data.result.choices[0].text;
        });
      return Promise.any([promise1, promise2]).then((value) => {
        token1.cancel();
        token2.cancel();
        return value;
      });
    } catch {
      // 当以上的免费key不可用时用自己申请的免费APIKey
      try {
        return runAiMode(q);
      } catch {
        throw new BadRequestException('AI暂时无法回答,请等待一会儿');
      }
    }
  }

  // TODO 暂时不需要流式输出的AI接口
  // @Post('stream/question')
  // async questionAiByStream(@Body() questionDto: QuestionDto) {
  //   const { q } = questionDto;
  //   // 流式输出结果
  //   // 文言一心,不停置换响应内容的Acs-Token
  //   try {
  //   } catch {
  //     throw new BadRequestException('AI暂时无法回答,请等待一会儿');
  //   }
  // }
}
