package com.goafanti.demand.controller;

import java.util.Arrays;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.springframework.beans.BeanUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.goafanti.admin.service.AttachmentService;
import com.goafanti.common.bo.Result;
import com.goafanti.common.constant.AFTConstants;
import com.goafanti.common.constant.ErrorConstants;
import com.goafanti.common.controller.CertifyApiController;
import com.goafanti.common.enums.AttachmentType;
import com.goafanti.common.enums.DemandAuditStatus;
import com.goafanti.common.enums.DemandDataCategory;
import com.goafanti.common.enums.DemandFields;
import com.goafanti.common.model.Attachment;
import com.goafanti.common.model.Demand;
import com.goafanti.common.utils.StringUtils;
import com.goafanti.core.shiro.token.TokenManager;
import com.goafanti.demand.bo.InputDemand;
import com.goafanti.demand.service.DemandService;

@RestController
@RequestMapping(value = "/api/user/demand")
public class UserDemandApiController extends CertifyApiController {
	@Resource
	private DemandService		demandService;
	@Resource
	private AttachmentService		aftFileService;
	

	/**
	 * 成果需求匹配列表
	 */
	@RequestMapping(value = "/achievementDemand", method = RequestMethod.GET)
	public Result achievementDemand(String id) {
		Result res = new Result();
		res.setData(demandService.selectAchievementDemandListByDemandId(id));
		return res;
	}

