package yem.wm.bd.addcompany.dynamic;

import kd.bos.bill.AbstractBillPlugIn;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.datamodel.IDataModel;
import kd.bos.entity.datamodel.events.ChangeData;
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
import kd.bos.form.IFormView;
import kd.bos.form.control.Control;
import kd.bos.form.events.ClosedCallBackEvent;
import kd.bos.form.field.BasedataEdit;
import kd.bos.list.ListShowParameter;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import yem.base.common.utils.OrgUtil;
import yem.base.common.utils.YEM;
import yem.wm.bd.util.BothCardHelper;

import java.util.EventObject;

/**
 * @Description 添加公司抬头--表单插件
 * 1、加载界面时，默认获取单据中的{抬头明细(隐藏)}中的公司抬头信息自动给界面赋值
 * 2、切换公司，重新加载公司的默认信息
 * 3、点击确定给父页面返回数据
 * @Author: zhangh
 * @CreateTime: 2025-02-08  10:14
 */
public class AddCompanyDynamicPlugin extends AbstractBillPlugIn {

    @Override
    public void afterCreateNewData(EventObject e) {
        BothCardHelper.init(this);//加载父页面的信息携带到动态表单上
    }

    @Override
    public void registerListener(EventObject e) {
        this.addClickListeners("yem_companybank", "yem_companylinkman");
        this.addClickListeners("btnok");
        this.initF7();
    }

    /**
     * @return void
     * @Description: 对公司进行添加事件的注册以及过滤
     * @function 功能
     * @purposes 用途
     */
    public void initF7() {
        String orgtype = (String) this.getModel().getValue("yem_orgtype");//判断系统使用的是《业务单元》还是《公司抬头》
        if ("bos_org".equals(orgtype)) {
            BasedataEdit orgF7 = this.getControl("yem_org");//获取公司抬头控件
            orgF7.addBeforeF7SelectListener((beforeF7SelectEvent) -> {
                ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
                QFilter qFilter = new QFilter("orgpattern", "in", OrgUtil.getOrgPattern());
                showParameter.getListFilterParameter().setFilter(qFilter);//列表添加条件：判断公司《组织形态》中的【组织类型】是否是法人企业、法人分支机构
            });
        }
    }

    @Override
    public void click(EventObject evt) {
        super.click(evt);
        Control c = (Control) evt.getSource();
        String key = c.getKey().toLowerCase();
        switch (key) {
            case "yem_companylinkman"://联系人
                BothCardHelper.showChangePage(this, "yem_bd_companymaninfor");//跳转动态表单
                break;
            case "yem_companybank"://开户行
                BothCardHelper.showChangePage(this, "yem_bd_companybankinfor");//跳转动态表单
                break;
            case "btnok"://确定按钮
                this.btnOk();//点击确定给父页面返回数据
                break;
        }
    }

    @Override
    public void propertyChanged(PropertyChangedArgs e) {
        String key = e.getProperty().getName();
        ChangeData[] changeData = e.getChangeSet();
        Object newValue = changeData[0].getNewValue();
        switch (key) {
            case "yem_org"://组织
                this.companyChanged(newValue);//切换组织，根据默认逻辑给公司信息赋值
                break;
        }
    }

    /**
     * @Description: 切换公司组织，公司信息进行重新赋值
     * @function 功能
     * @purposes 用途
     */
    public void companyChanged(Object newValue) {
        DynamicObject company = (DynamicObject) newValue;
        if (company != null) {
            String orgtype = (String) this.getModel().getValue("yem_orgtype");//获取组织类型
            company = BusinessDataServiceHelper.loadSingleFromCache(company.getLong("id"), company.getDataEntityType().getName());
            DynamicObject org = null;

            if ("bos_org".equals(orgtype)) {
                org = company;//判断是《业务单元》，默认取值为公司
            } else {
                org = company.getDynamicObject("yem_org");//判断是《公司抬头》，取值为《公司抬头》中的《组织》
            }

            if (org != null) {
                BothCardHelper.fillCoInfo(this.getModel(), org);////默认给表单所有信息赋值
            }
        }
    }

    @Override
    public void closedCallBack(ClosedCallBackEvent e) {
        String id = e.getActionId();
        Object returnData = e.getReturnData();
        switch (id) {
            case "yem_bd_companymaninfor"://《公司联系人信息》表单标识
                BothCardHelper.setCompanyManInfor(this, returnData, null);//点击《公司联系人信息》之后，给父页面的信息赋值
                break;

            case "yem_bd_companybankinfor"://《公司银行信息》表单标识
                BothCardHelper.setCompanyBankInfor(this, returnData);//点击《公司银行信息》之后，给父页面的信息赋值
                break;

        }
    }

    /**
     * @return void
     * @Description: 点击确定给父页面返回信息
     * @function 功能
     * @purposes 用途
     */
    public void btnOk() {

        IFormView view = this.getView();
        IDataModel model = this.getModel();
        IFormView parentView = view.getParentView();
        IDataModel parentModel = parentView.getModel();

        BothCardHelper.btnOkParent(this);//将动态表单的信息返回给付页面
        String defaultInfor = this.getView().getPageCache().get("data");
        if (YEM.isNotEmpty(defaultInfor)) {
            parentModel.setValue("yem_isdefaultinfor", defaultInfor);//默认信息(公司)
        }

        DynamicObject company = (DynamicObject) model.getValue("yem_org");
        String companyName = company != null ? company.getString("name") : "";
        parentModel.setValue("yem_companyname", companyName);//公司名称

        view.sendFormAction(parentView);
        view.close();
    }
}
