package com.cweb.controller;

import com.alibaba.fastjson.JSONObject;
import com.cweb.config.SysConst;
import com.hai.common.exception.ErrorCode;
import com.hai.common.exception.ErrorHelp;
import com.hai.common.exception.SysCode;
import com.hai.common.utils.HttpsUtils;
import com.hai.common.utils.ResponseMsgUtil;
import com.hai.common.utils.WxUtils;
import com.hai.entity.BsCompany;
import com.hai.entity.SecConfig;
import com.hai.entity.SecRegion;
import com.hai.model.ResponseData;
import com.hai.service.BsCompanyService;
import com.hai.service.CommonService;
import com.hai.service.SecConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.chanjar.weixin.common.util.crypto.SHA1;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RestController
@RequestMapping(value="/common")
@Api(value="共用接口")
public class CommonController {

	Logger log = LoggerFactory.getLogger(CommonController.class);
	
	@Resource
	private CommonService commonService;

	@Resource
	private SecConfigService secConfigService;

	@Resource
	private BsCompanyService bsCompanyService;


	@RequestMapping(value="/getDredgeProvince",method= RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "查询已开通的省份")
	public ResponseData getDredgeProvince(){
		try {
			List<BsCompany> list = bsCompanyService.getCompany(new HashMap<>());
			List<Map<String,Object>> mapList = new ArrayList<>();
			Map<String,Object> map;
			if (list.size() > 0) {
				for (BsCompany company : list) {
					map = new HashMap<>();
					if (StringUtils.isNotBlank(company.getRegionId())) {
						map.put("companyId", company.getId());
						map.put("regionId", company.getRegionId());
						SecRegion secRegion = commonService.getRegionsById(Long.parseLong(company.getRegionId()));
						if (secRegion != null) {
							map.put("regionName", secRegion.getRegionName());
						}
						mapList.add(map);
					}
				}
			}
			return ResponseMsgUtil.success(mapList);
		} catch (Exception e) {
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/getRegionsByParentId",method= RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "分级查询区域信息")
	public ResponseData getRegionsByParentId(@RequestParam(name = "regionId", required = false) Long regionId){
		try {
			if (regionId == null){
				return ResponseMsgUtil.success(commonService.getCities());
			}
			return ResponseMsgUtil.success(commonService.getRegionsByParentId(regionId));
		} catch (Exception e) {
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/getParentInfosByRegionId",method= RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "查询父级区域信息")
	public ResponseData getParentInfosByRegionId(@RequestParam(name = "regionId", required = true) Long regionId) {
		try {
			return ResponseMsgUtil.success(commonService.getParentInfoByRegionId(regionId));
		} catch (Exception e) {
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/getRegionsById",method= RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "查询区域详细信息")
	public ResponseData getRegionsById(@RequestParam(name = "regionId", required = true) Long regionId){
		try {
			return ResponseMsgUtil.success(commonService.getRegionsById(regionId));
		} catch (Exception e) {
			return ResponseMsgUtil.exception(e);
		}
	}


	@RequestMapping(value="/getDictionaries",method= RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "查询数据字典")
	public ResponseData getDictionaries(){
		try {
			return ResponseMsgUtil.success(commonService.getDictionaries());
		} catch (Exception e) {
			return ResponseMsgUtil.exception(e);
		}
	}



	@RequestMapping(value="/getDictionaryByCodeType",method = RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "根据 码值类型 查询数据字典")
	public ResponseData getDictionaryByCodeType(@RequestParam(name = "codeType", required = true) String codeType) {
		try {

			return ResponseMsgUtil.success(commonService.getDictionarys(codeType));

		} catch (Exception e) {
			log.error("CommonController --> getDictionaryByCodeType() error!", e);
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/mappingSysNameOl",method = RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "根据 码值类型 查询数据字典")
	public ResponseData mappingSysNameOl(@RequestParam(name = "codeType", required = true) String codeType) {
		try {

			return ResponseMsgUtil.success(commonService.mappingSysNameOl(codeType));

		} catch (Exception e) {
			log.error("CommonController --> getDictionaryByCodeType() error!", e);
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/getDictionaryByCodeTypeOl",method = RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "根据 码值类型 查询数据字典")
	public ResponseData getDictionaryByCodeTypeOl(@RequestParam(name = "codeType", required = true) String codeType) {
		try {

			return ResponseMsgUtil.success(secConfigService.findByCodeType(codeType));

		} catch (Exception e) {
			log.error("CommonController --> getDictionaryByCodeType() error!", e);
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/updateDictionary",method = RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "根据 码值类型 查询数据字典")
	public ResponseData updateDictionary(
			@RequestParam(name = "codeType", required = true) String codeType,
			@RequestParam(name = "codeValue", required = true) String codeValue
	) {
		try {

			SecConfig secConfig = secConfigService.findByCodeType(codeType);
			secConfig.setCodeValue(codeValue);
			secConfigService.updateSecConfig(secConfig);

			return ResponseMsgUtil.success("修改成功");
		} catch (Exception e) {
			log.error("CommonController --> getDictionaryByCodeType() error!", e);
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/getDictionaryByCodeTypeAndExt",method = RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "根据 码值类型 查询数据字典")
	public ResponseData getDictionaryByCodeTypeAndExt(@RequestParam(name = "codeType", required = true) String codeType, String ext1) {
		try {

			return ResponseMsgUtil.success(commonService.getDictionarysAndExt(codeType,ext1));

		} catch (Exception e) {
			log.error("CommonController --> getDictionaryByCodeType() error!", e);
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/getIdAndNameByCodeType",method = RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "根据 码值类型 查询数据字典的id和name")
	public ResponseData getIdAndNameByCodeType(@RequestParam(name = "codeType", required = true) String codeType) {
		try {

			return ResponseMsgUtil.success(commonService.getIdAndName(codeType));

		} catch (Exception e) {
			log.error("CommonController --> getIdAndNameByCodeType() error!", e);
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value="/getDictionaryByCodeTypeAndValue",method = RequestMethod.GET)
	@ResponseBody
	@ApiOperation(value = "根据码值类型及value查询数据字典")
	public ResponseData getDictionaryByCodeType(@RequestParam(name = "codeType", required = true) String codeType,
												@RequestParam(name = "codeValue", required = true) String codeValue) {
		try {

			return ResponseMsgUtil.success(commonService.mappingSysCode(codeType,codeValue));

		} catch (Exception e) {
			log.error("CommonController --> getDictionaryByCodeTypeAndValue() error!", e);
			return ResponseMsgUtil.exception(e);
		}
	}

	@RequestMapping(value = "/getScanCodePageHtmlSign", method = RequestMethod.POST)
	@ResponseBody
	@ApiOperation(value = "获取扫码页面签名")
	public ResponseData getScanCodePageHtmlSign(@RequestBody JSONObject body) {
		try {
			if (body == null || StringUtils.isBlank(body.getString("url"))) {
				log.error("getH5UserInfo error!", "参数校验失败"  );
				throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "");
			}

			Map<String, Object> params = new HashMap<>();
			params.put("appid", SysConst.getSysConfig().getWxH5AppId());
			params.put("secret", SysConst.getSysConfig().getWxH5AppSecret());
			params.put("grant_type", "client_credential");

			JSONObject accessTokenObject = HttpsUtils.doGet("https://api.weixin.qq.com/cgi-bin/token", params);
			if (accessTokenObject == null) {
				log.error("getH5UserInfo error!", "获取微信access_token失败"  );
				throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "获取微信access_token失败");
			}

			params.clear();
			params.put("access_token", accessTokenObject.getString("access_token"));
			params.put("type", "jsapi");
			JSONObject jsapiTicketObject = HttpsUtils.doGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket", params);
			if (jsapiTicketObject == null) {
				log.error("getH5UserInfo error!", "获取微信jsapi_ticket失败"  );
				throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "获取微信jsapi_ticket失败");
			}

			params = new HashMap<>();
			params.put("noncestr", WxUtils.makeNonStr());
			params.put("jsapi_ticket", jsapiTicketObject.getString("ticket"));
			params.put("timestamp", System.currentTimeMillis() / 1000);
			params.put("url", body.getString("url"));

			String signatureStr = WxUtils.generateSignature(params);
			System.out.println(signatureStr);
			params.put("signature", SHA1.gen(signatureStr));
			return ResponseMsgUtil.success(params);

		} catch (Exception e) {
			return ResponseMsgUtil.exception(e);
		}
	}

    @RequestMapping(value = "/findByLatAndLng", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "获取定位信息")
    public ResponseData findByLatAndLng(
            @RequestParam(name = "lng", required = true) String lng,
            @RequestParam(name = "lat", required = true) String lat
    ) {
        try {

            JSONObject object = commonService.findByLatAndLng(lng , lat);

            return ResponseMsgUtil.success(object);

        } catch (Exception e) {
            log.error("HighOrderController --> unionStagingPay() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

}
