import http from '@/config/request';
/**
 * 过滤字典值
 * @param {Array} data -图片地址
 * @param {String} type - 字典名
 * @param {String} $type - 类型别名
 * @param {String} key - 过滤用的名称
 * @param {String} targetKey - 取数目标字段
 */
function filterDictionary(data,type,$type,key ="dictName" , targetKey = "dictList"){
  let length = data.length ,res = [];
  for (let i = 0; i < length; i++) {
    let item = data[i];
    if(item[key] === type){
      res = item[targetKey];
      break;
    }
  }
  return res.map((item) => {
    return {
      ...item,
      ...{
        $type: $type
      }
    }
  });
}
/**
 * 过滤字典值
 * @param {Array} trees -
 */
function tree2List(trees){
  const newList = []
  const queue = []
  trees.forEach(tree => {
    // 1. 对根节点的处理
    const { children, ...meta } = tree // 去除子节点集合
    newList.push(meta) // 把当前节点介入到 新的list里
    if (children) { // 如果当前节点的 children 数组属性不为空,就把它加入到队列中
      queue.push(children)
    }
    // 2. 对根节点以外的节点进行处理
    // 遍历队列,可以看出 队列的操作 : 边遍历,边放入新的元素
    while (queue.length) {
      const item = queue.pop() // 从队列里推出一个元素
      item && item.forEach(node => { // 如果子节点还有子节点,就继续往队列里存放
        // 以下是重复性操作
        const { children, ...meta } = node
        newList.push(meta)
        if (children) {
          queue.push(children)
        }
      })
    }
  })
  return newList
}
/**
 * 统一字典 尺码 品类 数据格式
 * @param {Array} data - 数据源
 * @param {String} label - 显示文本的
 * @param {String} value - 制
 * @param {String} $type - 类型别名 品类初始化是没有过 filterDictionary 缺少 $type
 */
function filterDictionaryLabelAndKey(data,label = 'dictValue',value = 'dictKey',$type){
	return data.map((item) =>{
		return {
		  label: item[label],
		  value: item[value],
		  $type: item.$type || $type
		}
	})
}
function filterArray(data){
  for (let i = 0; i < data.length; i++) {
    let item = data[i];
    if(item.children.length === 0){
      delete item.children;
    }else{
      filterArray(item.children)
    }
  }
  return data
}
const state = {
	brandArray : [], // 品牌
	saleSeasonArray : [], //销售季
	positionArray : [], //用料部位
	technologyTypeArray : [], //工艺类型
	technologyPositionArray : [], //工艺节点
	productionTypeArray : [], //生产类型
	styleTypeArray : [], //开发类型
	saleTypeArray : [], //销售类型
	yearArray : [], //年份
	seriesArray : [], //系列
	waveArray : [], //波段
	patternArray : [], //版型
	basicCompany : [], //基本单位
	materialNodeArray : [], //物料节点
	clothWidthUnitArray: [], // 门幅单位
	fabricWidthUnitArray: [], // 克重单位
	developmentRulesArray: [], // 开发规则
	productionArray: [], // 生产类别
	priceFixedArray: [], // 价格定位
	ageFixedArray: [], // 年龄定位
	styleFixedArray: [], //风格定位
	customerTypeArray: [], //客户类型
	sizeArray:[] , //尺码
	categoryArray: [], // 品类
}
const getters = {
	brandDictionary: ({brandArray}) => {
		return filterDictionaryLabelAndKey(brandArray)
	},
	categoryDictionary: ({categoryArray}) => {
		return filterDictionaryLabelAndKey(tree2List(categoryArray),'name','id','category')
	},
	saleSeasonDictionary: ({saleSeasonArray}) => {
		return filterDictionaryLabelAndKey(saleSeasonArray)
	},
	positionDictionary: ({positionArray}) => {
		return filterDictionaryLabelAndKey(positionArray)
	},
	technologyTypeDictionary: ({technologyTypeArray}) => {
		return filterDictionaryLabelAndKey(technologyTypeArray)
	},
	technologyPositionDictionary: ({technologyPositionArray}) => {
		return filterDictionaryLabelAndKey(technologyPositionArray)
	},
	productionTypeDictionary: ({productionTypeArray}) => {
		return filterDictionaryLabelAndKey(productionTypeArray)
	},
	styleTypeDictionary: ({styleTypeArray}) => {
		return filterDictionaryLabelAndKey(styleTypeArray)
	},
	saleTypeDictionary: ({saleTypeArray}) => {
		return filterDictionaryLabelAndKey(saleTypeArray)
	},
	yearDictionary: ({yearArray}) => {
		return filterDictionaryLabelAndKey(yearArray)
	},
	seriesDictionary:({seriesArray}) => {
		return filterDictionaryLabelAndKey(seriesArray)
	},
	waveDictionary:({waveArray}) => {
		return filterDictionaryLabelAndKey(waveArray)
	},
	patternDictionary:({patternArray}) => {
		return filterDictionaryLabelAndKey(patternArray)
	},
	basicCompanyDictionary:({basicCompany}) => {
		return filterDictionaryLabelAndKey(basicCompany)
	},
	sizeDictionary:({sizeArray}) => {
		return filterDictionaryLabelAndKey(sizeArray,'describes','id','size')
	},
	materialNodeDictionary:({materialNodeArray}) => {
		return filterDictionaryLabelAndKey(materialNodeArray)
	},
	// 门幅单位
	clothWidthUnitArrayDictionary: ({ clothWidthUnitArray }) => {
		return filterDictionaryLabelAndKey(clothWidthUnitArray);
	},
	// 克重单位
	fabricWidthUnitArrayDictionary: ({ fabricWidthUnitArray }) => {
		return filterDictionaryLabelAndKey(fabricWidthUnitArray);
	},
	// 开发规则
	clothWidthUnitArrayDictionary: ({ developmentRulesArray }) => {
		return filterDictionaryLabelAndKey(developmentRulesArray);
	},
	// 生产类别
	productionArrayDictionary: ({ productionArray }) => {
		return filterDictionaryLabelAndKey(productionArray);
	},
	// 价格定位
	priceFixedArrayDictionary: ({ priceFixedArray }) => {
		return filterDictionaryLabelAndKey(priceFixedArray);
	},
	// 年龄定位
	ageFixedArrayDictionary: ({ ageFixedArray }) => {
		return filterDictionaryLabelAndKey(ageFixedArray);
	},
	// 风格定位
	styleFixedArrayDictionary: ({ styleFixedArray }) => {
		return filterDictionaryLabelAndKey(styleFixedArray);
	},
	// 客户类型
	customerTypeArrayDictionary: ({ customerTypeArray }) => {
		return filterDictionaryLabelAndKey(customerTypeArray);
	}
}

