/*
    第一步. 逻辑检查,初始化,选取出需要测的steplist
    第二步. 将要测net的step对应关系整理好 将array  array_c copy到 _tmp 删除排版 打散关系 array_net 删除排版 打散关系
    第三步. doNet 里所有step pgn极性翻转
    第四步. doNet.orig foNet.net 对比测net
    end: 删除辅助层 临时step
*/

var $ = require('topcam.scriptfunc').argv();
var _ = require('lodash');
var JOB = $.job_name;
var GEN = $.gen;
var ikm = $.ikm;
// var plugin = require('topsin.gengui');
// var gui = plugin.newGui();
// var r = gui.msgBox("mo", "info", "are you ok?", ["ok", "cancel"]);
try {
    console.log("===================start=================");

    // 第一步. 逻辑检查,初始化,选取出需要测的steplist
    if (!JOB) { throw '没有传入料号名!' } // 判断传没传入JOB
    if (!GEN.isJobExists({ job: JOB })) { throw '料号' + JOB + '在genesis中不存在' } // 判断genesis中是否存在料号
    if (!GEN.isJobOpen({ job: JOB })) { GEN.openJob({ job: JOB }) } // 如果料号没打开 先打开料号
    GEN.checkInout({ job: JOB,  mode: 'out' }) // 锁住料号权限
    var matrix = _.values(GEN.getMatrix({ job: JOB })) // 获取matrix信息 转化为数组
    var tmp_matrix = matrix.filter(function(item){ // 返回非misc的matrix
        if(item.context === 'board' && !(/^(signal|drill)$/ig.test(item.layer_type))){
            item.context = 'misc'
            GEN.matrixLayerAttr({job:JOB,layer:item.name,context:'misc'})
        }
        return item.context === 'board'
    })
    var stepList = GEN.getStepList({ job: JOB }).filter(function (item) {  // 获取需要测的step列表
        var reg = /^(pcb_c|pcb\d*|array|array_c)$/ig // pcb/pcb_c,pcb1,2,3…  ; array/array_c
        return reg.test(item)
    }) 
    GEN.PAUSE(JSON.stringify({
        msg:1,
        stepList: stepList
    }))
    // 第二步. 将要测net的step对应关系整理好 将array  array_c copy到 _tmp 删除排版 打散关系 array_net 删除排版 打散关系
    var doNet = {orig:[],net:[]}
    var copyArray = [] // 记录临时的tmp 最后删除
    stepList.forEach(function(step){
        if(/^(array|array_c)$/ig.test(step)){ 
            doArray(step)  // 处理array类的step
            step = step + "_tmp"
        }
        doNet.orig.push(step)
        doNet.net.push(origToNet(step))
    })
    doArray('array_net')
    GEN.PAUSE(JSON.stringify({
        msg:2,
        doNet: doNet
    }))
    // 第三步. doNet 里所有step pgn极性翻转
    var negativeLayer = [] // 记录pgn开头的层 之后删除里面的newname
    tmp_matrix.forEach(function(layer){
        if(/^pgn/.test(layer.name)){ // 找负片层
            var newName = layer.name + '_tmp'
            negativeLayer.push({name:layer.name,newName:newName})
            if(GEN.isLayerExists({job:JOB,layer:newName})){ GEN.deleteLayer({job:JOB,layer:newName})}
            // 创建一个层
            GEN.openStep({job:JOB,name:'orig'})
            GEN.createLayer({job:JOB,layer:newName,context:'board',type:layer.layer_type,after:layer.name})
            GEN.closeStep()
            // 将原来的层设置为misc
            GEN.matrixLayerAttr({job:JOB,layer:layer.name,context:'misc'})
        }
    })
    var doNet_tmp = toArr(doNet) // 将doNet数组化并去重
    doNet_tmp.forEach(function(step){
        negativeLayer.forEach(function(layer){  
            GEN.openStep({ job: JOB, step: step })
            // 给新创建的层铺满铜皮
            GEN.workLayer({name:layer.newName,display_number:1,clear_before:'yes'})
            GEN.srFill({layer:layer.newName})
            // 将旧的copy过去 翻转一下
            GEN.copyLayer({source_job:JOB,mode:'append',source_step:step,source_layer:layer.name,dest_layer:layer.newName,invert:'yes'})
            GEN.closeStep();
        })
    })
    GEN.PAUSE(JSON.stringify({
        msg:3,
        doNet_tmp: doNet_tmp
    }))

    // 第四步. doNet.orig foNet.net 对比测net
    for (var i = 0; i < doNet['orig'].length; i++) {
        var v1 = doNet['orig'][i]
        var v2 = doNet['net'][i]
        GEN.netlistPageOpen() // 打开netlist窗口
        GEN.netlistRecalc({job:JOB,step:v1,type:'cur',display:'top'})  // 计算netlist数据
        GEN.netlistRecalc({job:JOB,step:v2,type:'cur',display:'bottom'})  // 计算netlist数据
        // compare
        var netlistCompare = GEN.netlistCompare({
            job1:JOB,step1:v1,type1:'cur',
            job2:JOB,step2:v2,type2:'cur'
        });
        if(netlistCompare.shorted > 0 || netlistCompare.broken > 0){
            GEN.PAUSE(JSON.stringify({shorted:netlistCompare.shorted,broken:netlistCompare.broken}))
        }
        GEN.netlistPageClose()  // 关闭netlist窗口
    }
    GEN.PAUSE(JSON.stringify({
        msg:4
    }))

    // end: 删除辅助层 临时step
    _.forEach(negativeLayer,function(item){
        GEN.PAUSE('delLayer:'+item.newName)
        GEN.deleteLayer({job:JOB,layer:item.newName})
    }) 
    _.forEach(copyArray,function(step){
        GEN.PAUSE('del:'+step)
        GEN.deleteStep({job:JOB,step:step})
    }) 

    GEN.saveJob({job:JOB})
    GEN.checkInout({job: JOB,mode:'in'});   // 解锁

    
    return 'Done';
} catch (error) {
    error = error || 'error'
    return error
}
function doArray(step){
    if(GEN.isStepExists({job:JOB,step:step+'_tmp'})) { GEN.deleteStep({job:JOB,step:step+'_tmp'}) }  // 如果tmp的step已经存在 则删除
    GEN.matrixCopyStep({job:JOB,step:step,new_name:step+'_tmp'})  // copy一个层
    step = step+'_tmp'
    copyArray.push(step)
    GEN.openStep({ job: JOB, step: step });
    GEN.affectedLayer({ mode: 'all', affected: 'yes', layer: tmp_matrix.map(function(v){return v.name})});
    GEN.COM('sredit_sel_steps_name,name=coupon')
    GEN.COM('sredit_del_steps')
    GEN.COM('sredit_reduce_nesting,mode=one_highest') // 打散
    GEN.clearLayers(); // 清除显示
    GEN.affectedLayer({ mode: 'all', affected: 'no' }); // 清除影响层
    GEN.closeStep();
}
function origToNet(orig){ 
    if (/^pcb\d+$/ig.test(orig)) {  // 1,2,3    net1,2,3
        return orig.replace(/pcb/ig, 'net')
    } else if (/^pcb[^\d]*$/ig.test(orig)) {  // pcb pcb_c  net
        return 'net'
    } else if (/^array/ig.test(orig)) {  // array array_c array_net
        return 'array_net_tmp'
    }
}
function toArr(doNet){
    var arr = []
    arr = _.concat(doNet.orig,doNet.net)
    return unique(arr)
}
function unique(arr){ //数组去重         
    for(var i=0; i<arr.length; i++){
        for(var j=i+1; j<arr.length; j++){
            if(arr[i]==arr[j]){         
                arr.splice(j,1);
                j--;
            }
        }
    }
    return arr;
}









