package com.gx.obe.evaluation.step.form;

import java.math.BigDecimal;
import java.text.MessageFormat;

import org.eclipse.swt.SWT;
import org.eclipse.swt.core.CallBack;
import org.eclipse.swt.core.MessageDialog;
import org.eclipse.swt.core.listener.TextHintListener;
import org.eclipse.swt.core.listener.VerifyRequiredListener;
import org.eclipse.swt.core.utils.ValidateUtils;
import org.eclipse.swt.core.utils.WidgetUtils;
import org.eclipse.swt.core.widgets.EButton;
import org.eclipse.swt.core.widgets.EDialog;
import org.eclipse.swt.core.widgets.ESepator;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import com.gx.obe.ColorConstants;
import com.gx.obe.common.icons.IconsActivator;
import com.gx.obe.common.widget.button.Tips;
import com.gx.obe.components.core.I18NEnum;
import com.gx.obe.components.core.enumeration.CommonEnum;
import com.gx.obe.components.core.enumeration.EvaluationFactorEnum;
import com.gx.obe.components.core.enumeration.EvaluationStepEnum;
import com.gx.obe.components.core.util.MoneyUtils;
import com.gx.obe.message.Messages;
import com.gx.obe.util.utils.LogUtils;
import com.gx.obe.util.utils.ObjectUtils;
import com.gx.obe.web.entity.evaluation.EvaluationStep;
import com.gx.obe.web.entity.tender.TenderProjectEntity;
import com.gx.obe.web.entity.tender.TenderProjectRuleEntity;
import com.gx.obe.web.service.ProjectRuleService;
import com.gx.obe.web.service.evaluation.EvaluationStepService;
import com.swtdesigner.ResourceManager;
import com.swtdesigner.SWTResourceManager;

/**
 * @Description:
 * @author chenxw
 */
public class LimitPriceEvaluationStepDialog extends EDialog {

	private Text stepNameText;
	private Composite roleTypeComposite;
	private Composite composite;
	private Composite finalistRuleCompose;
	private EButton save_btn;
	private Text stepMemoText;
	private CallBack callBack;
	private Text bidPriceLimitText;
	private EvaluationStepService evaluationStepService = new EvaluationStepService();
	private ProjectRuleService projectRuleService;
	private TenderProjectEntity tenderProjectEntity;
	private EvaluationStep evaluationStep;
	private Button isShowLimitPriceBut;
	private Button isShowBidPriceBut;
	private Label unitLabel;
	private TenderProjectRuleEntity tenderProjectRuleEntity;
	private Tips tips;
	private com.gx.obe.web.service.TenderProjectService tenderProjectServices;

	{
		LogUtils.logClass(LimitPriceEvaluationStepDialog.class);
	}

	/**
	 * Create the dialog.
	 * @param parentShell
	 */
	public LimitPriceEvaluationStepDialog(Shell parentShell, TenderProjectEntity tenderProjectEntity, EvaluationStep evaluationStep) {
		super(parentShell);
		this.tenderProjectEntity = tenderProjectEntity;
		this.evaluationStep = evaluationStep;
		tenderProjectServices = new com.gx.obe.web.service.TenderProjectService();
		setTitle(Messages.Step_step);
	}

