import OpenAI from 'openai';
import * as dotenv from 'dotenv';

dotenv.config();

export interface AIGenerationOptions {
  model?: string;
  temperature?: number;
  maxTokens?: number;
}

export class AIService {
  private openai: OpenAI | null = null;

  constructor() {
    this.initializeOpenAI();
  }

  private initializeOpenAI() {
    const apiKey = process.env.OPENAI_API_KEY;
    if (!apiKey) {
      console.warn('OPENAI_API_KEY not found, AI features will be disabled');
      return;
    }

    try {
      this.openai = new OpenAI({
        apiKey: apiKey,
      });
      console.log('OpenAI service initialized successfully');
    } catch (error) {
      console.error('Failed to initialize OpenAI service:', error);
    }
  }

  /**
   * 生成文本内容
   */
  async generateText(
    prompt: string,
    options: AIGenerationOptions = {}
  ): Promise<string> {
    if (!this.openai) {
      throw new Error('AI service is not available. Please configure OPENAI_API_KEY.');
    }

    const {
      model = 'gpt-3.5-turbo',
      temperature = 0.7,
      maxTokens = 2000
    } = options;

    try {
      const response = await this.openai.chat.completions.create({
        model,
        messages: [
          {
            role: 'system',
            content: '你是一个专业的文档编辑助手，擅长方案设计和文档修改。请提供专业、准确的建议。'
          },
          {
            role: 'user',
            content: prompt
          }
        ],
        temperature,
        max_tokens: maxTokens,
      });

      const result = response.choices[0]?.message?.content;
      if (!result) {
        throw new Error('No response from AI service');
      }

      return result;
    } catch (error) {
      console.error('AI text generation failed:', error);
      throw new Error(`AI服务调用失败: ${error.message}`);
    }
  }

  /**
   * 获取文档修改建议
   */
  async getDocumentModificationSuggestions(
    content: string,
    instructions: string
  ): Promise<{
    suggestions: string[];
    revisedContent: string;
    confidence: number;
  }> {
    const prompt = `
      请对以下文档内容提供专业的修改建议：

      原始内容：
      ${content}

      修改要求：
      ${instructions}

      请提供：
      1. 3-5条具体的修改建议
      2. 修改后的完整内容
      3. 修改的置信度评分（0-1之间）

      请以JSON格式返回，格式如下：
      {
        "suggestions": ["建议1", "建议2", "建议3"],
        "revisedContent": "修改后的完整内容",
        "confidence": 0.85
      }
    `;

    const response = await this.generateText(prompt, {
      temperature: 0.3, // 更低的温度以获得更确定的输出
      maxTokens: 3000
    });

    try {
      // 尝试解析JSON响应
      const result = JSON.parse(response);
      return {
        suggestions: result.suggestions || [],
        revisedContent: result.revisedContent || content,
        confidence: result.confidence || 0.7
      };
    } catch (error) {
      // 如果JSON解析失败，返回默认格式
      console.warn('AI response is not valid JSON, using fallback:', response);
      return {
        suggestions: ['AI建议：请根据要求完善内容'],
        revisedContent: content,
        confidence: 0.5
      };
    }
  }

  /**
   * 生成章节大纲
   */
  async generateChapterOutline(
    requirements: string,
    chapterCount: number = 5
  ): Promise<string[]> {
    const prompt = `
      根据以下需求描述，生成一个包含${chapterCount}个章节的方案设计大纲：

      需求：${requirements}

      请返回一个章节标题数组，格式为：
      ["章节1标题", "章节2标题", "章节3标题", ...]
    `;

    const response = await this.generateText(prompt);

    try {
      // 尝试解析为数组
      const outline = JSON.parse(response);
      if (Array.isArray(outline)) {
        return outline;
      }
    } catch (error) {
      // 如果解析失败，使用简单分割
      console.warn('Failed to parse chapter outline, using fallback');
    }

    // 备用方案：返回默认章节结构
    return [
      '项目概述',
      '需求分析', 
      '技术方案',
      '实施计划',
      '预算估算'
    ].slice(0, chapterCount);
  }

  /**
   * 检查AI服务是否可用
   */
  isAvailable(): boolean {
    return this.openai !== null;
  }

  /**
   * 模拟AI响应（用于测试或回退）
   */
  private getMockAIResponse(prompt: string): string {
    if (prompt.includes('修改建议')) {
      return JSON.stringify({
        suggestions: [
          '建议增加具体的数据支持',
          '优化段落结构，使其更清晰',
          '补充相关案例说明'
        ],
        revisedContent: '这是根据要求修改后的内容...',
        confidence: 0.8
      });
    }

    if (prompt.includes('大纲')) {
      return JSON.stringify([
        '项目概述',
        '需求分析',
        '技术方案',
        '实施计划',
        '预算估算'
      ]);
    }

    return 'AI服务响应（模拟模式）';
  }
}