	/**
	 * 下载技术需求批量导入Excel模板
	 */
	@RequestMapping(value = "/downloadTemplate", method = RequestMethod.GET)
	public Result downloadTemplateFile(HttpServletResponse response, String sign) {
		Result res = new Result();
		AttachmentType attachmentType = AttachmentType.getField(sign);
		if (attachmentType == AttachmentType.DEMAND_TEMPLATE) {
			String fileName = "";
			Attachment af = aftFileService.selectAftFileBySign(sign);
			if (null == af) {
				res.getError().add(buildError(ErrorConstants.FILE_NON_EXISTENT, "", "找不到文件！"));
			} else {
				String path = af.getFilePath();
				String suffix = path.substring(path.lastIndexOf("."));
				fileName = AttachmentType.DEMAND_TEMPLATE.getDesc() + suffix;
				downloadFile(response, fileName, path);
			}
		} else {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "附件标示"));
		}
		return res;
	}

	/**
	 * 用户需求列表
	 */
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public Result list(Integer auditStatus, Integer serialNumber, String name, String keyword, Integer demandType,
			String validityPeriodStartDate, String validityPeriodEndDate, Integer status, Integer releaseStatus,
			String releaseDateStartDate, String releaseDateEndDate,String createDateStartDate, String createDateEndDate, String pageNo, String pageSize) {
		Result res = new Result();
		Integer pNo = 1;
		Integer pSize = 10;
		if (StringUtils.isNumeric(pageSize)) {
			pSize = Integer.parseInt(pageSize);
		}

		if (StringUtils.isNumeric(pageNo)) {
			pNo = Integer.parseInt(pageNo);
		}
		res.setData(demandService.listDemand(auditStatus, serialNumber, name, keyword, demandType,
				validityPeriodStartDate, validityPeriodEndDate, status, releaseStatus, releaseDateStartDate,
				releaseDateEndDate,createDateStartDate,  createDateEndDate, pNo, pSize));
		return res;
	}

	/**
	 * 新增需求
	 */
	@RequestMapping(value = "/apply", method = RequestMethod.POST)
	public Result userApply(@Valid InputDemand demand, BindingResult bindingResult,
			@RequestParam(name = "keywords[]", required = false) String[] keywords,
			String validityPeriodFormattedDate) {
		Result res = new Result();
		if (bindingResult.hasErrors()) {
			res.getError().add(buildErrorByMsg(bindingResult.getFieldError().getDefaultMessage(),
					DemandFields.getFieldDesc(bindingResult.getFieldError().getField())));
			return res;
		}
		res = disposeDemand(res, demand, keywords);
		if (!res.getError().isEmpty()) {
			return res;
		}

		Demand d = new Demand();
		BeanUtils.copyProperties(demand, d);
		d.setEmployerId(TokenManager.getUserId());
		demandService.saveDemand(d, validityPeriodFormattedDate, keywords);
		return res;
	}

	/**
	 * 组织用户详情
	 */
	@RequestMapping(value = "/orgDemandDetail", method = RequestMethod.GET)
	public Result orgDemandDetail(String id) {
		Result res = new Result();

		if (StringUtils.isBlank(id)) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到需求ID", "需求ID"));
			return res;
		}

		res.setData(demandService.selectOrgDemandDetail(id));
		return res;
	}

	/**
	 * 个人需求详情
	 */
	@RequestMapping(value = "/userDemandDetail", method = RequestMethod.GET)
	public Result userDemandDetail(String id) {
		Result res = new Result();

		if (StringUtils.isBlank(id)) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到需求ID", "需求ID"));
			return res;
		}

		res.setData(demandService.selectUserDemandDetail(id));
		return res;
	}

	/**
	 * 修改需求
	 */
	@RequestMapping(value = "/update", method = RequestMethod.POST)
	public Result updateUser(@Valid InputDemand demand, BindingResult bindingResult,
			@RequestParam(name = "keywords[]", required = false) String[] keywords,
			String validityPeriodFormattedDate) {
		Result res = new Result();
		if (bindingResult.hasErrors()) {
			res.getError().add(buildErrorByMsg(bindingResult.getFieldError().getDefaultMessage(),
					DemandFields.getFieldDesc(bindingResult.getFieldError().getField())));
			return res;
		}

		if (StringUtils.isBlank(demand.getId())) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到需求ID", "需求ID"));
			return res;
		}

		if (!DemandAuditStatus.CREATE.getCode().equals(demand.getAuditStatus())
				&& !DemandAuditStatus.SUBMIT.getCode().equals(demand.getAuditStatus())
				&& !DemandAuditStatus.UNAUDITED.getCode().equals(demand.getAuditStatus())) {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "当前状态无法提交审核！"));
			return res;
		}

		res = disposeDemand(res, demand, keywords);
		if (!res.getError().isEmpty()) {
			return res;
		}

		Demand d = new Demand();
		BeanUtils.copyProperties(demand, d);
		d.setEmployerId(TokenManager.getUserId());
		res.setData(demandService.updateUserDemand(d, validityPeriodFormattedDate, keywords, null));
		return res;
	}

	/**
	 * 需求撤消发布(下架)
	 */
	@RequestMapping(value = "/offShelf", method = RequestMethod.POST)
	public Result offShelf(String id) {
		Result res = new Result();
		if (StringUtils.isBlank(id)) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到需求ID", "需求ID"));
			return res;
		}

		Demand d = demandService.selectByPrimaryKey(id);

		if (null == d) {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "需求ID"));
			return res;
		}

		res.setData(demandService.updateReleaseStatus(d));
		return res;
	}

	/**
	 * 删除需求(个人&团体)
	 */
	@RequestMapping(value = "/delete", method = RequestMethod.POST)
	public Result delete(@RequestParam(name = "ids[]", required = false) String[] ids) {
		Result res = new Result();
		if (ids == null || ids.length != 1) {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", ""));
		} else {
			
			res.setData(demandService.deleteByPrimaryKey(Arrays.asList(ids)));
		}
		return res;
	}

	/**
	 * 需求资料--图片上传
	 */
	@RequestMapping(value = "/uploadPicture", method = RequestMethod.POST)
	public Result uploadPicture(HttpServletRequest req, String sign) {
		Result res = new Result();

		AttachmentType attachmentType = AttachmentType.getField(sign);

		if (attachmentType == AttachmentType.DEMAND_PICTURE) {
			res.setData(handleFiles(res, "/demand/", false, req, sign, TokenManager.getUserId()));
		} else {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "附件标示"));
		}

		return res;
	}

	/**
	 * 需求资料--文本文件上传
	 */
	@RequestMapping(value = "/uploadTextFile", method = RequestMethod.POST)
	public Result uploadTextFile(HttpServletRequest req, String sign) {
		Result res = new Result();

		AttachmentType attachmentType = AttachmentType.getField(sign);

		if (attachmentType == AttachmentType.DEMAND_TEXT_FILE) {
			res.setData(handleFiles(res, "/demand/", false, req, sign, TokenManager.getUserId()));
		} else {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "附件标示"));
		}
		return res;
	}

	/**
	 * 下载需求文件--文本文件
	 */
	@RequestMapping(value = "/download", method = RequestMethod.GET)
	public Result download(HttpServletResponse response, String id) {
		Result res = new Result();

		if (StringUtils.isEmpty(id)) {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "需求ID"));
			return res;
		}

		Demand d = demandService.selectByPrimaryKey(id);
		if (null == d) {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "需求ID"));
			return res;
		}

		downloadUnPrivateFile(response, d.getTextFileDownloadFileName(), d.getTextFileUrl());
		return res;
	}

	private Result disposeDemand(Result res, InputDemand demand, String[] keywords) {
		if (StringUtils.isBlank(demand.getName())) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到需求名称", "需求名称"));
			return res;
		}

		if (!DemandDataCategory.USERDEMAND.getCode().equals(demand.getDataCategory())
				&& !DemandDataCategory.ORGDEMAND.getCode().equals(demand.getDataCategory())) {
			res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "数据类型"));
			return res;
		}

		if (StringUtils.isBlank(demand.getKeyword())) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到关键词", "关键词"));
			return res;
		}

		if (null == keywords || keywords.length < 1) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到关键词", "关键词"));
			return res;
		}

		if (null == demand.getIndustryCategoryA()) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到行业类别", "行业类别"));
			return res;
		}

		if (null == demand.getDemandType()) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到需求类型", "需求类型"));
			return res;
		}

		if (StringUtils.isBlank(demand.getProblemDes())) {
			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR, "找不到问题说明", "问题说明"));
			return res;
		}

		for (int i = 0; i < keywords.length; i++) {
			if (AFTConstants.KEYWORDLENTH < keywords[i].length()) {
				res.getError().add(buildError(ErrorConstants.PARAM_ERROR, "", "关键词长度"));
				return res;
			}
		}

		return res;
	}

}
