import { DataSource, Repository } from 'typeorm';
import { ConsultationRequest } from './consultation-request.entity';
import { CreateConsultationRequestDto } from './consultation-request.schema';

export class SpamProtectionService {
  private repository: Repository<ConsultationRequest>;

  constructor(dataSource: DataSource) {
    this.repository = dataSource.getRepository(ConsultationRequest);
  }

  /**
   * 验证提交是否合法（反垃圾邮件和机器人验证）
   */
  async validateSubmission(
    requestData: CreateConsultationRequestDto,
    ipAddress: string
  ): Promise<boolean> {
    // 1. IP频率限制：同一IP24小时内最多提交5次
    const recentSubmissions = await this.getRecentSubmissionsByIP(ipAddress);
    if (recentSubmissions >= 5) {
      throw new Error('提交频率过高，请稍后再试');
    }

    // 2. 内容重复检测：检查相似的项目描述
    const similarRequests = await this.findSimilarRequests(requestData.projectDescription);
    if (similarRequests.length > 0) {
      throw new Error('检测到重复提交，请修改项目描述');
    }

    // 3. 机器人验证：如果提供了captcha token，进行验证
    if (requestData.captchaToken) {
      const isValid = await this.validateCaptcha(requestData.captchaToken);
      if (!isValid) {
        throw new Error('机器人验证失败');
      }
    }

    return true;
  }

  /**
   * 获取同一IP最近24小时的提交次数
   */
  private async getRecentSubmissionsByIP(ipAddress: string): Promise<number> {
    const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);

    const count = await this.repository
      .createQueryBuilder('request')
      .where('request.ipAddress = :ipAddress', { ipAddress })
      .andWhere('request.createdAt >= :twentyFourHoursAgo', { twentyFourHoursAgo })
      .getCount();

    return count;
  }

  /**
   * 查找相似的项目描述（防止重复提交）
   */
  private async findSimilarRequests(projectDescription: string): Promise<ConsultationRequest[]> {
    // 简单的相似度检测：检查是否有完全相同的描述
    const similarRequests = await this.repository
      .createQueryBuilder('request')
      .where('request.projectDescription = :projectDescription', { projectDescription })
      .andWhere('request.createdAt >= :oneHourAgo', {
        oneHourAgo: new Date(Date.now() - 60 * 60 * 1000)
      })
      .getMany();

    return similarRequests;
  }

  /**
   * 验证captcha token（基础实现，可根据需要集成reCAPTCHA等）
   */
  private async validateCaptcha(token: string): Promise<boolean> {
    // 这里实现具体的验证逻辑
    // 目前返回true表示验证通过，实际项目中应集成真实的验证服务
    // 例如：reCAPTCHA、hCaptcha等

    // 简单的token验证（示例）
    if (!token || token.length < 10) {
      return false;
    }

    // 在实际项目中，这里应该调用验证服务的API
    // const isValid = await fetch('https://recaptcha.google.com/verify', {
    //   method: 'POST',
    //   body: JSON.stringify({ token, secret: process.env.RECAPTCHA_SECRET })
    // }).then(res => res.json()).then(data => data.success);

    return true; // 暂时返回true，实际项目中需要真实验证
  }
}