package com.gx.obe.thread;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Optional;

import org.apache.log4j.Logger;

import com.gx.obe.WebserviceConstants;
import com.gx.obe.business.http.HttpResponse;
import com.gx.obe.business.http.HttpUrl;
import com.gx.obe.business.http.HttpUtils;
import com.gx.obe.common.widget.thread.MyThread;
import com.gx.obe.components.core.Constants;
import com.gx.obe.components.core.enumeration.CommonEnum;
import com.gx.obe.components.core.enumeration.TenderProjectEnum;
import com.gx.obe.config.utils.PropertiesUtils;
import com.gx.obe.listener.ProgressMessageAdapter;
import com.gx.obe.util.utils.StringUtils;
import com.gx.obe.web.entity.TransactionServer;
import com.gx.obe.web.entity.auth.AuthUser;
import com.gx.obe.web.entity.tender.TenderProjectEntity;
import com.gx.obe.web.entity.tender.TenderProjectRuleEntity;
import com.gx.obe.web.service.TenderProjectService;
import com.gx.obe.web.service.evaluation.EvaluationFactorService;

import net.sf.json.JSONObject;

/**
 * @Description: 下载项目信息线程
 * @author guoyr
 */
public class NewDownloadProjectInfoThread extends MyThread{
	private TenderProjectService tenderProjectService = new TenderProjectService() ;
	private EvaluationFactorService evaluationFactorService;
//	private TransactionServerService transactionServerService = ServiceFactory.getInstance("transactionServerService", TransactionServerService.class);
	private ProgressMessageAdapter callBack;
	private Logger LOG = Logger.getLogger(NewDownloadProjectInfoThread.class);	
	private boolean isOpeningUser;
	private String userName;
	private String passWord;
	private TransactionServer transactionServer;
	private TenderProjectEntity downloadProject;
	private boolean downloadEvaluationFactor = false;
	private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	public NewDownloadProjectInfoThread(TransactionServer transactionServer, boolean isOpeningUser, String userName, String passWord, TenderProjectEntity downloadProject, boolean downloadEvaluationFactor, ProgressMessageAdapter callBack){
		this.isOpeningUser = isOpeningUser;
		this.callBack = callBack;
		this.downloadProject = downloadProject;
		this.userName = userName;
		this.passWord = passWord;
		this.transactionServer = transactionServer;
		this.downloadEvaluationFactor = downloadEvaluationFactor;
	}
	
	@Override
	public void run() {

		List<TenderProjectEntity> tenderPackList = downloadProject.getChildList();
		if(null != downloadProject.getId() && downloadProject.getId().length() > 0){
			downloadProject = tenderProjectService.getById(downloadProject.getId());
		}else {
			// 在库中再查询一次			
			TenderProjectEntity queryParentProject = tenderProjectService.getTenderProjectByPhaseTypeTenderNumber(downloadProject.getTenderNo(),downloadProject.getPhaseType(),downloadProject.getTenderNumber());
			if(null != queryParentProject){
				downloadProject = queryParentProject;
			}
		}
		boolean downloadFlag = false;
		if(null != tenderPackList && tenderPackList.size() > 0){
			if(null != downloadProject){
				callBack.message("开始同步 [" + downloadProject.getTenderName()+"]项目信息...", 0);
			}
			for(TenderProjectEntity tenderPack : tenderPackList){
				boolean downPackFlag = downloadProjectDetail(tenderPack, downloadProject);
				if(downPackFlag) {
					if(null == downloadProject.getId()) {
						TenderProjectEntity queryParentProject = tenderProjectService.getTenderProjectByPhaseTypeTenderNumber(downloadProject.getTenderNo(),downloadProject.getPhaseType(),downloadProject.getTenderNumber());
						if(null != queryParentProject){
							downloadProject = queryParentProject;
						}
					}
					if(!downloadFlag) {
						downloadFlag = true;
					}
				}else {
					downloadFlag = false;
				}
			}
		}else if(null == downloadProject.getId()){
			downloadFlag = downloadProjectDetail(downloadProject, null);
		}
	
		if(null != callBack){
			callBack.finish(downloadFlag);
		}
	}

