package nckd.jimin.jyyy.fi.plugin.form;

import com.alibaba.druid.util.StringUtils;
import kd.bos.bill.AbstractBillPlugIn;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.operate.result.IOperateInfo;
import kd.bos.entity.operate.result.OperationResult;
import kd.bos.form.IClientViewProxy;
import kd.bos.form.IFormView;
import kd.bos.form.container.Tab;
import kd.bos.form.control.events.TabSelectEvent;
import kd.bos.form.control.events.TabSelectListener;
import kd.bos.form.events.AfterDoOperationEventArgs;
import kd.bos.form.events.BeforeClosedEvent;
import kd.bos.mvc.list.ListView;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import nckd.jimin.jyyy.fi.plugin.operate.SRMHelperUtils;

import java.util.EventObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 对公报销单(nckd_er_publicreimbur_ext)、预付单
 * 由srm系统产生的单据，联查SRM
 * @author wanghaiwu_kd
 * @date 2025/05/15
 */
public class PayApplyBillSRMEditPlugin extends AbstractBillPlugIn {
    @Override
    public void beforeClosed(BeforeClosedEvent e) {
        super.beforeClosed(e);

        if (this.getView().getParentView() != null) {
            this.getView().getParentView().invokeOperation("refresh");
            this.getView().sendFormAction(this.getView().getParentView());
        }
    }

    @Override
    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
        super.afterDoOperation(afterDoOperationEventArgs);

        String opKey = afterDoOperationEventArgs.getOperateKey();
        String srmUrl = (String)this.getModel().getValue("nckd_srmurl");

        if(StringUtils.equals("nckd_returnsrm", opKey)){
            OperationResult operationResult = afterDoOperationEventArgs.getOperationResult();
            operationResult.setShowMessage(false);

            String message = operationResult.getMessage();

            List<IOperateInfo> errorInfos = operationResult.getAllErrorOrValidateInfo();
            boolean isSuccess = operationResult.isSuccess();
            if(errorInfos.size()>0){
                operationResult.setSuccess(false);
                StringBuffer msg = new StringBuffer();
                for (IOperateInfo errInfo: errorInfos) {
                    msg.append(errInfo.getMessage()).append("\r\n");
                }
                message = message + "\r\n" + msg.toString();
            }

            if(!StringUtils.isEmpty(message)) {
                this.getView().showTipNotification(message);
            } else if(!StringUtils.isEmpty(srmUrl)){
                openSRMSSOLink();

                //退回成功后，关闭当前页面。
                this.getModel().setDataChanged(false);
                this.getView().close();
            }
        } else if(StringUtils.equals("nckd_ssosrm", opKey)){
            if(StringUtils.isEmpty(srmUrl)){
                this.getView().showTipNotification("不是SRM生成的单据，不能单点到SRM系统");
            } else {
                openSRMSSOLink();
            }
        }
    }

    /**
     * 单点登录到srm系统
     */
    public void openSRMSSOLink(){
        String ssourl = (String) this.getModel().getValue("nckd_srmurl");
        Map<String, String> returnMap = SRMHelperUtils.buildSSOUrl(ssourl);

        if(returnMap != null){
            if("0".equals(returnMap.get("code"))) {
                ssourl = returnMap.get("msg");
                IClientViewProxy proxy = this.getView().getService(IClientViewProxy.class);
                Map<String, String> mpUrl = new HashMap();
                mpUrl.put("url", ssourl);
                proxy.addAction("openUrl", mpUrl);
            } else {
                this.getView().showTipNotification(returnMap.get("msg"));
            }
        } else {
            this.getView().showTipNotification("获取单点url失败");
        }
    }


    /**
     * 在创建新数据后执行的操作，用于根据视图类型自动填充相关字段。
     *
     * 功能：
     * - 从自定义参数中获取视图类型（viewType）。
     * - 查询对应的视图类型数据（nckd_payviewtype）。
     * - 如果视图类型编号为 "1004"（专项费用和培训申请），则进一步查询并自动填充费用类型（er_expenseitemedit）。
     *
     * @param e 事件对象，包含触发此操作的上下文信息。
     */
    @Override
    public void afterCreateNewData(EventObject e) {
        super.afterCreateNewData(e);
        Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
        if(customParams.get("viewType") != null){
            String[] typeStrings = customParams.get("viewType").toString().split(",");

            QFilter qFilter = new QFilter("number", QCP.in, typeStrings);

            DynamicObject[] viewTypeCols = BusinessDataServiceHelper.load("nckd_payviewtype", "id, masterid,number, name", qFilter.toArray());
            if(viewTypeCols != null && viewTypeCols.length > 0){
                //页面类型赋值
                //  this.getModel().setValue("nckd_payviewtype", viewTypeCols[0]);
                //根据页面类型找到费用类型,专项费用和培训申请时候自动填充费用类型
                String viewtNumber=viewTypeCols[0].getString("number");
                if(viewtNumber.equals("1004")){
                    //根据页面类型查找费用类型
                    QFilter expenseitemFilter = new QFilter("nckd_payviewtype", QCP.equals, viewTypeCols[0].getLong("id"));
                    expenseitemFilter.and("isleaf",QCP.equals,true);
                    DynamicObject[] expenseitemCols = BusinessDataServiceHelper.load("er_expenseitemedit", "id, number,name,fullname", expenseitemFilter.toArray());
                    //费用项目赋值
                    this.getModel().setValue("nckd_expenseitem", expenseitemCols[0]);
                }

            }
        }
    }
}
