/*
 * @Descripttion: 安徽池州导入接口
 * @Author: vian
 * @Date: 2020-09-21 17:40:45
 */

// INTERFACE_EXPORT =，必须这么写，这样才能在导入时动态加载脚本后，覆盖前端代码
INTERFACE_IMPORT = (() => {
  'use strict';
  /**
   * 
   * @param {String} areaKey - 地区标识，如：'安徽@马鞍山'，有些地区的接口只是取值上有不同，共有一个接口脚本， 需要通过地区标识确定一些特殊处理
   * @param {Object} xmlObj - xml经过x2js转换后的xml对象
   * @return {Object} - 返回的格式需要统一，具体参考函数内返回的内容。返回的内容会经过一系列的统一处理形成可入库的数据。
   */
  async function entry(areaKey, xmlObj) {
    const {
      UTIL: {
        getValue,
        arrayValue,
        extractItemsRecur,
      }
    } = INTERFACE_EXPORT_BASE;

    const subArea = areaKey.split('@')[1];

    const natureConstructionMap = {
      '1': '新建',
      '2': '改扩建',
    };
    const roadGradeMap = {
      '1': '高速公路',
      '2': '一级公路',
      '3': '二级公路',
      '4': '三级公路',
      '5': '四级公路',
      '6': '独立桥梁',
      '7': '独立隧道',
    };
    const taxModeMap = {
      '1': '一般计税',
      '2': '简易计税',
    };
    // 提取基本信息，xml中提取出来的基本信息，最终会与模板基本信息进行合并处理。（接口内不需要处理合并）
    function setupInformation(projectSrc) {
      const gcxx = getValue(projectSrc, ['工程信息']);
      const zbxx = getValue(projectSrc, ['招投标信息', '招标信息']);
      // key：基本信息模板中的key，作为合并时的匹配字段
      const info = [
        { key: 'projNum', value: getValue(gcxx, ['_项目编号']) },
        { key: 'constructingUnits', value: getValue(gcxx, ['_建设单位']) },
        { key: 'startChainages', value: getValue(gcxx, ['_起始桩号']) },
        { key: 'endChainages', value: getValue(gcxx, ['_终点桩号']) },
        { key: 'constructionAddress', value: getValue(gcxx, ['_建设地址']) },
        { key: 'projOverview', value: getValue(gcxx, ['_项目概况']) },
        { key: 'natureConstruction', value: natureConstructionMap[getValue(gcxx, ['_建设性质'])] || '' },
        { key: 'roadGrade', value: roadGradeMap[getValue(gcxx, ['_专业划分'])] || '' },
        { key: 'roadDistance', value: getValue(gcxx, ['_道路里程']) },
        { key: 'designUnit', value: getValue(gcxx, ['_设计单位']) },
        { key: 'taxMode', value: taxModeMap[getValue(gcxx, ['_计税方式'])] },
        { key: 'tendereeName', value: getValue(zbxx, ['_招标人']) },
        { key: 'tendereeTaxpayerIdentificationNo', value: getValue(zbxx, ['_招标人纳税识别号']) },
        { key: 'tenderAuthorizer', value: getValue(zbxx, ['_招标法定代表人或其授权人']) },
        { key: 'tenderAuthorizerIDNo', value: getValue(zbxx, ['_招标法人或其授权人身份证号']) },
        { key: 'costConsultant', value: getValue(zbxx, ['_造价咨询人']) },
        { key: 'costConsultantTaxpayerIdentificationNo', value: getValue(zbxx, ['_造价咨询人纳税识别号']) },
        { key: 'consultantAuthorizer', value: getValue(zbxx, ['_造价咨询人法定代表人或其授权人']) },
        { key: 'consultantAuthorizerTaxpayerIdentificationNo', value: getValue(zbxx, ['_造价咨询法人或其授权人身份证号']) },
        { key: 'compileApprover', value: getValue(zbxx, ['_编制人']) },
        { key: 'compileCertNo', value: getValue(zbxx, ['_编制人资格证号']) },
        { key: 'compileDate', value: getValue(zbxx, ['_编制日期']) },
        { key: 'reviewApprover', value: getValue(zbxx, ['_复核人']) },
        { key: 'reviewCertNo', value: getValue(zbxx, ['_复核人资格证号']) },
        { key: 'reviewDate', value: getValue(zbxx, ['_复核日期']) },
      ];
      return info;
    }

    // 提取清单数据
    function setupBills(rootSrc, oneSevenSrc, dayWorkSrc) {
      // 章次为空的造价汇总表数据，为大项费用数据
      const roots = arrayValue(rootSrc, ['造价汇总明细'])
        .filter(item => !getValue(item, ['_章次']))
        .map(item => ({
          name: getValue(item, ['_名称']),
          remark: getValue(item, ['_备注'])
        }));
      let oneSevenBills;
      let dayWorkBills;
      roots.forEach(item => {
        const simpleName = item.name ? item.name.replace(/\s/g, '') : '';
        if (/100章至第700章|100章至700章/.test(simpleName)) {
          oneSevenBills = item;
        } else if (/计日工合计/.test(simpleName)) {
          dayWorkBills = item;
        }
      });
      // 第100-700章的数据
      if (oneSevenBills) {
        oneSevenBills.children = extractItemsRecur(oneSevenSrc, [['工程量清单明细']], (src) => ({
          code: getValue(src, ['_子目号']),
          name: getValue(src, ['_子目名称']),
          unit: getValue(src, ['_单位']),
          quantity: getValue(src, ['_数量']),
          remark: getValue(src, ['_备注']),
        }));
      }
      // 计日工数据
      if (dayWorkBills) {
        const title = '计日工信息标题';
        const detail = '计日工信息明细';
        dayWorkBills.children = extractItemsRecur(dayWorkSrc, [[title], [detail]], (src, curField) => {
          const name = getValue(src, ['_名称']);
          const simpleName = name ? name.replace(/\s/g, '') : ''
          if (curField === title && /计日工合计/.test(simpleName)) { // 计日工标题在根节点中已经提取了，不重复提取
            return null;
          }
          const item = { name };
          if (curField === detail) {
            item.code = getValue(src, ['_编号']);
            item.unit = getValue(src, ['_单位']);
            item.quantity = getValue(src, ['_暂定数量']);
          }
          return item;
        });
      }
      return roots;
    }

    // 提取单位工程数据
    function setupTender(tenderSrc) {
      const oneSevenSrc = getValue(tenderSrc, ['工程量清单表']);
      const dayWorkSrc = getValue(tenderSrc, ['计日工信息表']);
      const rootSrc = getValue(tenderSrc, ['造价汇总表']);
      return {
        name: getValue(tenderSrc, ['_标段名称']),
        bills: setupBills(rootSrc, oneSevenSrc, dayWorkSrc)
      };
    }

    // 从xml对象提取需要的数据
    function setupProject(projectSrc) {
      const tenders = arrayValue(projectSrc, ['公路工程数据', '公路标段工程'])
        .map(tenderSrc => setupTender(tenderSrc));
      return {
        name: getValue(projectSrc, ['工程信息', '_项目名称']),
        info: setupInformation(projectSrc),
        tenders,
      };
    }
    return setupProject(getValue(xmlObj, ['池州公路工程']));
  }

  return {
    entry
  };

})();