import Mock from 'mockjs'
import { param2Obj } from '@/utils'

const clsList = Mock.mock({
  'list|26': [{
    'id': '@increment',
    'hjmc|1': ['后勤处', '财务处', '学生处'],
    'xh': '@word(8)',
    'xm': '@cword(2, 3)',
    'yx|1': ['教育学院', '经管学院', '人文学院', '数学学院', '计算机学院', '电子学院', '电气学院', '生命科学院'],
    'yxid|1': ['1', '2', '3', '4', '5', '6', '7', '8'],
    'zy': '@cword(6, 7)',
    'bj': '@cword(6, 7)',
    'shzt|1': ['待审核', '审核通过', '审核不通过'],
    'shyj': '@cword(6, 10)',
    'shztcode|1': ['1', '2', '3']
  }]
}).list

export default{
  getList: config => {
    const { xh, xm, pcmc, xslb, bynf, byyf, yx, zy, xb, shhj, shzt, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
    const mockList = clsList.filter(item => {
      if (pcmc && item.pcmc && item.pcmc + '' !== pcmc + '') return false
      if (xslb && item.xslb && item.xslb !== xslb) return false
      if (bynf && item.bynf && item.bynf !== bynf) return false
      if (byyf && item.byyf && item.byyf !== byyf) return false
      if (yx && item.yxid && item.yxid !== yx) return false
      if (zy && item.zy && item.zy !== zy) return false
      if (xb && item.xb && item.xb !== xb) return false
      if (shhj && item.shhj && item.shhj !== shhj) return false
      if (shzt && item.shztcode && item.shztcode !== shzt) return false
      if (xh && item.xh && item.xh !== xh) return false
      if (xm && item.xm && item.xm !== xm) return false
      return true
    })

    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
    return {
      items: pageList,
      recordCount: mockList.length,
      code: 200
    }
  }
}
