import {RegMap} from './TagRegMap'

export function isTagValueEmpty(tag,tagValue)
{
    let obj = tagValue[0]
    let regobj = RegMap[tag]
    for(let key in regobj)
    {
        if(obj[key])
            return false
    }
    return true
}

export function TagV(tag,status,value,tno,mty,seqlist,countMap={})
{
    let regobj = RegMap[tag]
    let obj = value[0]
    let mval = value[1]
    // 特殊化赋值
    if ((
        mty == 'fmt191' ||
        mty == 'fmt193' ||
        mty == 'fmt194' ||
        mty == 'fmt195' ||
        mty == 'fmt196' ||
        mty == 'fmt199'
    ) && tag == 'T79') {
        regobj = RegMap[tag + '-' + mty]
    }
    if ((
        mty == 'fmt194' ||
        mty == 'fmt195' ||
        mty == 'fmt196'
    ) && tag == 'T77A') {
        regobj = RegMap[tag + '-' + mty]
    }
    if ((
        mty == 'fmt985'
    ) && tag == 'T75') {
        regobj = RegMap[tag + '-' + mty]
    }
    if (mty == 'fmt194' && tag == 'T76') {
        regobj = RegMap[tag + '-' + mty]
    }
    if (mty == 'fmt985' && tag == 'T59') {
        regobj = RegMap[tag + '-' + mty]
    }
    if ((mty == 'fmt100' || mty == 'fmt103') && tag == 'T72') {
        regobj = RegMap[tag + '-' + mty]
    }
     //计算状态 status,是否是必填的,要参考所在序列是否是必填,上一层序列计数,来决定当前序列是否必填  
    if(seqlist && seqlist.length && status == 'M' && isTagValueEmpty(tag,value))
    {
         let curseq = seqlist[seqlist.length - 1]
         let curcnt = countMap[curseq.seqlist] || 0
         if(curseq.status == 'O' &&  curcnt==0)
         {
             status = 'O'
         }
         else if(curseq.status == 'M' && curcnt==0)
         {
             //验证上层是否有计数为O,且上层计数
             for(let i = seqlist.length - 2 ; i >=0;i--)
             {
                    let itemseq = seqlist[i]
                    let itemcnt = countMap[itemseq.seqlist] || 0
                    if(itemcnt>0)
                        break
                    if(itemseq.status == 'O' && itemcnt == 0)
                        status = 'O'
             }
         }
    }
    
    let errmsg = null
    if(value.length == 3)
         errmsg = value[2] || {}
    else
    {
        errmsg = {}
        value.push(errmsg)
    }
    let isAllEmpty = true

    for(let key in regobj)
    {   
        // 清空校验
        errmsg[key] = ''
        if(!regobj[key])
        {
            errmsg[key]=""
            continue
        }    
        let reg = regobj[key]
        let val = obj[key] 
        if(!val)
            obj[key]=undefined
        else
        {
             isAllEmpty = false
             //val = FormatAdr(val)

        }   

        if(reg.option=='O')
        {
            if(!val)
            {
                errmsg[key]=""
                if(!val && (tag=='T11R' || tag=='T11S') && (key=='s3' || key=='s4') )
                {
                    if(obj.s3||obj.s4)
                        errmsg[key]="Session Number 、ISN必须同时填写"
                    
                }
                continue
            }
            //校验值
            if(reg.line>1)
            {
                val = formatAdr(val,reg.line,reg.length)
                obj[key] = val
                let line_temp = reg.line
                if(mty== "mt700")   //特殊化处理,放开至800
                {
                    if(tag == 'T45A' || tag == 'T46A' || tag == 'T47A' ||tag == 'T49G' ||tag == 'T49H')
                        line_temp = 800
                }
                else if(mty=="mt707")
                {
                    if(tag == 'T45B' || tag == 'T46B' || tag == 'T47B' ||tag == 'T49M' ||tag == 'T49N')
                        line_temp = 800
                }
                errmsg[key]=TestAdr(val,reg.reg,line_temp,reg.length)
                continue
            }
            if(reg.content == 'AMOUNT' || reg.content == 'NUMBER' || reg.type=='d')
            {
                errmsg[key]=TestAmt(val,reg.length)
                continue
            }
            
            if(!new RegExp(`^${reg.reg}$`).test(val))
            {
                errmsg[key]="请输入正确的格式"
            }   
            continue
        }
        //必填
        if(!val)
        {
            if(status=='M') //栏位已经填了值,或者该栏位必填
                errmsg[key]="请填写必输项"
            else if(mval)
                errmsg[key]="请填写完整"
        }
        else
        {
            //校验值
            if(reg.line>1)
            {
                val = formatAdr(val,reg.line,reg.length)
                obj[key] = val
                let line_temp = reg.line
                if(mty== "mt700")   //特殊化处理,放开至800
                {
                    if(tag == 'T45A' || tag == 'T46A' || tag == 'T47A' ||tag == 'T49G' ||tag == 'T49H')
                        line_temp = 800
                }
                else if(mty=="mt707")
                {
                    if(tag == 'T45B' || tag == 'T46B' || tag == 'T47B' ||tag == 'T49M' ||tag == 'T49N')
                        line_temp = 800
                }
                errmsg[key]=TestAdr(val,reg.reg,line_temp,reg.length)
                continue
            }
            if(reg.content == 'AMOUNT' || reg.content == 'NUMBER' || reg.type=='d')
            {
                errmsg[key]=TestAmt(val,reg.length)
                continue
            }
            
            if(!new RegExp(`^${reg.reg}$`).test(val))
            {
                errmsg[key]="请输入正确的格式"
            }   
        }
    }
    if(isAllEmpty)
    {
        value[1] = ''
        if(status == 'O'){
            for(let ek in errmsg)
            {
                
                    errmsg[ek] = '' 
            }
        }
    }
    for(let ek in errmsg)
    {
        if(errmsg[ek])
            return false
    }
    return true
}