const mutations = {

}
const actions = {
	async getDictionary(){
		return new Promise((resolve,reject) => {
			// 品牌  销售季 用料部位 工艺类型 工艺节点
			// 生产类型、开发类型、销售类型、年份、系列、波段、版型、单位
			// 物料节点、门幅单位、克重单位、开发规则、 生产类别
			// 价格定位、年龄定位、风格定位、客户类型
			let codeList = [
			  'brand','sale_season','material_position','technolog_type','technology_point',
			  'production_type','style_type','sale_type','year','series','wave','pattern','base_unit',
			  'material_node','cloth_width_unit','fabric_width_unit','development_rules','production_list',
			  'price_fixed','age_fixed','style_fixed','customer_type'
			];
			http('base.dictionary',{codeList}).then(res => {
				let { code, data } = res;
				if(code === 200){
					state.brandArray = filterDictionary(data,"品牌","brand");
					state.saleSeasonArray = filterDictionary(data,"销售季","sale_season");
					state.positionArray = filterDictionary(data,"用料部位","material_position");
					state.technologyTypeArray = filterDictionary(data,"工艺类型","technolog_type");
					state.technologyPositionArray = filterDictionary(data,"工艺节点","technology_point");
					state.productionTypeArray = filterDictionary(data,"生产类型","production_type");
					state.styleTypeArray = filterDictionary(data,"开发类型","style_type");
					state.saleTypeArray = filterDictionary(data,"销售类型","sale_type");
					state.yearArray = filterDictionary(data,"年份","year");
					state.seriesArray = filterDictionary(data,"系列","series");
					state.waveArray = filterDictionary(data,"波段","wave");
					state.patternArray = filterDictionary(data,"版型","pattern");
					state.basicCompany = filterDictionary(data,"基本单位","base_unit");
					state.materialNodeArray = filterDictionary(data,"物料节点","material_node");
					state.clothWidthUnitArray = filterDictionary(data, '门幅单位', 'cloth_width_unit');
					state.fabricWidthUnitArray = filterDictionary(data, '克重单位', 'fabric_width_unit');
					state.developmentRulesArray = filterDictionary(data, '开发规则', 'development_rules');
					state.productionArray = filterDictionary(data, '生产类别', 'production_list');
					state.priceFixedArray = filterDictionary(data, '价格定位', 'price_fixed');
					state.ageFixedArray = filterDictionary(data, '年龄定位', 'age_fixed');
					state.styleFixedArray = filterDictionary(data, '风格定位', 'style_fixed');
					state.customerTypeArray = filterDictionary(data, '客户类型', 'customer_type');
					resolve();
				}
			}).catch(e => {
				reject(e)
			})
		})
	},
	async getCategoryList(){
		return new Promise((resolve,reject) => {
			// type(默认全部 CY-成衣 WL-物料 ML-面料 FL-辅料)
			http('base.getCategoryList',{type: ''})
				.then(res => {
					let { code, data } = res;
					if(code === 200){
						state.categoryArray = filterArray(data);
						resolve();
					}
				})
				.catch(e => {
					reject(e)
				})
		})
	},
	async getSizeList(){
		return new Promise((resolve,reject) => {
			http('base.sizeGroup',{queryName: ""})
				.then(res => {
					let { code, data } = res;
				    if(code === 200){
					  state.sizeArray = data.sizeGroupList;
					  resolve();
				    }
				})
				.catch(e => {
					reject(e)
				})
		})
	},
}
export default {
	state,
	mutations,
	actions,
	getters
}