/**
 * 工单系统类型定义
 * 
 * 这些类型用于服务层和控制器层的数据传递
 * 与 Prisma 生成的类型配合使用
 */

import {
  TicketStatus,
  TicketPriority,
  TicketSource,
  CommentType,
  VisibilityScope,
} from '../dto';

// ==================== 工单实体 ====================

export interface TicketEntity {
  id: string;
  ticketNo: string;
  title: string;
  description: string;
  categoryId: string;
  priority: TicketPriority;
  tags: string[];
  status: TicketStatus;
  creatorId: string;
  assigneeId: string | null;
  assigneeGroupId: string | null;
  watcherIds: string[];
  createdAt: Date;
  updatedAt: Date;
  firstResponseAt: Date | null;
  resolvedAt: Date | null;
  closedAt: Date | null;
  dueAt: Date | null;
  slaId: string | null;
  slaBreached: boolean;
  slaPausedAt: Date | null;
  slaPausedDuration: number;
  satisfactionRating: number | null;
  satisfactionComment: string | null;
  satisfactionRatedAt: Date | null;
  source: TicketSource;
  externalId: string | null;
  channelMetadata: Record<string, any> | null;
  resolution: string | null;
  rootCause: string | null;
  relatedTicketIds: string[];
  parentTicketId: string | null;
  approvalInstanceId: string | null;
  region: string;
  tenantId: string | null;
  language: string | null;
  complianceFlag: boolean;
  deletedAt: Date | null;
}

// ==================== 工单详情响应 ====================

export interface TicketDetailResponse {
  id: string;
  ticketNo: string;
  title: string;
  description: string;
  category: {
    id: string;
    name: string;
    code: string;
  };
  priority: TicketPriority;
  status: TicketStatus;
  creator: {
    id: string;
    name: string;
    email: string;
    department?: string;
  };
  assignee: {
    id: string;
    name: string;
    email: string;
  } | null;
  assigneeGroup: {
    id: string;
    name: string;
  } | null;
  watchers: Array<{
    id: string;
    name: string;
  }>;
  tags: string[];
  source: TicketSource;
  channelMetadata: Record<string, any> | null;
  language: string | null;
  region: string;
  tenantId: string | null;
  resolution: string | null;
  rootCause: string | null;
  sla: {
    id: string;
    name: string;
    firstResponseDue: Date | null;
    resolutionDue: Date | null;
    firstResponseAt: Date | null;
    isBreached: boolean;
    isPaused: boolean;
  } | null;
  createdAt: Date;
  updatedAt: Date;
  firstResponseAt: Date | null;
  resolvedAt: Date | null;
  closedAt: Date | null;
  attachments: AttachmentResponse[];
}

// ==================== 工单列表项响应 ====================

export interface TicketListItemResponse {
  id: string;
  ticketNo: string;
  title: string;
  priority: TicketPriority;
  status: TicketStatus;
  category: {
    id: string;
    name: string;
    code: string;
  };
  creator: {
    id: string;
    name: string;
  };
  assignee: {
    id: string;
    name: string;
  } | null;
  createdAt: Date;
  updatedAt: Date;
  dueAt: Date | null;
  slaBreached: boolean;
}

// ==================== 分页响应 ====================

export interface PaginatedResponse<T> {
  items: T[];
  total: number;
  page: number;
  limit: number;
  totalPages: number;
  hasNext: boolean;
  hasPrev: boolean;
}

// ==================== 附件响应 ====================

export interface AttachmentResponse {
  id: string;
  fileName: string;
  fileUrl: string;
  fileSize: number;
  mimeType: string;
  uploadedBy: string;
  createdAt: Date;
}

// ==================== 评论响应 ====================

export interface CommentResponse {
  id: string;
  content: string;
  type: CommentType;
  isInternal: boolean;
  visibilityScope: VisibilityScope;
  author: {
    id: string;
    name: string;
  };
  attachments: AttachmentResponse[];
  mentionedUsers: Array<{
    id: string;
    name: string;
  }>;
  createdAt: Date;
}

// ==================== 活动日志响应 ====================

export interface ActivityResponse {
  id: string;
  type: string;
  content: Record<string, any>;
  operator: {
    id: string;
    name: string;
  } | null; // null 表示系统自动操作
  createdAt: Date;
}

// ==================== 状态流转规则 ====================

export const STATUS_TRANSITIONS: Record<TicketStatus, TicketStatus[]> = {
  [TicketStatus.OPEN]: [
    TicketStatus.ASSIGNED,
    TicketStatus.IN_PROGRESS,
    TicketStatus.CANCELLED,
  ],
  [TicketStatus.ASSIGNED]: [
    TicketStatus.IN_PROGRESS,
    TicketStatus.PENDING,
    TicketStatus.RESOLVED,
    TicketStatus.CANCELLED,
  ],
  [TicketStatus.IN_PROGRESS]: [
    TicketStatus.PENDING,
    TicketStatus.RESOLVED,
    TicketStatus.CANCELLED,
  ],
  [TicketStatus.PENDING]: [
    TicketStatus.IN_PROGRESS,
    TicketStatus.RESOLVED,
    TicketStatus.CANCELLED,
  ],
  [TicketStatus.RESOLVED]: [
    TicketStatus.CLOSED,
    TicketStatus.IN_PROGRESS, // 重新打开
  ],
  [TicketStatus.CLOSED]: [
    TicketStatus.OPEN, // 重新打开（有时间限制）
  ],
  [TicketStatus.CANCELLED]: [],
};

/**
 * 检查状态转换是否合法
 */
export function isValidStatusTransition(
  from: TicketStatus,
  to: TicketStatus,
): boolean {
  const allowedTransitions = STATUS_TRANSITIONS[from];
  return allowedTransitions?.includes(to) ?? false;
}
