/*
 * @Descripttion: 安徽马鞍山导入接口
 * @Author: vian
 * @Date: 2020-09-09 11:51:15
 */

// INTERFACE_EXPORT =，必须这么写，这样才能在导入时动态加载脚本后，覆盖前端代码
INTERFACE_IMPORT = (() => {
  'use strict';
  /**
   * 
   * @param {String} areaKey - 地区标识，如：'安徽@马鞍山'，有些地区的接口只是取值上有不同，共有一个接口脚本， 需要通过地区标识确定一些特殊处理
   * @param {Object} xmlObj - xml经过x2js转换后的xml对象
   * @return {Object} - 返回的格式需要统一，具体参考函数内返回的内容。返回的内容会经过一系列的统一处理形成可入库的数据。
   */
  const RoadGradeMap = {
    "0": "高速公路",
    "1": "一级公路",
    "2": "二级公路",
    "3": "三级公路",
    "4": "四级公路",
    "5": "等外公路",
    "6": "独立桥梁",
    "7":"独立隧道"
  }
  
  function formateDataString(dstring) { 
    if (!dstring || dstring == "") return "";
    const strArr = dstring.split("T");
    return strArr[0]
  }

  async function entry(areaKey, xmlObj) {
    const {
      UTIL: {
        getValue,
        arrayValue,
        getBool,
        extractItemsRecur,
      }
    } = INTERFACE_EXPORT_BASE;
    let info = [];
    let tenders = [];
    let CprjInfo = getValue(xmlObj, ['CprjInfo']);
    let EprjInfos = arrayValue(CprjInfo, ["EprjInfo"]);
    if (EprjInfos.length > 0) { 
      let MakeInfo = EprjInfos[0].MakeInfo;
      let Params = EprjInfos[0].Params;
      let BuildType = getValue(Params, ['_BuildType']);
      let natureConstruction = "";
      if (BuildType == "0") natureConstruction = "新建";
      if (BuildType == "1") natureConstruction = "改扩建";

      let terrainCategory = "";
      let Terrain = getValue(Params, ['_Terrain']);
      if (Terrain == "0") terrainCategory = "平原微丘";
      if (Terrain == "1") terrainCategory = "山岭重丘";
      let RoadGrade = getValue(Params, ['_RoadGrade']);
      let roadGrade = "";
      if (RoadGradeMap[RoadGrade]) roadGrade = RoadGradeMap[RoadGrade];



      info = [
        { key: 'constructingUnit', value: getValue(MakeInfo, ['_Manage']) },
        { key: 'designUnit', value: getValue(MakeInfo, ['_Designer']) },
        { key: 'compileUnit', value: getValue(MakeInfo, ['_Compile']) },
        { key: 'compileApprover', value: getValue(MakeInfo, ['_CompileApprover']) },
        { key: 'compileCertNo', value: getValue(MakeInfo, ['_CompileCertNo']) },
        { key: 'compileDate', value: formateDataString(getValue(MakeInfo, ['_CompileDate'])) },
        { key: 'reviewUnit', value: getValue(MakeInfo, ['_Review']) },
        { key: 'reviewApprover', value: getValue(MakeInfo, ['_ReviewApprover']) },
        { key: 'reviewCertNo', value: getValue(MakeInfo, ['_ReviewCertNo']) },
        { key: 'reviewDate', value: formateDataString(getValue(MakeInfo, ['_ReviewDate'])) },
        { key: 'startChainages', value: getValue(Params, ['_StartPileNo'])},
        { key: 'endChainages', value: getValue(Params, ['_EndPileNo']) },  
        { key: 'location', value: getValue(Params, ['_PrjArea']) },  
        { key: 'natureConstruction', value: natureConstruction },  
        { key: 'terrainCategory', value: terrainCategory },  
        { key: 'roadGrade', value: roadGrade },  
        { key: 'makeDate', value: getValue(CprjInfo, ['SystemInfo','_MakeDate']) },  

      ]
      for (let t of EprjInfos) { 
        tenders.push(setupTender(t))
      }


    }

    function setupTender(EprjInfo) { 
      let tender = {};
      let Params = EprjInfo.Params;
      let SummaryOfCost = EprjInfo.SummaryOfCost;
      tender.name = EprjInfo._Name;
      tender.bills = [];
      tender.bidEvaluationList = [];
      tender.evaluationList = [];
      let ProvisionalSums = getValue(SummaryOfCost, ['_ProvisionalSums']);
      let Structure = getValue(Params, ['_Structure']);
      let pavementStructure = "";
      if (Structure == "0") pavementStructure = "沥青路面";
      if (Structure == "1") pavementStructure = "水泥混凝土路面";
      if (Structure == "2") pavementStructure = "其他类型路面";
      tender.feature = [
        { key: 'tenderSumLimit', value: getValue(SummaryOfCost, ['_TenderSumLimit'])},//招标控制价
        { key: 'designSpeed', value: getValue(Params, ['_DesignSpeed']) },// --todo
        { key: 'pavementStructure', value: pavementStructure},// --todo
        { key: 'subgradeWidth', value: getValue(Params, ['_SubgradeWidth']) },
        { key: 'roadLength', value: getValue(Params, ['_RoadLength']) },// --todo
        { key: 'bridgeLength', value: getValue(Params, ['_BridgeLength']) },
        { key: 'tunnelLength', value: getValue(Params, ['_TunnelLength']) },// --todo
        { key: 'briTunRate', value: getValue(Params, ['_BriTunRate']) },// --todo
        { key: 'interchangeNum', value: getValue(Params, ['_InterchangeNum']) },// --todo
        { key: 'stubLengths', value: getValue(Params, ['_StubLengths']) },// --todo
        { key: 'laneLength', value: getValue(Params, ['_LaneLength']) },// --todo
      ]
      const items = arrayValue(EprjInfo, ['Items', 'Item']);
      for (let i of items) {
        let bill = setupBills(i);
        if (bill.name == "暂列金额(不含计日工总额)") { 
          bill.fees = [{ fieldName: "common",tenderTotalFee:ProvisionalSums, tenderUnitFee: "0", totalFee: ProvisionalSums, unitFee: "0" }];
          bill.calcBase = ProvisionalSums;
          bill.calcFlag = 1;
        } 
        tender.bills.push(bill);
      }
      const BidEvaluationMainMaterial = arrayValue(EprjInfo, ['BidEvaluationMainMaterial']);
      for (let b of BidEvaluationMainMaterial) { 
        tender.bidEvaluationList.push(setUpBidEvaluation(b))
      }
      
      return tender;
    }


    function setupBills(item) { 
      let bill = {
        code: item._ListCode,
        name: item._ListName,
        unit: item._Unit,
        quantity: item._Num,
        remark: item._Remarks,
        jobContentText: item._Content,
        specialProvisional: '',
        children: []
      }
      if (item._ProvisionalType == '0') bill.specialProvisional = '材料';
      if (item._ProvisionalType == '1') bill.specialProvisional = '工程设备';
      if (item._ProvisionalType == '2') bill.specialProvisional = '工程设备';
      let subItems = arrayValue(item, ['Item']);
      if (subItems && subItems.length > 0) { 
        for (let i of subItems) { 
          bill.children.push(setupBills(i))
        }
      }
      return bill;
    }

    function setUpBidEvaluation(b) { 
      return {
        code: b._Code,
        name: b._Name,
        specs: b.Specification,
        unit: b._Unit,
        market_price: b._Price,
        quantity: b._Quantity,
        remark:b._Remark
      }
    }
    

    return {
      name: CprjInfo._CprjName,
      info,
      tenders,
    };

  }

  return {
    entry
  };

})();