	/**
	 * @Description: 
	 * 
	 * @author guoyr
	 * @param webAddress
	 * @param invokeMethod
	 * @param prjCodeCode 项目编号
	 * @param packCode 包件编号
	 * @param phaseType 阶段类型[00表示资格预审阶段 01表示招标文件阶段 默认01]
	 * @param userName
	 * @param password
	 * @return
	 */
	public boolean downloadProjectDetail(TenderProjectEntity tenderProject, TenderProjectEntity parentTenderProject){
		boolean downloadFlag = false;
		HttpUrl httpUrl = HttpUtils.getProjectHttpUrl(tenderProject, parentTenderProject, transactionServer, PropertiesUtils.getWebserviceProperty(WebserviceConstants.GET_PROJECT_INFO_METHOD, "tenderProjectInfoHS.do?getProjectInfoByPackCode"));

		httpUrl.setAttributeEncode("userName", userName);
		httpUrl.setAttribute("password", passWord);
		callBack.message("正在同步 [" + tenderProject.getTenderName()+"]信息...", 0);
		HttpResponse httpResponse = HttpUtils.doPost(httpUrl);
		downloadFlag = resolveXml(tenderProject, parentTenderProject, httpResponse);
	
		StringBuilder msg = new StringBuilder();
		msg.append("[").append(tenderProject.getTenderNo()).append("]").append(tenderProject.getTenderName());
		if(downloadFlag){
			callBack.message(msg.toString()+" 信息同步成功!", 1);
		}else {
			callBack.message(msg.toString()+" 信息同步失败!", -1);
		}
	
		return downloadFlag;
	}
	
	/**
	 * @Description: 解析返回的xml
	 * @author guoyr
	 * @param tenderProjectNote
	 * @param xmlStr
	 * @return 
	 */
	private boolean resolveXml(TenderProjectEntity tenderProject, TenderProjectEntity parentProject, HttpResponse httpResponse){
		if(!httpResponse.getStatus()){
			callBack.message("消息:"+httpResponse.getMsg(), -1);
			return false;
		}
		try {
			JSONObject tenderProjectJSON = (JSONObject)httpResponse.getDataJSONObject("tenderProjectList");
			AuthUser user = Constants.USER;
			TenderProjectRuleEntity parentRule = null;
			TenderProjectRuleEntity childRule = null;
			// 如唱歌是不分包项目
			if(null == parentProject){
				childRule = new TenderProjectRuleEntity();
				resloverJsonObject(tenderProjectJSON, tenderProject, childRule, false, user);
				tenderProject.setIsPack(CommonEnum.NO);
			}else {
				parentRule = new TenderProjectRuleEntity();
				childRule = new TenderProjectRuleEntity();
				JSONObject childtenderProjectJSON = (JSONObject)httpResponse.getDataJSONObject("packInfoList");
				resloverJsonObject(tenderProjectJSON, parentProject, parentRule, false, user);
				resloverJsonObject(childtenderProjectJSON, tenderProject, parentProject, childRule, true, user);
				parentProject.setIsPack(CommonEnum.YES);
				tenderProject.setParentProjectEntity(parentProject);
				
			}
			tenderProject = tenderProjectService.saveDownLoadProject(parentProject, tenderProject, parentRule, childRule);
			if(StringUtils.isNotEmpty(tenderProject.getId())){
				//下载项目指标信息与供应商信息\
				downTenderProjectOtherInfo(tenderProject);
				return true;
			}
		} catch (Exception e1) {
			LOG.error("========下载项目信息返回XML========="+httpResponse.getContent(), e1);
		}
		return false;
	}
	
	private void resloverJsonObject(JSONObject tenderProjectJSON, TenderProjectEntity tenderProjectEntity, TenderProjectRuleEntity tenderProjectRuleEntity, boolean isPackage, AuthUser user){
		resloverJsonObject(tenderProjectJSON, tenderProjectEntity, null, tenderProjectRuleEntity, isPackage, user);
	}
	
