import { GljType, IComponent } from './glj';
import { FileType, ProjectType } from './project';
import { IElfItem } from './billGuide';
import { BRType, IBRBase, IFees, INumFileRef, ITreeScm } from './base';
import { ICalcItem } from './calculation';

// 清单固定类别
export enum FixedFlag {
  // 分部分项工程
  SUB_ENGINERRING = 1,
  // 措施项目
  MEASURE = 2,
  // 施工技术措施项目
  CONSTRUCTION_TECH = 3,
  // 安全文明施工按实计算费用
  SAFETY_CONSTRUCTION_ACTUAL = 4,
  // 施工组织措施专项费用
  CONSTRUCTION_ORGANIZATION = 5,
  // 安全文明施工专项费用
  SAFETY_CONSTRUCTION = 6,
  // 其他项目
  OTHER = 7,
  // 暂列金额
  PROVISIONAL = 8,
  // 暂估价
  ESTIMATE = 9,
  // 材料（工程设备）暂估价
  MATERIAL_PROVISIONAL = 10,
  // 专业工程暂估价
  ENGINEERING_ESITIMATE = 11,
  // 计日工
  DAYWORK = 12,
  // 总承包服务费
  TURN_KEY_CONTRACT = 13,
  // 索赔与现场签证
  CLAIM_VISA = 14,
  // 规费
  CHARGE = 15,
  // 社会保险费及住房公积金 Social insurance fee and housing accumulation fund
  SOCIAL_INSURANCE_HOUSING_FUND = 16,
  // 工程排污费 charges for disposing pollutants
  POLLUTANTS = 17,
  // 税金
  TAX = 18,
  // 工程造价
  ENGINEERINGCOST = 19,
  // 增值税
  ADDED_VALUE_TAX = 20,
  // 专项技术措施暂估价
  SPECIAL_TECH_PROVISIONAL = 21,
  // 专业发包工程管理费
  LET_CONTRACT_MANAGEMENT = 22,
  // 人工
  LABOUR = 23,
  // 材料
  MATERIAL = 24,
  // 施工机械
  MACHINE = 25,
  // 索赔
  CLAIM = 26,
  // 现场签证
  VISA = 27,
  // 附加税
  ADDITIONAL_TAX = 28,
  // 环境保护税
  ENVIRONMENTAL_PROTECTION_TAX = 29,
  // 建设工程竣工档案编制费
  PROJECT_COMPLETE_ARCH_FEE = 30,
  // 住宅工程质量分户验收费
  HOUSE_QUALITY_ACCEPT_FEE = 31,
  // 组织措施费
  ORGANIZATION = 32,
  // 其他措施费
  OTHER_MEASURE_FEE = 33,
  // 绿色施工安全防护措施费
  GREEN_MEASURE_FEE = 34,
  // 预算包干费
  BUDGET_INCLUDE_WORK_FEE = 35,
  // 工程优质费
  PROJECT_HIGH_QUALITY_FEE = 36,
  // 概算幅度差
  BUDGET_ESTIMATE_DIFF = 37,
  // 其他费用（与其他项目不同，参考广东的用法）
  OTHER_FEE = 38,
}
export interface IJobContent {
  seq: number;
  content: string;
  isChecked: boolean;
}
export interface IEigenvalue {
  value: string;
  isSelected: boolean;
}
export interface IItemCharacter {
  seq: number;
  character: string;
  eigenvalueList: string[]; // 特征值下拉项（以前需要，现在暂时取消了下拉。保留以扩展）
  eigenvalue: string;
  isChecked: boolean;
}
// 书签
export interface IBookmark {
  ID: string;
  type: string;
  content: string;
  creatorName: string;
  creatorID: string;
  createTime: number;
  telNo: string;
  kind: BRType;
  institution?: string;
  procunit?: string;
  processID?: string;
}
// 修改书签
export interface ISetBookmark {
  ID: string;
  content: string;
}

// 价格区间
export interface IPriceScope {
  minUnitPrice: number;
  maxUnitPrice: number;
}

export enum IndexCalcType {
  STDEV = 1, // 均方差
  AVG = 2, // 平均值
}

export interface ICheckOptions {
  fileType: string | string[];
  year: string | string[];
  projLocation: string | string[];
  projectType: string;
  engineerType: string;
  classCode?: string;
  indexType?: string;
  constructionIndexTypes?: string[]; // 建设项目的工程分类，查询条件用
  firstSingleIndexTypes?: string[]; // 第一个单项工程的工程分类，查询用
  unit?: string;
  calcType?: IndexCalcType;
  type?: ProjectType; // 项目类型
  keyword?: string; // 区间来源中的输入搜索框
}

export interface IBill extends IBRBase {
  flag?: FixedFlag; // 清单固定类别
  recharge?: string; // 补注
  ruleText?: string; // 工程量计算规则
  jobContents?: IJobContent[]; // 工作内容
  jobContentText?: string;
  itemCharacters?: IItemCharacter[]; // 项目特征
  itemCharacterText?: string;
  elfItems?: IElfItem[]; // 选中的清单精灵选项
  formula?: string; // 基数计算
  formulaValue?: number; // 基数计算的值
  readjustFormulaValue?: number; // 调价基数计算的值
  isAdd?: boolean; // 是否用户新增的清单
  feeRateID?: string; // 费率ID
  feeRate?: number; // 费率值
  mainBills?: boolean; // 主要清单
  lockUnitPrice?: boolean; // 锁定单价
  maxPrice?: number; // 最高限价
  minPrice?: number; // 最低限价
  engContent?: string; // 工程内容
  serviceContent?: string; // 服务内容
  claimVisa?: string; // 签证及索赔依据
  checkFormResult?: string; // 形式检测结果
  checkMaterialResult?: string; // 材料检测结果
  checkPriceDiffResult?: string; // 材价差检测结果
  priceScope?: IPriceScope; // 价格区间
  classCode?: string; // 类别别名，清单经过机器检测后会加上
  groupCode?: string; // 类别组，当机器检测结果不正确时，纠正措施
  checkRationResult?: string; // 机器检测结果(必套、选套、错套定额相关)
  checked?: boolean; // 是否已经进行清单检测过的清单，为true表式已经检测过了（用来计算通过率）
  billFormChecked?: boolean; // 是否已经进行清单形式检测
  priceFormChecked?: boolean; // 是否已经进行清单形式检测
  checkOptions?: ICheckOptions; // 清单检测时保存的筛选条件
  setParentQuantity?: boolean; // 是否打勾了填父量
  [key: string]: any; // 剩下的之后补充
}

