package com.xxl.api.admin.service.impl;


import com.xxl.api.admin.core.model.XxlApiDataType;
import com.xxl.api.admin.core.model.XxlApiDataTypeField;
import com.xxl.api.admin.dao.IXxlApiDataTypeDao;
import com.xxl.api.admin.dao.IXxlApiDataTypeFieldDao;
import com.xxl.api.admin.service.IXxlApiDataTypeService;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author xuxueli
 */
@Service
public class XxlApiDataTypeServiceImpl implements IXxlApiDataTypeService {
	private static Logger logger = LoggerFactory.getLogger(XxlApiDataTypeServiceImpl.class);

	@Resource
	private IXxlApiDataTypeDao xxlApiDataTypeDao;
	@Resource
	private IXxlApiDataTypeFieldDao xxlApiDataTypeFieldDao;

	@Override
	public XxlApiDataType loadDataType(int dataTypeId) {
		XxlApiDataType dataType = xxlApiDataTypeDao.load(dataTypeId);
		if (dataType == null) {
			return dataType;
		}

		// fill field datatype
		int maxRelateLevel = 5;
		dataType = fillFileDataType(dataType, maxRelateLevel);
		return dataType;
	}

	/**
	 * parse field of datatype (注意，循环引用问题；此处显示最长引用链路长度为5；)
	 *
	 * @param dataType
	 * @param maxRelateLevel
	 * @return
	 */
	private XxlApiDataType fillFileDataType(XxlApiDataType dataType, int maxRelateLevel){
		// init field list
		List<XxlApiDataTypeField> fieldList = xxlApiDataTypeFieldDao.findByParentDatatypeId(dataType.getId());
		dataType.setFieldList(fieldList);
		// parse field list
		if (CollectionUtils.isNotEmpty(dataType.getFieldList()) && maxRelateLevel>0) {
			for (XxlApiDataTypeField field: dataType.getFieldList()) {
				XxlApiDataType fieldDataType = xxlApiDataTypeDao.load(field.getFieldDatatypeId());
				fieldDataType = fillFileDataType(fieldDataType, --maxRelateLevel);
				field.setFieldDatatype(fieldDataType);
			}
		}
		return dataType;
	}

}
