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

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

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

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

/**
 * 工单状态变更无效异常
 */
export class TicketInvalidStatusTransitionException extends BusinessException {
  constructor(from: string, to: string) {
    super(
      `不能从 ${from} 状态变更为 ${to} 状态`,
      'TICKET_INVALID_STATUS_TRANSITION',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 工单已分配异常
 */
export class TicketAlreadyAssignedException extends BusinessException {
  constructor() {
    super('工单已被分配', 'TICKET_ALREADY_ASSIGNED', HttpStatus.BAD_REQUEST);
  }
}

/**
 * 工单未分配异常
 */
export class TicketNotAssignedException extends BusinessException {
  constructor() {
    super('工单尚未分配', 'TICKET_NOT_ASSIGNED', HttpStatus.BAD_REQUEST);
  }
}

/**
 * 工单重新打开超时异常
 */
export class TicketReopenExpiredException extends BusinessException {
  constructor() {
    super(
      '工单重新打开已超过时限',
      'TICKET_REOPEN_EXPIRED',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 附件数量超限异常
 */
export class TicketAttachmentLimitExceededException extends BusinessException {
  constructor(limit: number = 10) {
    super(
      `附件数量不能超过 ${limit} 个`,
      'TICKET_ATTACHMENT_LIMIT_EXCEEDED',
      HttpStatus.BAD_REQUEST,
      { limit },
    );
  }
}

/**
 * 附件大小超限异常
 */
export class TicketAttachmentSizeExceededException extends BusinessException {
  constructor(maxSize: string = '10MB') {
    super(
      `附件大小不能超过 ${maxSize}`,
      'TICKET_ATTACHMENT_SIZE_EXCEEDED',
      HttpStatus.BAD_REQUEST,
      { maxSize },
    );
  }
}

/**
 * 附件类型不支持异常
 */
export class TicketAttachmentTypeInvalidException extends BusinessException {
  constructor(allowedTypes?: string[]) {
    super(
      allowedTypes
        ? `不支持的附件类型，允许的类型: ${allowedTypes.join(', ')}`
        : '不支持的附件类型',
      'TICKET_ATTACHMENT_TYPE_INVALID',
      HttpStatus.BAD_REQUEST,
      { allowedTypes },
    );
  }
}

// ==================== 分类相关异常 ====================

/**
 * 分类不存在异常
 */
export class TicketCategoryNotFoundException extends BusinessException {
  constructor(categoryId?: string) {
    super(
      categoryId ? `分类 ${categoryId} 不存在` : '分类不存在',
      'TICKET_CATEGORY_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

/**
 * 分类已停用异常
 */
export class TicketCategoryInactiveException extends BusinessException {
  constructor() {
    super('分类已停用', 'TICKET_CATEGORY_INACTIVE', HttpStatus.BAD_REQUEST);
  }
}

/**
 * 分类编码已存在异常
 */
export class TicketCategoryCodeExistsException extends BusinessException {
  constructor(code: string) {
    super(
      `分类编码 ${code} 已存在`,
      'TICKET_CATEGORY_CODE_EXISTS',
      HttpStatus.CONFLICT,
    );
  }
}

/**
 * 分类存在子分类，无法删除异常
 */
export class TicketCategoryHasChildrenException extends BusinessException {
  constructor() {
    super(
      '分类存在子分类，无法删除',
      'TICKET_CATEGORY_HAS_CHILDREN',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 分类下存在工单，无法删除异常
 */
export class TicketCategoryHasTicketsException extends BusinessException {
  constructor() {
    super(
      '分类下存在工单，无法删除',
      'TICKET_CATEGORY_HAS_TICKETS',
      HttpStatus.BAD_REQUEST,
    );
  }
}

// ==================== 处理组相关异常 ====================

/**
 * 处理组不存在异常
 */
export class TicketGroupNotFoundException extends BusinessException {
  constructor(groupId?: string) {
    super(
      groupId ? `处理组 ${groupId} 不存在` : '处理组不存在',
      'TICKET_GROUP_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

/**
 * 处理组编码已存在异常
 */
export class TicketGroupCodeExistsException extends BusinessException {
  constructor(code: string) {
    super(
      `处理组编码 ${code} 已存在`,
      'TICKET_GROUP_CODE_EXISTS',
      HttpStatus.CONFLICT,
    );
  }
}

/**
 * 处理组无可用成员异常
 */
export class TicketGroupNoAvailableMemberException extends BusinessException {
  constructor() {
    super(
      '处理组暂无可用成员',
      'TICKET_GROUP_NO_AVAILABLE_MEMBER',
      HttpStatus.BAD_REQUEST,
    );
  }
}

// ==================== 评论相关异常 ====================

/**
 * 评论不存在异常
 */
export class TicketCommentNotFoundException extends BusinessException {
  constructor(commentId?: string) {
    super(
      commentId ? `评论 ${commentId} 不存在` : '评论不存在',
      'TICKET_COMMENT_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

/**
 * 评论删除超时异常
 */
export class TicketCommentDeleteExpiredException extends BusinessException {
  constructor() {
    super(
      '评论删除已超过时限',
      'TICKET_COMMENT_DELETE_EXPIRED',
      HttpStatus.BAD_REQUEST,
    );
  }
}

// ==================== SLA 相关异常 ====================

/**
 * SLA 配置不存在异常
 */
export class TicketSLANotFoundException extends BusinessException {
  constructor(slaId?: string) {
    super(
      slaId ? `SLA 配置 ${slaId} 不存在` : 'SLA 配置不存在',
      'TICKET_SLA_NOT_FOUND',
      HttpStatus.NOT_FOUND,
    );
  }
}

/**
 * SLA 正在使用中，无法删除异常
 */
export class TicketSLAInUseException extends BusinessException {
  constructor() {
    super(
      'SLA 正在使用中，无法删除',
      'TICKET_SLA_IN_USE',
      HttpStatus.BAD_REQUEST,
    );
  }
}

// ==================== 满意度相关异常 ====================

/**
 * 工单尚未解决，无法评价异常
 */
export class TicketNotResolvedForRatingException extends BusinessException {
  constructor() {
    super(
      '工单尚未解决，无法评价',
      'TICKET_NOT_RESOLVED_FOR_RATING',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 已提交过满意度评价异常
 */
export class TicketAlreadyRatedException extends BusinessException {
  constructor() {
    super(
      '您已提交过满意度评价',
      'TICKET_ALREADY_RATED',
      HttpStatus.BAD_REQUEST,
    );
  }
}

/**
 * 非工单创建人，无法评价异常
 */
export class TicketRatingNotCreatorException extends BusinessException {
  constructor() {
    super(
      '仅工单创建人可以提交满意度评价',
      'TICKET_RATING_NOT_CREATOR',
      HttpStatus.FORBIDDEN,
    );
  }
}
