export interface MiniAppointmentPageResult<T> {
  records: T[]
  page: number
  size: number
  total: number
  pages: number
}

export interface MiniAppointmentVehicleItemRequest {
  plateNo: string
  driverVisitorId: number
}

export interface MiniAppointmentCreateRequest {
  visitedUserId: number
  visitReasonCode: string
  visitReasonOther?: string
  visitTimeMode: 'SINGLE' | 'MULTI'
  visitDate?: string
  visitTimeSlot?: 'ALL_DAY' | 'AM' | 'PM'
  visitStartDate?: string
  visitEndDate?: string
  personEntry: boolean
  visitorIds: number[]
  vehicleEntry: boolean
  vehicles?: MiniAppointmentVehicleItemRequest[]
}

export interface MiniAppointmentCreateResult {
  id: number
  uuid: string
}

export interface MiniMyVisitorCodeTicketItem {
  ticketId: number
  ticketUuid: string
  mpVisitorId?: number | null
  visitorName: string
  payload: string
  generateTime?: string | null
  expireTime?: string | null
}

export interface MiniMyVisitorCodeOrderItem {
  orderId: number
  orderUuid: string
  visitedUserDisplay: string
  accessAreaText?: string | null
  visitTimeText: string
  validStartTime?: string | null
  validEndTime?: string | null
  qrCodes: MiniMyVisitorCodeTicketItem[]
}

export interface MiniSharedAppointmentDetailItem {
  orderId: number
  orderUuid: string
  visitedUserDisplay: string
  accessAreaText?: string | null
  visitTimeText: string
}

export interface MiniApprovalDetailVisitorItem {
  visitorId: number
  name: string
  gender?: string | null
  idCardMasked?: string | null
  mobileMasked?: string | null
  companyName?: string | null
  plateNo?: string | null
}

export interface ApprovalFlowTaskUserItem {
  taskId: number
  userId: number
  userName: string
  avatarUrl?: string | null
  taskStatus: string
  comment?: string | null
  actionTime?: string | null
  noticeUsers?: Array<{ id: number, realName: string, deptName?: string | null }>
}

export interface ApprovalFlowGroupItem {
  groupKey: string
  groupType: string
  groupName: string
  groupStatus: string
  users: ApprovalFlowTaskUserItem[]
}

export interface ApprovalFlowNodeItem {
  nodeCode: string
  nodeName: string
  nodeStatus: string
  groups: ApprovalFlowGroupItem[]
}

export interface MiniAppointmentListItem {
  id: number
  uuid: string
  orderNo: string
  status: string
  displayStatus: 'PENDING_VISIT' | 'EFFECTIVE' | 'INVALID' | string
  visitedUserName: string
  visitedDeptName?: string | null
  visitedUserDisplay: string
  visitStartDate?: string | null
  visitEndDate?: string | null
  visitTimeText: string
  visitReasonCode: string
  visitReasonText: string
  visitReasonOther?: string | null
  visitorDisplayText?: string | null
  plateNoText?: string | null
  accessAreaText?: string | null
  createTime: string
}

export interface MiniMyAppointmentDetailItem {
  orderId: number
  orderUuid: string
  orderNo: string
  status: string
  displayStatus: 'PENDING_VISIT' | 'EFFECTIVE' | 'INVALID' | string
  statusText: string
  cancelable: boolean
  deletable: boolean
  visitedUserId: number
  visitedUserName: string
  visitedDeptName?: string | null
  visitedUserDisplay: string
  accessAreaText?: string | null
  visitTypeText: string
  visitReasonText: string
  visitReasonCode: string
  visitReasonOther?: string | null
  visitTimeText: string
  visitTimeMode?: 'SINGLE' | 'MULTI' | string | null
  visitTimeSlot?: 'ALL_DAY' | 'AM' | 'PM' | string | null
  visitStartDate?: string | null
  visitEndDate?: string | null
  personEntry: boolean
  vehicleEntry: boolean
  createTime: string
  visitors: MiniApprovalDetailVisitorItem[]
  rebookVisitors: MiniMyAppointmentDetailRebookVisitorItem[]
  rebookVehicles: MiniMyAppointmentDetailRebookVehicleItem[]
  flowTree: ApprovalFlowNodeItem[]
}

export interface MiniMyAppointmentDetailRebookVisitorItem {
  visitorId: number
  visitorUuid?: string | null
  name: string
  gender?: string | null
  companyName?: string | null
  mobileMasked?: string | null
  idCardMasked?: string | null
}

export interface MiniMyAppointmentDetailRebookVehicleItem {
  plateNo?: string | null
  driverVisitorId?: number | null
  driverName?: string | null
}

export interface MiniApprovalTodoItem {
  taskId: number
  taskUuid: string
  orderId: number
  orderUuid: string
  orderNo: string
  nodeCode: string
  nodeName: string
  visitedUserName: string
  visitorDisplayText?: string | null
  plateNoText?: string | null
  visitStartDate?: string | null
  visitEndDate?: string | null
  visitReasonCode: string
  visitReasonText?: string | null
  visitTimeText?: string | null
  createTime: string
}

export interface MiniApprovalAllItem {
  taskId?: number | null
  taskUuid?: string | null
  orderId: number
  orderUuid: string
  orderNo: string
  status: 'PENDING' | 'APPROVED' | 'REJECTED' | 'CANCELLED' | 'OTHER' | string
  statusText?: string | null
  nodeText?: string | null
  visitorDisplayText?: string | null
  plateNoText?: string | null
  visitTimeText?: string | null
  visitReasonCode?: string | null
  visitReasonText?: string | null
  createTime: string
}

export interface MiniApprovalDetailItem {
  pageMode: 'HANDLER_PENDING' | 'GENERAL_PENDING' | 'GENERAL_READONLY'
  canApprove: boolean
  taskId?: number | null
  taskUuid?: string | null
  orderId: number
  orderUuid: string
  orderNo: string
  submitterName?: string | null
  submitTime?: string | null
  taskStatus?: string | null
  approvalStatusText: string
  nodeCode?: string | null
  nodeName?: string | null
  visitedUserId: number
  visitedUserName: string
  visitedDeptName?: string | null
  accessAreaText?: string | null
  visitTypeText: string
  visitReasonText: string
  visitTimeText: string
  passAccessAreaIds: number[]
  passAccessAreaNames: string[]
  involveOtherLocalUnit?: boolean | null
  localUnits: Array<{ id: number, unitName: string }>
  noticeUsers: Array<{ id: number, realName: string, deptName?: string | null }>
  visitors: MiniApprovalDetailVisitorItem[]
  flowTree: ApprovalFlowNodeItem[]
}

export interface MiniVisitRecordItem {
  orderId: number
  orderNo: string
  visitorNames: string[]
  visitorDisplayText?: string | null
  plateNoText?: string | null
  visitReasonText?: string | null
  visitStartDate?: string | null
  visitEndDate?: string | null
  visitTimeMode?: string | null
  visitTimeSlot?: string | null
  createTime: string
}