function FormatAdr(val)
{
    val = val.replace(/[\\r\\n]{1,2}/g,'\r\n')
    let val_bak = ""
    let lineCount = 0
    let begIndex = 0
    let cur = 0

    while(cur < val.length)
    {

    }


    return val
}

function TestAmt(amt,length)
{
    if(!/^\d+(\.\d*)?$/.test(amt))
    {
        return "请填写正确的金额"
    }
    let idx = amt.indexOf('.')
    if(idx >= 0)
    {
         if(amt.length > length + 1)
            return "数字长度过长"
    }else  
     {
        if(amt.length > length)
            return "数字长度过长"
     }     
    return ""   
}
function  formatAdr(adr,line,length){
    return adr
}
function formatAdr2(adr,line,length)
{
    let arr = []
    let i =0
    let cols = 0
    let wordBegin = 0 
    let wordEnd = 0
    let lines = 0
    let lastLineEnd = -1
    adr = adr.replace(/[\r\n]{1,2}/g,'\n')
    while(i<adr.length)
    {
        let c = adr.charAt(i)
        if(c=='\n')
        {
            lines++
            if(lines >= line) //行数达到
                break;
            arr.push(c)
            cols = 0 //换行列数清零
            wordBegin = arr.length - 1
            lastLineEnd = wordBegin - 1
        }
        else if(!/[0-9A-Za-z]/.test(c))
        {
            wordBegin = -1 //没有捕获到单词
            arr.push(c)
            cols++
        }
        else{
            //其他字符
            if(wordBegin < 0)
                wordBegin = arr.length
            arr.push(c)
            cols++
        }

        if(cols == length+1)
        {
            lines++
            if(wordBegin - lastLineEnd  == 1)   //行开始的单词,超长单词
            {
                if(lines >=line)
                    break;
                arr.splice(arr.length-1,0,'\n')
                wordBegin=arr.length - 1
                lastLineEnd = wordBegin - 1
                cols = 0
            }
            else if(wordBegin > 0)
            {
                cols = arr.length - wordBegin //回溯部分长度
                if(lines >=line)
                {
                       arr.splice(wordBegin,arr.length-wordBegin) //最后一行了,直接不要了 
                       break;
                }
                 
                arr.splice(wordBegin,0,'\n') //插入一个换行符
                lastLineEnd = wordBegin
                wordBegin+=1
            } 
            else 
            {
                if(lines >=line)
                    break;
                arr.splice(arr.length-1,0,'\n')
                wordBegin=arr.length
                lastLineEnd = wordBegin - 1
                cols = 0
            }           
        }
        i++
    }
    return arr.join('')
    // return adr
}

function TestAdr(adr,reg,line,length)
{
    let arr = adr.split(/[\r\n]{1,2}/g)

    let a1 = []
    let a2 = []

    for(let i=0;i<arr.length;i++)
    {
        
        if(arr[i].length > length)
            a1.push(i+1)
        if(arr[i].length <= length && !new RegExp(`^${reg}$`).test(arr[i]))
            a2.push(i+1)
    }
    let linemsg = ''
    if(arr.length > line)
        linemsg = `最多${line}行`
    let msg = []
    if(a1.length)
    {
        msg.push( `第${a1.join(',')}行超过${length}个字符`)
    }
    if(a2.length)
        msg.push(`第${a2.join(',')}行格式非法`)
    if(linemsg)
        msg.push(linemsg)
    return msg.join(';')
}