/**
 * Created by Mai on 2017/4/24.
 */

let billsData = require('../../main/models/bills');
let projCounter = require('../../main/models/proj_counter_model');
let projSetting = require('../../main/models/proj_setting_model');
let async = require('async');
const uuidV1 = require('uuid/v1');
const mongoose = require('mongoose');
let mainColLibModel = mongoose.model('std_main_col_lib');
const { ValuationType } = require('../../../public/common_constants');

import BillsTemplateModel from "../models/templates/bills_template_model";
import EngineeringLibModel from "../../users/models/engineering_lib_model";

module.exports = {
    copyTemplateData: async function (property, newProjID, callback) {
        // 原ID引用更新成新ID引用
        function parseCalcBase(calcBase, uuidMapping) {
            const orgIDRefs = [...new Set(calcBase.match(/@\d+/g))];
            orgIDRefs.forEach(orgRef => {
                const orgID = orgRef.match(/\d+/)[0];
                const newID = uuidMapping[orgID] || null;
                // ID匹配不上则不转换这个引用
                if (!newID) {
                    return;
                }
                const replaceStr = `@${newID}`;
                calcBase = calcBase.replace(new RegExp(`${orgRef}\\b`, 'g'), replaceStr);
            });
            return calcBase;
        }
        async.parallel([
            async function (cb) {
                // 获取清单模板数据
                let billsTemplateModel = new BillsTemplateModel();
                let templateData = JSON.stringify(await billsTemplateModel.getTemplateDataForNewProj(property.templateLibID));
                let billsDatas = JSON.parse(templateData);
                let uuidMaping = Object.create(null);
                uuidMaping['-1'] = -1;
                //建立uuid-ID映射
                for(let bill of billsDatas){
                    uuidMaping[bill.ID] = uuidV1();
                }
                const reg = /@\d+/;
                billsDatas.forEach(function (template) {
                    // 工程量清单单价分析默认勾选
                    if (property.valuationType === ValuationType.BOQ) {
                        template.unitPriceAnalysis = 1;
                    }
                    template.projectID = newProjID;
                    template.ID = uuidMaping[template.ID] ? uuidMaping[template.ID] : -1;
                    template.ParentID = uuidMaping[template.ParentID] ? uuidMaping[template.ParentID] : -1;
                    template.NextSiblingID = uuidMaping[template.NextSiblingID] ? uuidMaping[template.NextSiblingID] : -1;

                    const needToParseCalcBase = template.calcBase && reg.test(template.calcBase);
                    if (needToParseCalcBase) {
                        template.calcBase = parseCalcBase(template.calcBase, uuidMaping);
                    }
                });
                billsData.insertData(billsDatas, callback);
            },
            async function (cb) {
                let engineeringModel = new EngineeringLibModel();
                let engineering = await engineeringModel.getEngineering(property.engineering_id);
                let mainTreeCol = await mainColLibModel.findOne({'ID':property.colLibID});
                projSetting.insertData({"projectID": newProjID, main_tree_col: mainTreeCol.main_tree_col,glj_col:engineering.glj_col}, cb);
            }
        ], (err) => callback(err));
    }
};