// var _Matrix = {
//     "to": {
//         "row": "1",
//         "type": "layer",
//         "name": "to",
//         "context": "board",
//         "layer_type": "silk_screen",
//         "polarity": "positive",
//         "side": "top",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": -1000,
//         "tl_name": "ss_fr",
//         "tl_type": "silk_screen"
//     },
//     "ts": {
//         "row": "2",
//         "type": "layer",
//         "name": "ts",
//         "context": "board",
//         "layer_type": "solder_mask",
//         "polarity": "positive",
//         "side": "top",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": -999,
//         "tl_name": "sm_fr",
//         "tl_type": "solder_mask"
//     },
//     "cs": {
//         "row": "3",
//         "type": "layer",
//         "name": "cs",
//         "context": "board",
//         "layer_type": "signal",
//         "polarity": "positive",
//         "side": "top",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": 1,
//         "tl_name": "top",
//         "tl_type": "outer"
//     },
//     "sig2t": {
//         "row": "4",
//         "type": "layer",
//         "name": "sig2t",
//         "context": "board",
//         "layer_type": "signal",
//         "polarity": "positive",
//         "side": "inner",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": 2,
//         "tl_name": "l2",
//         "tl_type": "inner"
//     },
//     "sig3b": {
//         "row": "5",
//         "type": "layer",
//         "name": "sig3b",
//         "context": "board",
//         "layer_type": "signal",
//         "polarity": "positive",
//         "side": "inner",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": 3,
//         "tl_name": "l3",
//         "tl_type": "inner"
//     },
//     "sig4t": {
//         "row": "6",
//         "type": "layer",
//         "name": "sig4t",
//         "context": "board",
//         "layer_type": "signal",
//         "polarity": "positive",
//         "side": "inner",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": 4,
//         "tl_name": "l4",
//         "tl_type": "inner"
//     },
//     "sig5b": {
//         "row": "7",
//         "type": "layer",
//         "name": "sig5b",
//         "context": "board",
//         "layer_type": "signal",
//         "polarity": "positive",
//         "side": "inner",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": 5,
//         "tl_name": "l5",
//         "tl_type": "inner"
//     },
//     "ss": {
//         "row": "8",
//         "type": "layer",
//         "name": "ss",
//         "context": "board",
//         "layer_type": "signal",
//         "polarity": "positive",
//         "side": "bottom",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": 6,
//         "tl_name": "bottom",
//         "tl_type": "outer"
//     },
//     "bs": {
//         "row": "9",
//         "type": "layer",
//         "name": "bs",
//         "context": "board",
//         "layer_type": "solder_mask",
//         "polarity": "positive",
//         "side": "bottom",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": 1008,
//         "tl_name": "sm_ba",
//         "tl_type": "solder_mask"
//     },
//     "bo": {
//         "row": "10",
//         "type": "layer",
//         "name": "bo",
//         "context": "board",
//         "layer_type": "silk_screen",
//         "polarity": "positive",
//         "side": "bottom",
//         "drl_start": "",
//         "drl_end": "",
//         "gdrl_start": "",
//         "gdrl_end": "",
//         "tl_num": 1009,
//         "tl_name": "ss_ba",
//         "tl_type": "silk_screen"
//     },
//     "drl": {
//         "row": "11",
//         "type": "layer",
//         "name": "drl",
//         "context": "board",
//         "layer_type": "drill",
//         "polarity": "positive",
//         "side": "none",
//         "drl_start": "cs",
//         "drl_end": "ss",
//         "gdrl_start": "to",
//         "gdrl_end": "bo",
//         "drl_start_num": 1,
//         "drl_end_num": 6,
//         "tl_name": "drill",
//         "tl_type": "drill",
//         "tl_num": 10010
//     },
//     "rout": {
//         "row": "12",
//         "type": "layer",
//         "name": "rout",
//         "context": "board",
//         "layer_type": "rout",
//         "polarity": "positive",
//         "side": "none",
//         "drl_start": "to",
//         "drl_end": "bo",
//         "gdrl_start": "to",
//         "gdrl_end": "bo"
//     }
// }