package com.cloudcross.ssp.web.widget;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.cloudcross.ssp.base.web.SimpleController;
import com.cloudcross.ssp.common.error.NotFoundException;
import com.cloudcross.ssp.common.utils.Assert;
import com.cloudcross.ssp.common.utils.NamingUtil;


/**
 * 下选框控件数据支持。
 * 
 * @author qaohao
 */
@Controller
@RequestMapping("/widget/selector")
public class SelectorController extends SimpleController {
	private Logger LOG = Logger.getLogger(SelectorController.class);
	
	/**
	 * 获取下拉框数据。
	 * 
	 * @param module
	 *            中缀式的模块名，比如：campaign -> campaign,campaignGroup ->
	 *            campaign-group
	 * @param parentId
	 *            父亲的主键或者唯一ID
	 * @return 返回下拉框的数据。
	 */
	@RequestMapping("/provide/{module}")
	public @ResponseBody Map<String, List<? extends ISelector>> provide(
			@PathVariable String module, String[] parentId) {
		Assert.isTrue(StringUtils.isNotBlank(module));
		LOG.info("请求模块：" + module + ", 父ID：" + Arrays.toString(parentId));
		
		// 根据module查找对应的provider
		ISelectorProvider provider = null;
		String serviceBeanId = NamingUtil.toCamelCase(module).concat("Service");
		try {
			provider = getBean(ISelectorProvider.class, serviceBeanId);
		} catch (ClassCastException e) {
			LOG.error(StringUtils.EMPTY, e);
		}
		
		// 模块不支持selector
		LOG.info("模块对应beanId:"+serviceBeanId);
		if (provider == null) {
			String errorMsg = "/widget/selector/provide/" + module + " 找不到！";
			LOG.error(errorMsg);
			throw new NotFoundException(errorMsg);
		}
		
		// 返回数据。
		LOG.info("模块对应的service类："+provider.getClass());
		return provider.provideData(parentId);
	}

	/**
	 * 定义下拉框数据格式接口。
	 */
	public static interface ISelector {
		/**
		 * @return 标签值
		 */
		String getLabel();
		/**
		 * @return 实际值
		 */
		String getValue();
	}
	
	/**
	 * 定义选择器提供数据服务接口。
	 */
	public static interface ISelectorProvider {
		Map<String, List<? extends ISelector>> provideData(
				String[] parentId);
	}
}