	/**
	 * Create contents of the dialog.
	 * 
	 * @param parent
	 */
	protected Control createDialogArea(Composite parent) {
		Composite topContainer = (Composite) super.createDialogArea(parent);
		GridLayout gl_topContainer = new GridLayout(1, false);
		gl_topContainer.verticalSpacing = 0;
		gl_topContainer.horizontalSpacing = 0;
		gl_topContainer.marginHeight = 0;
		gl_topContainer.marginWidth = 0;
		topContainer.setLayout(gl_topContainer);

		Composite container = new Composite(topContainer, SWT.NONE);
		container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		GridLayout gl_container = new GridLayout(1, false);
		gl_container.marginHeight = 10;
		gl_container.marginWidth = 10;
		container.setLayout(gl_container);
		this.setOperator(SWT.MAX | SWT.CLOSE);

		tips = new Tips(container, SWT.WRAP);
		tips.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
		tips.setText(Messages.Tips_SetBidLimitPrice);
		tips.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, EvaluationStepEnum.getEvaluationStepIco(EvaluationStepEnum.BID_PRICE_LIMIT)));
		tips.setSurroundColor(SWTResourceManager.getColor(60, 138, 226));

		composite = new Composite(container, SWT.NONE);
		GridLayout gl_composite = new GridLayout(2, false);
		gl_composite.verticalSpacing = 10;
		composite.setLayout(gl_composite);
		GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
		gd_composite.widthHint = 414;
		composite.setLayoutData(gd_composite);

		Label step_name = new Label(composite, SWT.NONE);
		step_name.setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.NORMAL));
		step_name.setAlignment(SWT.RIGHT);
		step_name.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
		step_name.setText(Messages.StepName + ": ");

		Composite composite_2 = new Composite(composite, SWT.NONE);
		composite_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
		GridLayout gl_composite_2 = new GridLayout(1, false);
		gl_composite_2.marginWidth = 0;
		gl_composite_2.verticalSpacing = 1;
		gl_composite_2.marginHeight = 0;
		composite_2.setLayout(gl_composite_2);

		stepNameText = new Text(composite_2, SWT.NONE);
		stepNameText.setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.NORMAL));
		stepNameText.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false, 1, 1));
		stepNameText.addPaintListener(new TextHintListener(Messages.Tips_EnterEvaluationStepName));
		stepNameText.addVerifyListener(new VerifyRequiredListener(stepNameText,  MessageFormat.format(Messages.Tips_required, Messages.StepName)));
		stepNameText.setTextLimit(20);
		stepNameText.setText(Messages.Step_limitPrice);

		ESepator label = new ESepator(composite_2, SWT.NONE);
		label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
		label.setBackground(ColorConstants.SEP_LIGHT_COLOR);

		Label label_1 = new Label(composite, SWT.NONE);
		label_1.setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.NORMAL));
		label_1.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
		label_1.setText(Messages.EvalExpert + "：");

		Composite composite_7 = new Composite(composite, SWT.NONE);
		composite_7.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
		GridLayout gl_composite_7 = new GridLayout(1, false);
		gl_composite_7.marginHeight = 0;
		gl_composite_7.marginWidth = 0;
		gl_composite_7.verticalSpacing = 0;
		composite_7.setLayout(gl_composite_7);

		roleTypeComposite = new Composite(composite_7, SWT.NONE);
		roleTypeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
		GridLayout gl_roleTypeComposite = new GridLayout(3, false);
		gl_roleTypeComposite.marginHeight = 0;
		gl_roleTypeComposite.marginWidth = 0;
		roleTypeComposite.setLayout(gl_roleTypeComposite);

		Button all_expert = new Button(roleTypeComposite, SWT.RADIO);
		all_expert.setData("roleType", EvaluationStepEnum.EXPERT_LEADER);
		all_expert.setText(Messages.ExpertLeader);
		all_expert.setSelection(true);

		Button operator_expert = new Button(roleTypeComposite, SWT.RADIO);
		operator_expert.setData("roleType", EvaluationStepEnum.OPERATOR);
		operator_expert.setText(Messages.ProjectManager);

		Label label_7 = new Label(composite, SWT.NONE);
		label_7.setText(Messages.EvaluationSet + "：");

		Composite composite_3 = new Composite(composite, SWT.NONE);
		composite_3.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
		GridLayout gl_composite_3 = new GridLayout(2, false);
		gl_composite_3.verticalSpacing = 0;
		gl_composite_3.marginHeight = 0;
		gl_composite_3.marginWidth = 0;
		composite_3.setLayout(gl_composite_3);

		isShowLimitPriceBut = new Button(composite_3, SWT.CHECK);
		isShowLimitPriceBut.setText(Messages.ShowLimitPrice);

		isShowBidPriceBut = new Button(composite_3, SWT.CHECK);
		isShowBidPriceBut.setText(Messages.ShowBidPrice);

		Label label_2 = new Label(composite, SWT.NONE);
		label_2.setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.NORMAL));
		label_2.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
		label_2.setText(Messages.TenderLimit + "：");

		finalistRuleCompose = new Composite(composite, SWT.NONE);
		finalistRuleCompose.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
		GridLayout gl_finalistRuleCompose = new GridLayout(2, false);
		gl_finalistRuleCompose.verticalSpacing = 1;
		gl_finalistRuleCompose.marginHeight = 0;
		gl_finalistRuleCompose.horizontalSpacing = 0;
		gl_finalistRuleCompose.marginWidth = 0;
		finalistRuleCompose.setLayout(gl_finalistRuleCompose);

		bidPriceLimitText = new Text(finalistRuleCompose, SWT.BORDER);
		bidPriceLimitText.setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.NORMAL));
		GridData gd_bidPriceLimitText = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1);
		gd_bidPriceLimitText.widthHint = 100;
		bidPriceLimitText.setLayoutData(gd_bidPriceLimitText);
		bidPriceLimitText.addVerifyListener(new VerifyRequiredListener(stepNameText, MessageFormat.format(Messages.Tips_required, Messages.BidPrice)));
		bidPriceLimitText.setTextLimit(20);

		unitLabel = new Label(finalistRuleCompose, SWT.NONE);
		unitLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
		unitLabel.setText(Messages.Money_yuan);

		Label label_5 = new Label(composite, SWT.NONE);
		label_5.setFont(SWTResourceManager.getFont("微软雅黑", 9, SWT.NORMAL));
		label_5.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, true, 1, 1));
		label_5.setText(Messages.NodeNote + "：");

		stepMemoText = new Text(composite, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
		stepMemoText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
		stepMemoText.setTextLimit(100);

		ESepator but_sep = new ESepator(topContainer, SWT.SEPARATOR | SWT.HORIZONTAL);
		but_sep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
		but_sep.setBackground(ColorConstants.SEP_LIGHT_COLOR);

		Composite composite_1 = new Composite(topContainer, SWT.NONE);
		composite_1.setBackgroundMode(SWT.INHERIT_FORCE);
		composite_1.setBackgroundImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/fill_bg.png"));
		composite_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
		GridLayout gl_composite_1 = new GridLayout(2, false);
		composite_1.setLayout(gl_composite_1);

		save_btn = new EButton(composite_1, SWT.NONE);
		save_btn.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/save.png"));
		GridData gd_confirmBtn = new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1);
		gd_confirmBtn.widthHint = 90;
		save_btn.setLayoutData(gd_confirmBtn);
		save_btn.setText(Messages.Button_save);
		save_btn.addMouseListener(new MouseAdapter() {
			public void mouseUp(MouseEvent e) {
				saveEvaluationStepAction();
			}
		});
		EButton cancel_btn = new EButton(composite_1, SWT.NONE);
		cancel_btn.setImage(ResourceManager.getPluginImage(IconsActivator.PLUGIN_ID, "icons/btn/blue/close.png"));
		cancel_btn.addMouseListener(new MouseAdapter() {
			public void mouseUp(MouseEvent e) {
				cancelAction();
			}
		});
		GridData gd_button = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
		gd_button.widthHint = 90;
		cancel_btn.setLayoutData(gd_button);
		cancel_btn.setText(Messages.Button_close);

		init();
		return container;
	}

	/**
	 * @Description: 初始化
	 * @author chenxw
	 */
	private void init() {
		projectRuleService = new ProjectRuleService();
		String supplierName = com.gx.obe.components.core.I18N.getString(I18NEnum.SUPPLIERNAME, tenderProjectEntity.getTenderType());
		tips.setText(Messages.Tips_ForExceedingLimitPrice +supplierName+Messages.Tips_RejectBid);
		tenderProjectRuleEntity = projectRuleService.getProjectRule(tenderProjectEntity.getId());
		if (null == tenderProjectRuleEntity) tenderProjectRuleEntity = new TenderProjectRuleEntity();
		unitLabel.setText(tenderProjectRuleEntity.getPriceUnitUseDefault());
		bidPriceLimitText.setText(MoneyUtils.getMoneyFormatByUnit(tenderProjectEntity.getBidPriceLimit(), tenderProjectRuleEntity.getEvalPriceUnit()));
		if (null == evaluationStep) {
			evaluationStep = new EvaluationStep();
			evaluationStep.setFilterType(EvaluationStepEnum.FILTER_YES);
			evaluationStep.setPassType(EvaluationStepEnum.PASS_ALL);
			evaluationStep.setRoleType(EvaluationStepEnum.EXPERT_LEADER);
			evaluationStep.setStepStatus(CommonEnum.NOT_START);
			int maxSortNo = evaluationStepService.getMaxEvaluationStepSortNo(tenderProjectEntity.getId());
			evaluationStep.setSortNo(maxSortNo + 1);
			this.setTitle(MessageFormat.format(Messages.Title_create, Messages.Step_step));
		} else {
			stepNameText.setText(ObjectUtils.getObjString(evaluationStep.getStepName()));
			stepMemoText.setText(ObjectUtils.getObjString(evaluationStep.getStepMemo()));
			isShowLimitPriceBut.setSelection(evaluationStep.getEvaluationParamByKey(EvaluationStepEnum.IS_SHOW_LIMIT_PRICE, Boolean.class));
			isShowBidPriceBut.setSelection(evaluationStep.getEvaluationParamByKey(EvaluationStepEnum.IS_SHOW_BID_PRICE, Boolean.class));
			this.setTitle(MessageFormat.format(Messages.Title_edit, Messages.Step_step));
			setEnabledStatus();
		}
		WidgetUtils.setRadioChecked(roleTypeComposite, ObjectUtils.getObjString(evaluationStep.getRoleType()), "roleType");
	}

	/**
	 * @Description: 设置可修改状态
	 * @author chenxw
	 */
	private void setEnabledStatus() {
		if (CommonEnum.IN_PROGRESS.equals(evaluationStep.getStepStatus())) {
			roleTypeComposite.setEnabled(false);
		} else if (CommonEnum.COMPLETE.equals(evaluationStep.getStepStatus())) {
			roleTypeComposite.setEnabled(false);
			isShowLimitPriceBut.setEnabled(false);
			isShowBidPriceBut.setEnabled(false);
			bidPriceLimitText.setEnabled(false);
			save_btn.setEnabled(false);
		}
	}

	/**
	 * @Description: 确定
	 * @author chenxw
	 */
	private void saveEvaluationStepAction() {
		if (save_btn.getEnabled()) {
			if (!ValidateUtils.checkInput(stepNameText.getParent())) {
				return;
			}
			if (!ValidateUtils.checkInput(bidPriceLimitText.getParent())) {
				return;
			}
			// 验证评标步骤名称是否已经存在
			if (evaluationStepService.valEvaluationStepNameExist(tenderProjectEntity.getId(), evaluationStep.getId(), stepNameText.getText().trim())) {
				MessageDialog.openWarning(getShell(), Messages.Step_step + "[" + stepNameText.getText().trim() + "]" + Messages.Tips_AlreadyExistsPleaseRetype);
				stepNameText.setFocus();
				stepNameText.setSelection(stepNameText.getText().length());
				return;
			}
			BigDecimal bidPriceLimit = MoneyUtils.getMoneyFromText(bidPriceLimitText.getText().trim(), tenderProjectRuleEntity.getPriceUnitUseDefault());
			if (null == bidPriceLimit) {
				MessageDialog.openError(getShell(), Messages.Tips_ReWriteLimitPrice);
				bidPriceLimitText.setText("");
				bidPriceLimitText.setFocus();
				return;
			}
			tenderProjectEntity.setBidPriceLimit(bidPriceLimit);
			tenderProjectServices.updateAssignProperty(tenderProjectEntity, new String[]{"id","bidPriceLimit"});
			evaluationStep.setStepName(stepNameText.getText().trim());
			evaluationStep.setStepType(EvaluationStepEnum.BID_PRICE_LIMIT);// 价格评审
			evaluationStep.setStepMemo(stepMemoText.getText().trim());
			evaluationStep.setTenderId(tenderProjectEntity.getId());
			evaluationStep.setRoleType(ObjectUtils.getObjString(WidgetUtils.getRadioVal(roleTypeComposite, "roleType")));
			evaluationStep.setFilterType(EvaluationStepEnum.FILTER_NO);
			evaluationStep.setEvalBidType(EvaluationFactorEnum.EVAL_BID_PRICE);
			evaluationStep.setEvaluationParam(EvaluationStepEnum.IS_SHOW_LIMIT_PRICE, isShowLimitPriceBut.getSelection());
			evaluationStep.setEvaluationParam(EvaluationStepEnum.IS_SHOW_BID_PRICE, isShowBidPriceBut.getSelection());
			evaluationStep = (EvaluationStep) evaluationStepService.saveEvaluationStep(evaluationStep);
			if (null != evaluationStep && null != callBack) {
				callBack.callBackObject(evaluationStep);
			} else {
				MessageDialog.openWarning(getShell(), stepNameText.getText() + Messages.Tips_saveFail);
			}
			this.getShell().close();
		}
	}

	/**
	 * @Description: 取消
	 * @author chenxw
	 */
	private void cancelAction() {
		this.getShell().close();
	}

	public CallBack getCallBack() {
		return callBack;
	}

	public void setCallBack(CallBack callBack) {
		this.callBack = callBack;
	}

	/**
	 * Return the initial size of the dialog.
	 */
	protected Point getInitialSize() {
		return new Point(600, 400);
	}
}