export interface IBills {
  projectID: string; // 项目ID
  bills: IBill[];
}

export interface IStdJobContent {
  id: number;
  code: number;
  content: string;
  billsLibId: number;
  deleted: boolean;
}

export interface IStdItemCharacter {
  id: number;
  code: number;
  content: string;
  itemValue: any;
  billsLibId: number;
  deleted: boolean;
}

export interface IJobOrItem {
  id: string;
  serialNo: number;
}

// 标准清单原始数据
export interface IStdBillResult {
  ID: string;
  ParentID: string;
  NextSiblingID: string;
  code: string;
  name: string;
  unit: string;
  ruleText: string;
  engineering: number; // 工程专业，填计算程序工程专业ID
  Expression: string;
  comment: string; // 备注，后台清单精灵录入
  jobs: IJobOrItem[];
  items: IJobOrItem[];
  recharge: string;
  billsLibId: number;
  sectionInfo?: { first?: string; second?: string; third?: string };
  // 经济指标属性
  economicType: string; // 工程经济指标类别
  quantityIndexType: string; // 工程量指标类别
  quantityIndexUnit: string; // 工程量指标单位
  quantityIndexCoe: number; // 单位转换系数
  deleted?: boolean;
}

// 标准清单（更正属性命名规范）
export interface IStdBill extends ITreeScm {
  code: string;
  name: string;
  unit: string;
  ruleText: string;
  engineering: number; // 工程专业，填计算程序工程专业ID
  expression: string;
  comment: string; // 备注，后台清单精灵录入
  jobs: IJobOrItem[];
  items: IJobOrItem[];
  recharge: string;
  billLibID: number;
  // 经济指标属性
  economicType: string; // 工程经济指标类别
  quantityIndexType: string; // 工程量指标类别
  quantityIndexUnit: string; // 工程量指标单位
  quantityIndexCoe: number; // 单位转换系数
}

export interface IStdBillCodesMap {
  [libID: string]: string[];
}

export interface IBillClass {
  compilationID: string;
  class: number; // 类别
  code: string;
  name: string;
  itemCharacter: string; // 必填特征排列组合
  classCode: string; // 类别别名 040101001@一、二类土@人工
  requiredRationIDs: number[][]; // 必套定额ID
  optionalRationIDs: number[]; // 选套定额ID
  errorRationIDs: number[]; // 错套定额ID
}

export interface IIndexComponent extends IComponent {
  marketPrice: string;
  basePrice: string;
}

export interface IBillIndexGlj {
  ID: string;
  type: GljType;
  code: string;
  name: string;
  specs?: string;
  unit: string;
  quantity: string;
  marketPrice: string;
  basePrice: string;
  rationQuantity: string;
  components?: IIndexComponent[];
}

export interface IBillIndexRation {
  ID?: string;
  parentID?: string;
  seq?: number;
  code: string;
  name: string;
  unit: string;
  quantity: string;
  unitPrice: string;
  rationGljList: IBillIndexGlj[];
  dynamicIndex?: Record<string, IFees>; // 动态指标，年-月为key 综合指标的映射
  fees?: IFees; // 费用字段
  calcItems?: ICalcItem[];
}

export interface IFBIndex {
  ID: string;
  parentID: string;
  seq: number;
  sourceName?: string; // 来源项目
  constructionName: string;
  singleName: string;
  unitName: string;
  constructionID: string;
  singleID: string;
  unitID: string;
  code: string;
  name: string;
  unit: string;
  quantity: string;
  unitPrice: string; // 经济指标--综合单价
  projLocation?: string; // 工程所在地
  year?: string; // 信息价年
  month?: string; // 信息价月
  fileType?: FileType; // 文件类型
  indexTypes?: string[]; // 项目分类或者说功能分类--
  constructionIndexType?: string; // 建设项目的工程分类，查询条件用
  firstSingleIndexType?: string; // 第一个单项工程的工程分类，查询用
  dynamicIndex?: Record<string, IFees>; // 动态指标，年-月为key 综合指标的映射
  minUnitPrice?: string;
  maxUnitPrice?: string;
  fees?: IFees; // 费用字段
  compilationID?: string;
}
export interface IBillIndex extends IFBIndex {
  classCode: string; // 类别别名
  groupCode?: string;
  itemCharacter: string;
  rations?: IBillIndexRation[];
  dynamicGljMap?: Record<string, Record<string, string>>; // 动态工料机价格指标，年-月为key 工料机工五大项为子key  value为市场价
}

export enum LibType {
  BILL = '1',
  NORM = '2',
}
export interface IBillOption extends INumFileRef {
  libType?: LibType;
}

// 清单检测方法
export enum BillCheckBy {
  CODE = 'code',
  AI = 'AI',
}
