import { HttpStatus } from '@nestjs/common';
import { BusinessException } from '@common/exceptions/business.exception';

// ==================== 对话相关异常 ====================

/**
 * 对话不存在异常
 */
export class ConversationNotFoundException extends BusinessException {
  constructor(conversationId?: string) {
    super(
      conversationId ? `对话 ${conversationId} 不存在` : '对话不存在',
      'CONVERSATION_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

/**
 * 无权访问对话异常
 */
export class ConversationAccessDeniedException extends BusinessException {
  constructor() {
    super('无权访问该对话', 'CONVERSATION_ACCESS_DENIED', HttpStatus.FORBIDDEN);
  }
}

/**
 * 对话已关闭异常
 */
export class ConversationClosedException extends BusinessException {
  constructor() {
    super(
      '对话已关闭，无法发送消息',
      'CONVERSATION_CLOSED',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 消息过长异常
 */
export class MessageTooLongException extends BusinessException {
  constructor(maxLength: number = 4000) {
    super(
      `消息内容超过限制 (最大 ${maxLength} 字符)`,
      'MESSAGE_TOO_LONG',
      HttpStatus.BAD_REQUEST,
      { maxLength },
    );
  }
}

/**
 * 消息不存在异常
 */
export class MessageNotFoundException extends BusinessException {
  constructor(messageId?: string) {
    super(
      messageId ? `消息 ${messageId} 不存在` : '消息不存在',
      'MESSAGE_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

// ==================== 反馈相关异常 ====================

/**
 * 反馈已存在异常
 */
export class FeedbackExistsException extends BusinessException {
  constructor() {
    super(
      '已对该消息提交过反馈',
      'FEEDBACK_EXISTS',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 反馈不存在异常
 */
export class FeedbackNotFoundException extends BusinessException {
  constructor(feedbackId?: string) {
    super(
      feedbackId ? `反馈 ${feedbackId} 不存在` : '反馈不存在',
      'FEEDBACK_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

// ==================== 工单相关异常 ====================

/**
 * AI 工单不存在异常
 */
export class AITicketNotFoundException extends BusinessException {
  constructor(ticketId?: string) {
    super(
      ticketId ? `工单 ${ticketId} 不存在` : '工单不存在',
      'TICKET_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

/**
 * 无权访问工单异常
 */
export class AITicketAccessDeniedException extends BusinessException {
  constructor() {
    super('无权访问该工单', 'TICKET_ACCESS_DENIED', HttpStatus.FORBIDDEN);
  }
}

/**
 * 工单升级未确认异常
 */
export class TicketNotConfirmedException extends BusinessException {
  constructor() {
    super(
      '工单升级需要确认',
      'TICKET_NOT_CONFIRMED',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 工单已解决异常
 */
export class TicketAlreadyResolvedException extends BusinessException {
  constructor() {
    super('工单已解决', 'TICKET_ALREADY_RESOLVED', HttpStatus.BAD_REQUEST);
  }
}

// ==================== 知识补充相关异常 ====================

/**
 * 知识纠正已存在异常
 */
export class KnowledgeFixExistsException extends BusinessException {
  constructor() {
    super(
      '已对该消息提交过纠正',
      'KNOWLEDGE_FIX_EXISTS',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 知识纠正不存在异常
 */
export class KnowledgeFixNotFoundException extends BusinessException {
  constructor(id?: string) {
    super(
      id ? `知识纠正 ${id} 不存在` : '知识纠正不存在',
      'KNOWLEDGE_FIX_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

// ==================== Prompt 模板相关异常 ====================

/**
 * Prompt 模板不存在异常
 */
export class PromptTemplateNotFoundException extends BusinessException {
  constructor(id?: string) {
    super(
      id ? `Prompt 模板 ${id} 不存在` : 'Prompt 模板不存在',
      'PROMPT_TEMPLATE_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

// ==================== 安全相关异常 ====================

/**
 * PII 检测异常（警告级别，非错误）
 */
export class PIIDetectedException extends BusinessException {
  constructor(detectedTypes: string[]) {
    super(
      '检测到敏感信息，已自动脱敏',
      'PII_DETECTED',
      HttpStatus.OK,  // 200 状态码，仅警告
      { detectedTypes, sanitized: true },
    );
  }
}

/**
 * Prompt 注入检测异常
 */
export class PromptInjectionDetectedException extends BusinessException {
  constructor() {
    super(
      '检测到潜在的安全风险，请重新输入您的问题',
      'PROMPT_INJECTION_DETECTED',
      HttpStatus.BAD_REQUEST,
    );
  }
}

// ==================== LLM 服务相关异常 ====================

/**
 * LLM 服务错误异常
 */
export class LLMServiceException extends BusinessException {
  constructor(reason?: string) {
    super(
      reason || '大模型服务暂时不可用，请稍后重试',
      'LLM_SERVICE_ERROR',
      HttpStatus.SERVICE_UNAVAILABLE,
    );
  }
}

/**
 * LLM 请求频率超限异常
 */
export class LLMRateLimitException extends BusinessException {
  constructor() {
    super(
      '请求过于频繁，请稍后重试',
      'LLM_RATE_LIMIT',
      HttpStatus.TOO_MANY_REQUESTS,
    );
  }
}
