//package org.springblade.etl.controller.bi;
//
//import java.util.ArrayList;
//import java.util.Base64;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//import java.util.stream.Collectors;
//import java.util.stream.Stream;
//
//import javax.servlet.http.HttpServletRequest;
//
//import org.springblade.core.boot.ctrl.BladeController;
//import org.springblade.core.mp.support.Condition;
//import org.springblade.core.mp.support.Query;
//import org.springblade.core.secure.BladeUser;
//import org.springblade.core.tool.api.R;
//import org.springblade.core.tool.utils.Func;
//import org.springblade.etl.dto.ApiReleaseDTO;
//import org.springblade.etl.dto.DataApiDTO;
//import org.springblade.etl.entity.ApiConfig;
//import org.springblade.etl.entity.ApiConfigDetail;
//import org.springblade.etl.entity.DataApi;
//import org.springblade.etl.entity.Dimension;
//import org.springblade.etl.entity.ReportDatasource;
//import org.springblade.etl.service.ApiConfigDetailService;
//import org.springblade.etl.service.ApiConfigService;
//import org.springblade.etl.service.DataApiService;
//import org.springblade.etl.service.QueryWrapperService;
//import org.springblade.etl.service.ReportDatasourceService;
//import org.springblade.etl.util.CubeUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PathVariable;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//
//import com.alibaba.fastjson2.JSON;
//import com.alibaba.fastjson2.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
//
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.http.HttpUtil;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//import io.swagger.annotations.ApiParam;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//
///**
// * 数据接口 控制器
// *
// * @author BladeX
// * @since 2021-04-17
// */
//@Slf4j
//@RestController
//@RequiredArgsConstructor
//@RequestMapping("report/dataapi")
//@Api(value = "数据接口", tags = "数据接口接口 DataApiController")
//public class DataApiController extends BladeController {
//
//	@Value("${apimngr.insertUrl}")
//	private String insertUrl;
//
//	private final DataApiService dataApiService;
//	private final ReportDatasourceService reportDatasourceService;
//	private final QueryWrapperService queryWrapperService;
//	private final ApiConfigService apiConfigService;
//	private final ApiConfigDetailService apiConfigDetailService;
//
//	/**
//	 * 详情
//	 */
//	@GetMapping("/detail")
//	@ApiOperationSupport(order = 1)
//	@ApiOperation(value = "详情 detail", notes = "传入dataApi")
//	public R<DataApi> detail(DataApi dataApi) {
//		DataApi detail = dataApiService.getOne(Condition.getQueryWrapper(dataApi));
//		return R.data(detail);
//	}
//
//	/**
//	 * 分页 数据接口
//	 */
//	@GetMapping("/list")
//	@ApiOperationSupport(order = 2)
//	@ApiOperation(value = "列表 list", notes = "传入dataApi")
//	public R<List<DataApi>> list(DataApi dataApi, String apiTypes) {
//		QueryWrapper<DataApi> queryWrapper = Condition.getQueryWrapper(dataApi);
//		if (StrUtil.isNotBlank(apiTypes)) {
//			String[] apiTypeArr = apiTypes.split(",");
//			queryWrapper.lambda().in(DataApi::getApiType, Stream.of(apiTypeArr).map(Integer::valueOf).collect(Collectors.toList()));
//		}
//		if (StrUtil.isNotBlank(dataApi.getApiName())) {
//			queryWrapper.lambda().like(DataApi::getApiName, dataApi.getApiName());
//		}
//		List<DataApi> list = dataApiService.list(queryWrapper);
//		return R.data(list);
//	}
//
//	/**
//	 * 自定义分页 数据接口
//	 */
//	@GetMapping("/page")
//	@ApiOperationSupport(order = 3)
//	@ApiOperation(value = "分页 page", notes = "传入dataApi")
//	public R<IPage<DataApi>> page(DataApi dataApi, Query query) {
////		dataApi.setCreateUserId(getUser().getUserId());
//		QueryWrapper<DataApi> queryWrapper = Condition.getQueryWrapper(dataApi);
//		return R.data(dataApiService.page(Condition.getPage(query), queryWrapper));
//	}
//
//	/**
//	 * 新增或修改 数据接口
//	 */
//	@PostMapping("/submit")
//	@ApiOperationSupport(order = 6)
//	@ApiOperation(value = "新增或修改", notes = "传入dataApi")
//	public R<DataApi> submit(@RequestBody String value) throws Exception{
//		String decoderStr = new String(Base64.getDecoder().decode(value), "utf-8");
//		DataApiDTO dataApiDTO = JSON.parseObject(decoderStr, DataApiDTO.class);;
//		DataApi dataApi = dataApiDTO;
//		if (null == dataApi.getApiType()) {
//			return R.fail("API类型不能为空");
//		}
//		if (StrUtil.isBlank(dataApi.getApiKey())) {
//			return R.fail("api关键词不可以为空");
//		}
//		if (2 != dataApi.getApiType() && null == dataApi.getDatasourceId()) {
//			return R.fail("api数据源不可以为空");
//		}
//		if (1 == dataApi.getApiType() && StrUtil.isBlank(dataApi.getQuerySql())) {
//			return R.fail("常规接口查询sql不可以为空");
//		}
//		if (1 == dataApi.getApiType() && checkSqlKeywords(dataApi.getQuerySql())) {
//			return R.fail("查询sql包含非法关键字");
//		}
//		if (3 == dataApi.getApiType() && StrUtil.isBlank(dataApi.getQueryParam())) {
//			return R.fail("业务参数不能为空");
//		}
//		//新增：设置创建人ID
//		if(dataApi.getId() == null) {
//			dataApi.setCreateUserId(getUser().getUserId());
//		}
//		if (1 == dataApi.getApiType()) {
//			dataApi.setApiUrl("/report/dataapi/" + dataApi.getApiKey());
//		}else if(3 == dataApi.getApiType()) {
//			dataApi.setApiUrl("/data-api/" + dataApi.getApiKey());
//		}  else if (0 == dataApi.getApiType()) {
//			dataApi.setApiUrl("/report/reportApi/" + dataApi.getApiKey());
//			//报表型接口处理配置信息
//			QueryWrapper queryWrapper = new QueryWrapper();
//			queryWrapper.eq("api_id", dataApi.getId());
//			List<ApiConfig> configList = apiConfigService.list(queryWrapper);
//			if (null != configList && configList.size() > 0) {
//				for (ApiConfig apiConfig : configList) {
//					QueryWrapper detailWrapper = new QueryWrapper();
//					detailWrapper.eq("api_config_id", apiConfig.getId());
//					apiConfigDetailService.remove(detailWrapper);//删除configdetail
//				}
//			}
//			apiConfigService.remove(queryWrapper);//删除config
//
//			List<Dimension> columnParamList = dataApiDTO.getColumnParamList();
//			List<Dimension> rowParamList = dataApiDTO.getRowParamList();
//			List<Dimension> indexParamList = dataApiDTO.getIndexParamList();
//			if (null != columnParamList && columnParamList.size() > 0) {
//				ApiConfig apiConfig = new ApiConfig();
//				apiConfig.setApiId(dataApi.getId());
//				apiConfig.setConfigType(1);
//				apiConfigService.save(apiConfig);
//				int i = 0;
//				for (Dimension dimension : columnParamList) {
//					ApiConfigDetail apiConfigDetail = new ApiConfigDetail();
//					apiConfigDetail.setApiConfigId(apiConfig.getId());
//					apiConfigDetail.setDimensionId(dimension.getId());
//					apiConfigDetail.setSortOrder(i++);
//					apiConfigDetailService.save(apiConfigDetail);
//				}
//			}
//			if (null != rowParamList && rowParamList.size() > 0) {
//				ApiConfig apiConfig = new ApiConfig();
//				apiConfig.setApiId(dataApi.getId());
//				apiConfig.setConfigType(2);
//				apiConfigService.save(apiConfig);
//				int i = 0;
//				for (Dimension dimension : rowParamList) {
//					ApiConfigDetail apiConfigDetail = new ApiConfigDetail();
//					apiConfigDetail.setApiConfigId(apiConfig.getId());
//					apiConfigDetail.setDimensionId(dimension.getId());
//					apiConfigDetail.setSortOrder(i++);
//					apiConfigDetailService.save(apiConfigDetail);
//				}
//			}
//			if (null != indexParamList && indexParamList.size() > 0) {
//				ApiConfig apiConfig = new ApiConfig();
//				apiConfig.setApiId(dataApi.getId());
//				apiConfig.setConfigType(3);
//				apiConfigService.save(apiConfig);
//				int i = 0;
//				for (Dimension dimension : indexParamList) {
//					ApiConfigDetail apiConfigDetail = new ApiConfigDetail();
//					apiConfigDetail.setApiConfigId(apiConfig.getId());
//					apiConfigDetail.setDimensionId(dimension.getId());
//					apiConfigDetail.setSortOrder(i++);
//					apiConfigDetailService.save(apiConfigDetail);
//				}
//			}
//		}
//		dataApiService.saveOrUpdate(dataApi);
//		return R.data(dataApi);
//	}
//
//
//	/**
//	 * 删除 数据接口
//	 */
//	@PostMapping("/remove")
//	@ApiOperationSupport(order = 7)
//	@ApiOperation(value = "删除 remove", notes = "传入ids")
//	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
//		return R.status(dataApiService.removeByIds(Func.toLongList(ids)));
//	}
//
//	@GetMapping("/{apiKey}")
//	@ApiOperation(value = "执行常规类接口", notes = "传入apiKey【说明：第三方接口传递apiParam(接口参数)】")
//	public R executeDataApi(@PathVariable("apiKey") String apiKey, String apiParam, Integer pageNum,HttpServletRequest request) {
//		log.info("executeDataApi："+apiKey);
//		if (StrUtil.isBlank(apiKey)) {
//			return R.fail("接口关键词不可以为空");
//		}
//		DataApi dataApi = dataApiService.getByApiKey(apiKey);
//		if (null == dataApi) {
//			return R.fail("接口不存在，请检查接口关键词");
//		}
//		if(dataApi.getApiType() == 2) { //第三方接口
//			//获取header
//			Map<String, String> headers = null;
//			if(!StrUtil.isEmpty(dataApi.getApiHeaders())) {
//				headers = JSON.parseObject(dataApi.getApiHeaders(), Map.class);
//			}
//			JSONObject queries = new JSONObject();
//			String postJson = apiParam == null ? "" : apiParam;
//			if(!StrUtil.isEmpty(apiParam)) {
//				queries = JSON.parseObject(apiParam);
//			}
//			if("post".equalsIgnoreCase(dataApi.getApiMethod())) {
//				if(dataApi.getApiParamType() == 0) { //JSON方式
//					return R.data(HttpUtil.createPost(dataApi.getApiUrl()).addHeaders(headers).body(postJson).execute().body());
//				}else {
//					return R.data(HttpUtil.createPost(dataApi.getApiUrl()).addHeaders(headers).form(queries).execute().body());
//				}
//			}else {
//				return R.data(HttpUtil.createGet(dataApi.getApiUrl()).addHeaders(headers).form(queries).execute().body());
//			}
//		}else {
//			if (null == dataApi.getDatasourceId()) {
//				return R.fail("接口未配置数据源");
//			}
//			if (1 != dataApi.getApiType()) {
//				return R.fail("接口类型配置错误");
//			}
//			if (null != dataApi.getLoginRequired() && 1 == dataApi.getLoginRequired()) {
//				BladeUser user = getUser();
//				if (null == user) {
//					return R.fail("未登录");
//				}
//			}
//			String querySql = dataApi.getQuerySql();
//			Map<String, String[]> maps = request.getParameterMap();
//			String regex = "\\@(.*?)\\@";
//			Pattern p = Pattern.compile(regex);
//			Matcher m = p.matcher(querySql);
//			//Map<String, Object> params = new HashMap<>();
//			List<String> paramList = new ArrayList<>();
//			while (m.find()) {
//				String key = m.group(1);
//				if (StrUtil.isNotBlank(key)) {
//					paramList.add(key);
//				}
//			}
//			String regex2 = "\\@@(.*?)\\@@";
//			Pattern p2 = Pattern.compile(regex2);
//			Matcher m2 = p2.matcher(querySql);
//			while (m2.find()) {
//				String key = m2.group(1);
//				if (StrUtil.isNotBlank(key)) {
//					paramList.add(key);
//				}
//			}
//			ReportDatasource datasource = reportDatasourceService.getById(dataApi.getDatasourceId());
//			if (null == datasource) {
//				return R.fail("接口数据源配置错误");
//			}
//			for (String key : paramList) {
//				String value = "";
//				if (maps.size() > 0 && null != maps.get(key)) {
//					value = maps.get(key)[0];
//					if (checkSqlKeywords(value)) {
//						return R.fail("入参包含非法字符");
//					}
//				}
//				if (querySql.contains("@@" + key + "@@")) {
//					if (StrUtil.isNotBlank(value)) {
//						querySql = querySql.replaceAll("@@" + key + "@@", value);
//					} else {
//						querySql = querySql.replaceAll("@@" + key + "@@", "1=1 ");
//					}
//				} else if (querySql.contains("@" + key + "@")) {
//					querySql = querySql.replace("@" + key + "@", "'" + value + "'");
//				}
//
//			}
//			Map<String, Object> result = new HashMap<>();
//			result.put("current", pageNum);
////			List<Map<String, Object>> list =new ArrayList<>();
//			if (dataApi.getIsPage()== 0){
//				List<Map<String, Object>> list = queryWrapperService.select(datasource, querySql);
//				result.put("records", list);
//				result.put("total", list.size());
//			}else {
//				IPage<?> page = new Page<>();
//				page.setSize(dataApi.getPageSize());
//				if (pageNum == null){
//					pageNum=1;
//				}
//				page.setCurrent(pageNum);
//				IPage<Map<String, Object>> selectPage = queryWrapperService.selectPage(page,datasource, querySql);
////				Integer count = queryWrapperService.selectCount(datasource, "select count(1) "+querySql.substring(querySql.lastIndexOf("from " + dataApi.getQueryTable())));
//				result.put("records", selectPage != null ? selectPage.getRecords() : null);
//				result.put("total", selectPage != null ? selectPage.getTotal() : 0);
//			}
//			return R.data(result);
//		}
//
//	}
//
//	@PostMapping("/check")
//	@ApiOperation(value = "检测ApiKey是否存在接口", notes = "传入apiKey")
//	public R<Boolean> checkApiKey(@RequestParam String apiKey){
//		QueryWrapper queryWrapper = new QueryWrapper();
//		queryWrapper.eq("api_key", apiKey);
//		DataApi dataApi = dataApiService.getOne(queryWrapper);
//		if (null == dataApi) {
//			return R.data(false, "接口不存在");
//		}else {
//			return R.data(true, "接口存在");
//		}
//	}
//	@PostMapping("/release")
//	@ApiOperation(value = "发布api到数据门户", notes = "发布api到数据门户")
//	public R release(
//					 @RequestBody ApiReleaseDTO apiReleaseDTO,
//					 HttpServletRequest request){
////		Map<String, Object> paramMap =new HashMap<>();
////		paramMap.put("name",name);//接口名字
////		paramMap.put("url",url);//请求地址
////		paramMap.put("version",version);//接口版本
////		paramMap.put("description",description);//接口备注
////		paramMap.put("callLimit",callLimit);//调用量限制
////		paramMap.put("qpsLimit",qpsLimit);//QPS限制
////		paramMap.put("status",status);//状态  1=正常 0=不正常 2=测试（未发布） 3=VIP
////		paramMap.put("apiTypeId",apiTypeId);//接口类型id
////		paramMap.put("extJson",extJson);
//		String resBody = HttpUtil.createPost(insertUrl).body(JSON.toJSONString(apiReleaseDTO)).execute().body();
//		JSONObject result = JSONObject.parseObject(resBody);
//		if (result.getString("code").equals("10000")){
//			return R.success("接口发布成功!");
//		}else {
//			return R.fail(result.getString("message"));
//		}
//	}
//
//	Boolean checkSqlKeywords(String sql) {
////		String str = sql.toLowerCase();
////		if (str.contains("insert") || str.contains("update") || str.contains("delete") || str.contains("drop") || str.contains("alter") || str.contains("set")) {
////			return true;
////		}
////		return false;
//		return CubeUtils.checkSqlInject(sql);
//	}
//}