	private void resloverJsonObject(JSONObject tenderProjectJSON, TenderProjectEntity tenderProjectEntity, TenderProjectEntity parentProject, TenderProjectRuleEntity tenderProjectRuleEntity, boolean isPackage, AuthUser user){
		if(isPackage){
			tenderProjectEntity.setTenderNo((String)tenderProjectJSON.get("packCode"));
			tenderProjectEntity.setTenderName((String)tenderProjectJSON.get("packName"));
		}else {
			tenderProjectEntity.setTenderNo((String)tenderProjectJSON.get("tenderNo"));
			tenderProjectEntity.setTenderName((String)tenderProjectJSON.get("tenderName"));
		}
		
		tenderProjectEntity.setPurcategoryNames((String)tenderProjectJSON.get("purcategoryNames"));//采购品目
		tenderProjectEntity.setPurchaserName((String)tenderProjectJSON.get("buyersName"));//招标人
		tenderProjectEntity.setTenderMethod((String)tenderProjectJSON.get("tenderMethod"));
		String agentName = (String)tenderProjectJSON.get("agentName");
		if(StringUtils.isEmpty(agentName) && null != parentProject) {
			agentName = parentProject.getAgentName();
		}
		tenderProjectEntity.setAgentName(agentName);
		tenderProjectEntity.setTenderType((String)tenderProjectJSON.get("tenderType"));
		tenderProjectEntity.setTenderNumber((String)tenderProjectJSON.get("tenderNoNumber"));
		if(null != tenderProjectJSON.get("orderlevel")){
			tenderProjectEntity.setSortNo((Integer)tenderProjectJSON.get("orderlevel"));
		}
		String enterType = (String)tenderProjectJSON.get("enterType");
		if(null == enterType || enterType.length() == 0){
			enterType = null == parentProject ? TenderProjectEnum.ENTRY_TYPE_RECOMMON : parentProject.getEnterType();
		}
		tenderProjectEntity.setEnterType(enterType);
		tenderProjectEntity.setManagerName(user.getUserName());				
		tenderProjectEntity.setCreateUser(user.getId());
		tenderProjectEntity.setStageId((String)tenderProjectJSON.get("stageId"));
		if(isOpeningUser) {
			tenderProjectEntity.setOpeningUserId(user.getId());
		}else {
			tenderProjectEntity.setUserId(user.getId());
		}
		tenderProjectEntity.setPhaseType((String)tenderProjectJSON.get("stageType"));
		tenderProjectEntity.setServerAccount(userName);
		tenderProjectEntity.setServerPassword(passWord);
		tenderProjectEntity.setUseStatus(user.getUseStatus());
		tenderProjectEntity.setTransactionServerId(transactionServer.getId());
		String remoteStatus = TenderProjectEnum.REMOTE;
		if("03".equals((String)tenderProjectJSON.get("itemType"))){
//			平台中的属性 itemType   项目立项类型     00:平台全流程项目 03:平台半流程项目@马到成功
			remoteStatus = TenderProjectEnum.HALF_PROCESS;
		}
		
		tenderProjectEntity.setRemoteStatus(remoteStatus);
		tenderProjectEntity.setIsPack((String)tenderProjectJSON.get("isPack"));
		String createTimeStr = (String)tenderProjectJSON.get("createTime");
		String signUpStartTimeStr = (String)tenderProjectJSON.get("signUpStartTime");//公告发布时间
		String docSaleStartTimeStr = (String)tenderProjectJSON.get("docSaleStartTime");//文件售卖开始时间
		String docSaleEndTimeStr = (String)tenderProjectJSON.get("docSaleEndTime");
		String appraiseStartTimeStr = (String)tenderProjectJSON.get("appraiseStartTime");
		tenderProjectRuleEntity.setParam("appraiseStartTime", appraiseStartTimeStr);
		if(null != signUpStartTimeStr && !"".equals(signUpStartTimeStr)){
			try {
				tenderProjectRuleEntity.setSignupStartTime(format.parse(signUpStartTimeStr));
			} catch (ParseException e) {
				LOG.error("格式化时间错误:"+createTimeStr +e.getMessage());
			}
		}
		if(null != docSaleStartTimeStr && !"".equals(docSaleStartTimeStr)){
			try {
				tenderProjectRuleEntity.setDocSaleStartTime(format.parse(docSaleStartTimeStr));
			} catch (ParseException e) {
				LOG.error("格式化时间错误:"+createTimeStr +e.getMessage());
			}
		}
		if(null != docSaleEndTimeStr && !"".equals(docSaleEndTimeStr)){
			try {
				tenderProjectRuleEntity.setDocSaleEndTime(format.parse(docSaleEndTimeStr));
			} catch (ParseException e) {
				LOG.error("格式化时间错误:"+createTimeStr +e.getMessage());
			}
		}
		String buyBidFileCount = (String)tenderProjectJSON.get("docSaleCount");
		if(StringUtils.isEmpty(buyBidFileCount) && null != parentProject) {
			buyBidFileCount = parentProject.getEvaluationParamByKey("buyBidFileCount");
		}
		tenderProjectEntity.setEvaluationParam("buyBidFileCount", buyBidFileCount);
		
//		tenderProjectEntity.setPurchaserName((String)tenderProjectJSON.get("purcategoryNames"));
//		String SIGNUPSTARTTIMESTR = (String)tenderProjectJSON.get("signUpStartTime");//公告发布时间
//		String docSaleStartTimeStr = (String)tenderProjectJSON.get("DOCSALESTARTTIME");//文件售卖开始时间
//		String docSaleEndTimeStr = (String)tenderProjectJSON.get("docSaleEndTime");
//		String PURCATEGORY_NAMES = (String)tenderProjectJSON.get("purcategoryNames");
		
		String limitPriceString = (String)tenderProjectJSON.get("limitPrice");
		if(StringUtils.isNotEmpty(limitPriceString)){
			BigDecimal limitPrice = new BigDecimal(limitPriceString);
			tenderProjectEntity.setBidPriceLimit(limitPrice);
		}
		if(null != createTimeStr && !"".equals(createTimeStr)){
			try {
				tenderProjectEntity.setCreateTime(format.parse(createTimeStr));
			} catch (ParseException e) {
				LOG.error("格式化时间错误:"+createTimeStr +e.getMessage());
			}
		}
		String isRemoteOpening = (String)tenderProjectJSON.get("isRemoteOpening");
		// 默认辅助开标
		tenderProjectRuleEntity.setBidOpeningType(TenderProjectEnum.BIDOPENING_ASSIST);
		//两步开标
		String bidOpenStage = (String)tenderProjectJSON.get("isTwoBidOpening");
		
		if(null != bidOpenStage && bidOpenStage.trim().equals(TenderProjectEnum.BID_OPENING_TWO_STAGE)){
			tenderProjectRuleEntity.setBidOpeningStage(TenderProjectEnum.BID_OPENING_TWO_STAGE);
			String bidOpeningStartTimeString = (String)tenderProjectJSON.get("openBidUnPriceStartTime");
			if(null != bidOpeningStartTimeString && !"".equals(bidOpeningStartTimeString)){
				try {
					tenderProjectRuleEntity.setBidOpeningStartTime(format.parse(bidOpeningStartTimeString));
				} catch (ParseException e) {
				}
			}
			String openBidStartTimeStr = (String)tenderProjectJSON.get("openBidStartTime");
			if(null != openBidStartTimeStr && !"".equals(openBidStartTimeStr)){
				try {
					tenderProjectRuleEntity.setPriceBidOpeningTime(format.parse(openBidStartTimeStr));
				} catch (ParseException e) {
				}
			}
		}else {
			tenderProjectRuleEntity.setBidOpeningStage(TenderProjectEnum.BID_OPENING_ONE_STAGE);
			String openBidStartTimeStr = (String)tenderProjectJSON.get("openBidStartTime");
			if(null != openBidStartTimeStr && !"".equals(openBidStartTimeStr)){
				try {
					tenderProjectRuleEntity.setBidOpeningStartTime(format.parse(openBidStartTimeStr));
				} catch (ParseException e) {
				}
			}
		}
		
		String decodeType = (String)tenderProjectJSON.get("decodeType");
		if(null != decodeType) {
			if("01".equals(decodeType)) {
				tenderProjectRuleEntity.setDecodeType(Constants.DECRYPT_REMOTE);
			}else if("02".equals(decodeType)) {
				tenderProjectRuleEntity.setDecodeType(Constants.DECRYPT_FOCUS);
			}
		}
		if(null != isRemoteOpening && isRemoteOpening.equals(TenderProjectEnum.BIDOPENING_REMOTE)){
			// 远程开标
			tenderProjectRuleEntity.setBidOpeningType(TenderProjectEnum.BIDOPENING_REMOTE);
		}
	}
	/**
	 * @Description: 下载项目的其他信息
	 * @author guoyr
	 * @param tenderProjectEntity
	 * @param tenderProjectElement
	 */
	private void downTenderProjectOtherInfo(TenderProjectEntity tenderProjectEntity){
		ProgressMessageAdapter otherInfoLoadingListener = new ProgressMessageAdapter() {
			public void message(String msg, int flag) {
				callBack.message(msg, flag);
			}

			@Override
			public int getErrorMessagesSize() {
				// TODO Auto-generated method stub
				return 0;
			}

		};
		//下载投标人
//		NewDownloadSupplierThread downloadSupplierListThread = new NewDownloadSupplierThread(tenderProjectEntity, otherInfoLoadingListener);
		if(!CommonEnum.COMPLETE.equals(tenderProjectEntity.getBidOpeningStatus())) {
			RefreshProjectSupplierTenderInfoThread downloadSupplierListThread = new RefreshProjectSupplierTenderInfoThread(tenderProjectEntity, otherInfoLoadingListener);
			downloadSupplierListThread.start();
			downloadSupplierListThread.join();
		}
		if(downloadEvaluationFactor){
			if(null == evaluationFactorService) {
				evaluationFactorService = new EvaluationFactorService();
			}
			if(evaluationFactorService.getEvaluationFactorCount(tenderProjectEntity.getId(), null) < 1) {
				// 下载评审指标
				NewDownloadEvaluationFactorThread downloadEvaluationFactorThread = new NewDownloadEvaluationFactorThread(tenderProjectEntity, transactionServer, otherInfoLoadingListener);
				downloadEvaluationFactorThread.start();
				downloadEvaluationFactorThread.join();
			}
		}
		
		//下载工作人员
//		DownloadWorkersThread downloadWorkerThread = new DownloadWorkersThread(tenderProjectEntity,callBack);
//		downloadWorkerThread.start();
//		
//		//下载监督人员
//		DownloadMonitorsThread downloadMonitorThread = new DownloadMonitorsThread(tenderProjectEntity,callBack);
//		downloadMonitorThread.start();
//		
//		//下载专家
//		new DownloadExpertThread(tenderProjectEntity, transactionServer.getServerAddress(), callBack).start();
	}
	
	
}