import { ReportTree } from './report';
import { CptModelName, SubModelName, ActionType } from './base';

// 环节类型
export enum SectorType {
  APPROVAL = 'approval', // 审批
  CONDITION = 'condition', // 条件
}

export enum ProcessStatus {
  WAITING = 'waiting', // 待审批
  APPROVED = 'approved', // 审批通过
  ACTIVATING = 'activating', // 当前流程
  FAILED = 'failed', //  审批退回
}

// 审批方式
export enum ApprovalWay {
  REPORT = 'report', // 上报审批
  ACCOUNT = 'account', // 指定用户
  JOINTLYSIGN = 'jointlySign', // 会签
  ORSIGN = 'orSign', // 或签
  ORDERAPPROVAL = 'orderApproval', // 依次审批
  PREACCOUNT = 'prevAccount', // 上一审批人设置
}

// 角色权限
export enum RolePermission {
  MY_REPORT = 'report', // 我的项目-项目上报
  MY_FREE_REPORT = 'freeReport', // 我的项目-指定审批人
  MY_ADD_PROJECT = 'addProject', // 我的项目-新建项目
  MY_EDIT_PROJECT = 'editProject', // 我的项目-编辑项目
  MY_EXPORT_PROJECT = 'exportProject', // 我的项目-导出项目
  MY_DEL_PROJECT = 'delProject', // 我的项目-删除项目
  MY_VIEW_PROJECT = 'viewProject', // 我的项目-查看项目
  MY_VIEW_APPROVAL = 'viewApproval', // 我的项目-审批进度
  JOIN_VIEW_PARTICIPATING_PROJECT = 'viewParticipatingProject', // 我参与的项目-查看项目
  JOIN_SAVE_INDEX = 'saveIndex', // 我参与的项目-指标入库
  JOIN_EXPORT_PARTICIPATING_PROJECT = 'exportParticipatingProject', // 我参与的项目-导出项目
  ALL_SET_PROJECT = 'setProjects', // 全部项目-项目设置
  ALL_VIEW_ALL_PROJECTS = 'viewAllProjects', // 全部项目-查看项目
  ALL_SAVE_INDEX = 'saveIndexAll', // 全部项目-指标入库
  // TODO 指标库 区间对数
}

// 系统角色
export enum RoleType {
  SYSTEM = 'system',
  SYSTEM_NORMAL = 'systemNormal',
  NORMAL = 'normal',
}

// 角色
export interface IRole {
  ID: string;
  name: string;
  roleType: RoleType;
  frontPermission: RolePermission[];
}

// 参与者模式
export enum ParticipantMode {
  ACCOUNT = 'account', // 用户模式
  ROLE = 'role', // 角色模式（未来）
}

export enum AccountConfigure {
  SKIP = 'skip', // 允许跳过
  RETURN = 'return', // 允许退回
  REVOKE = 'revoke', // 允许撤回
  ASSISTAUDIT = 'assistAudit', // 协审
  ADDSIGN = 'addSign', // 加签
  NEXTSECTOR = 'nextSector', // 是否可添加环节
}

export interface ICoreView {
  ID: string; // 用户ID
  projectIDs: string[]; // 充许协审的单位工程ID，为空数组时表示可以协审当前环节的所有项目
}

export interface IProcessAccount {
  // ID 账号ID name 名称institutionID 企事业ID
  ID: string;
  name: string; // 曾用名，不会变动
  institutionID?: string; // 单位ID（可能不会用到）
  institutionName?: string; // 单位名称（不要保存到数据库，而是在使用的时候通过ID去查）
  status: ProcessStatus; // 审批状态
  alreadyAddProcess?: boolean; // 是否已经添加了新环节（暂时用的，用于标记是否添加了环节，以后可能删除）
  configure: AccountConfigure[]; // 权限配置
  remark: string; // 审批意见(肯定有，会有默认值)
  coreViews: ICoreView[]; // 协审人信息
  projectIDs: string[]; // 允许审批的单位工程ID，为空数组时表示可以审批当前环节的所有项目
}

// 参与者信息
export interface IParticipantInfo {
  approvalWay: ApprovalWay;
  participantMode: ParticipantMode;
  accounts: IProcessAccount[];
}

// 流程中的一个环节
export interface IProcess {
  ID: string;
  name: string;
  sectorType: SectorType;
  seq?: number;
  createdByProcess?: string; // 上环节ID， 表示哪个环节创建的(上环节添加的)
  time?: number; // 当前环节完成时间（仅当审批通过或审批退回时会有时间）
  participantInfo: IParticipantInfo;
  afterAuditMoney?: number; // 审后的金额
}

export interface IApproval {
  ID: string;
  name: string;
  createdID: string;
  createdTime: number;
  process: IProcess[];
}

export enum ApprovalStatus {
  CREATED = 'created', // 创建完成
  PROCESSING = 'processing', // 正在审批
  APPROVED = 'approved', // 审批通过
}

export interface IProcessAuditMoney {
  processID: string;
  data: any[];
}

// 复制到项目里的流程
export interface IProjectApproval extends IApproval {
  financialProjectID: string; // 财审项目ID
  constructionID: string; // 建设项目ID
  projectIDs: string[]; // 包含在流程里的项目（单位工程）
  status: ApprovalStatus; // 状态
  approvalTime?: number; // 审批通过时间
  currentProcessID?: string; // 当前正处于哪个环节ID
}

// 流程过程中存储的数据
export interface IProcessData {
  ID: string;
  module: CptModelName | SubModelName; // 编辑的模块
  action: ActionType; // 动作,增删改等
  oDoc: any; // 存放删除时或者修改时的数据
  createTime: number; // 创建时间
}

// 备份数据集合
export interface IProcessDataDoc {
  projectID: string;
  processID: string;
  index: number;
  processData: IProcessData[];
}

// 环节状态(精简)
export enum SimpleProcessStatus {
  APPROVED = 'approved', // 审批通过
  FAILED = 'failed', // 失败
  REPORTED = 'reported', // 上报
}

// 审批待办类型
export enum ApprovalType {
  APPROVER = 'approver', // 审批
  COREVIEW = 'coreview', // 协审
  REPORT = 'report', // 上报
}

// 流程环节待办列表项
export interface IApprovalTodoData {
  approvalID: string; // 流程 id
  processID: string; // 环节 id
  financialProjectID: string; // 项目 ID
  constructionID: string; // 建设项目 ID
  projectName?: string; // 项目名称
  reporterID?: string; // 发起人ID
  reporterName?: string; // 发起人名称
  lastID?: string; // 上环节ID（暂定为上环节用户ID，之后可能为上环节ID）
  lastName?: string; // 上环节名称（暂定为上环节用户名称，之后可能为上环节名称）
  reportTime?: number; // 上报时间
  lastStatus?: SimpleProcessStatus; // 上一环节的状态
  approveTime?: number; // 当前环节审批时间
  approveType?: SimpleProcessStatus; // 审批办结状态
  moveUserID?: string; // 环节流转（用户ID）
  moveUserName?: string; // 环节流转（用户名）
  approvalStatus?: ApprovalStatus; // 审批流程的状态
  type: ApprovalType; // 审批待办类型
}

export interface IApprovalTodoData2 {
  approvalID: string; // 流程 id
  processID: string; // 环节 id
  financialProjectID: string; // 项目 ID
  constructionID: string; // 建设项目 ID
  projectName?: string; // 项目名称
  // reporterID: string; // 发起人ID  （删）
  // reporterName: string; // 发起人名称（删）
  lastID?: string; // 为上环节用户ID
  lastName?: string; // 上环节用户名称
  // reportTime: number; // 上报时间（删）
  lastStatus?: SimpleProcessStatus; // 上环节办结状态
  // approveTime: number; // 审批办结时间（删）
  approveType?: SimpleProcessStatus; // 审批办结状态
  // approvalStatus: ApprovalStatus; // 审批流程的状态（删）
  moveUserID?: string; // 环节流转（用户ID）
  moveUserName?: string; // 环节流转（用户名）
  type: ApprovalType; // 审批待办类型
}

export enum TodoType {
  APPROVAL = 'approval',
}

export enum TodoStatus {
  REMAIN = 'remain',
  COMPLETED = 'completed',
}

export interface ITodo {
  ID: string; // 待办 ID
  userID: string; // 用户 ID
  createdTime: number; // 创建时间（相当于环节流转时间）
  completedTime: number; // 完成时间（相当于审批办结时间）
  todoType: TodoType;
  data: any;
  status: TodoStatus;
}

export interface IApprovalTodo extends ITodo {
  data: IApprovalTodoData;
}

export enum ChangeRecord {
  CURRENT = 'current', // 当前清单
  ALLBILLS = 'all-bills', // 全部清单
  ALLGLJS = 'all-gljs', // 全部材价
}
