package fi.fa.formPlugin;

import com.alibaba.druid.util.StringUtils;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.datamodel.ListSelectedRowCollection;
import kd.bos.form.CloseCallBack;
import kd.bos.form.ShowFormHelper;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.form.events.ClosedCallBackEvent;
import kd.bos.list.BillList;
import kd.bos.list.ListFilterParameter;
import kd.bos.list.ListShowParameter;
import kd.bos.list.plugin.AbstractListPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;

public class EcardListPlugin extends AbstractListPlugin {
    public void registerListener(EventObject e) {
        super.registerListener(e);
        this.addItemClickListeners(new String[]{"toolbarap"});
    }

    @Override
    public void itemClick(ItemClickEvent evt) {
        String itemKey = evt.getItemKey();
        if ("nckd_baritemap2".equals(itemKey)) {
            BillList billList = (BillList) this.getControl("billlistap");
            ListSelectedRowCollection list = billList.getSelectedRows();
            if (list.isEmpty()) {
                this.getView().showMessage("请至少选择一条数据");
            }else {
                ListShowParameter showParameter = ShowFormHelper.createShowListForm("fa_assetcategory", false, 2);
                showParameter.setFormId("bos_templatetreelistf7");
                showParameter.setCloseCallBack(new CloseCallBack(this, itemKey));
                this.getView().showForm(showParameter);
            }
        } else if ("nckd_baritemap1".equals(itemKey)) {
            boolean flag = true;
            BillList billList = (BillList) this.getControl("billlistap");
            ListSelectedRowCollection list = billList.getSelectedRows();
            Object[] primaryKeyValues = list.getPrimaryKeyValues();
            Set<Long> orgIds = new HashSet<>();
            for (Object primaryKeyValue : primaryKeyValues) {
                DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(primaryKeyValue, "nckd_fa_card_real_list");
                DynamicObject nckd_orgfield = cardInfo.getDynamicObject("nckd_orgfield");
                String nckd_card_real_code = cardInfo.getString("nckd_card_real_code");
                if (nckd_orgfield == null) {
                    flag = false;
                    this.getView().showMessage("单据:" + cardInfo.getString("number") + "的归属机构为空,请重新勾选数据!");
                    break;
                }
                if(!StringUtils.isEmpty(nckd_card_real_code)) {
                    flag = false;
                    this.getView().showMessage("单据:" + cardInfo.getString("number") + "已生成实物卡片:" + nckd_card_real_code + ",请重新勾选数据!");
                    break;
                }
                orgIds.add(nckd_orgfield.getLong("id"));
            }

            if (orgIds.isEmpty()) {
                flag = false;
                this.getView().showMessage("请至少选择一条数据");
            } else if (orgIds.size() > 1) {
                flag = false;
                this.getView().showMessage("所选择的数据归属机构不一致,请重新勾选数据!");
            }
            if (flag) {
                ListShowParameter showParameter = ShowFormHelper.createShowListForm("nckd_ft_rule", false, 2);
                showParameter.setFormId("bos_listf7");
                ListFilterParameter listFilterParameter = showParameter.getListFilterParameter();
                QFilter filter = new QFilter("entrycostcompany_orgrule.id", QCP.in, orgIds);
                filter.and("fid.billstatus", QCP.in, Arrays.asList("E", "F", "G"));
                listFilterParameter.setFilter(filter);
                showParameter.setListFilterParameter(listFilterParameter);
                showParameter.setCloseCallBack(new CloseCallBack(this, itemKey));
                this.getView().showForm(showParameter);
            }
        }
    }


    @Override
    public void closedCallBack(ClosedCallBackEvent e) {
        super.closedCallBack(e);
        if (null != e.getReturnData()) {
            if (StringUtils.equals(e.getActionId(), "nckd_baritemap2")) {
                //获取选中的资产类别
                ListSelectedRowCollection returnData = (ListSelectedRowCollection) e.getReturnData();
                Long primaryKeyValue = (Long) returnData.get(0).getPrimaryKeyValue();

                //更新选中的实物卡片清单资产类别
                BillList billList = (BillList) this.getControl("billlistap");
                ListSelectedRowCollection list = billList.getSelectedRows();
                Object[] primaryKeyValues = list.getPrimaryKeyValues();
                List<Object> ids = Arrays.asList(Arrays.stream(primaryKeyValues).toArray());
                QFilter filter = new QFilter("id", QCP.in, ids);
                DynamicObject[] realCards = BusinessDataServiceHelper.load("nckd_fa_card_real_list", "id", new QFilter[]{filter});
                for (DynamicObject realCard : realCards) {
                    DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(realCard.getPkValue(), realCard.getDynamicObjectType().getName());
                    cardInfo.set("nckd_fa_assetcategory", primaryKeyValue);
                    SaveServiceHelper.save(new DynamicObject[]{cardInfo});
                }
            } else if (StringUtils.equals(e.getActionId(), "nckd_baritemap1")) {
                //获取选中的分摊信息
                ListSelectedRowCollection returnData = (ListSelectedRowCollection) e.getReturnData();
                Long primaryKeyValue = (Long) returnData.get(0).getPrimaryKeyValue();
                DynamicObject ftInfo = BusinessDataServiceHelper.loadSingle(primaryKeyValue, "nckd_ft_rule");
                BigDecimal shareamount_comrule = ftInfo.getBigDecimal("shareamount_comrule");


                //更新选中的实物卡片清单资产类别
                BillList billList = (BillList) this.getControl("billlistap");
                ListSelectedRowCollection list = billList.getSelectedRows();
                BigDecimal nckd_ft_amount = shareamount_comrule.divide(BigDecimal.valueOf(list.size()),  RoundingMode.HALF_UP);
                Object[] primaryKeyValues = list.getPrimaryKeyValues();
                List<Object> ids = Arrays.asList(Arrays.stream(primaryKeyValues).toArray());
                QFilter filter = new QFilter("id", QCP.in, ids);
                DynamicObject[] realCards = BusinessDataServiceHelper.load("nckd_fa_card_real_list", "id", new QFilter[]{filter});
                for (DynamicObject realCard : realCards) {
                    DynamicObject cardInfo = BusinessDataServiceHelper.loadSingle(realCard.getPkValue(), realCard.getDynamicObjectType().getName());
                    cardInfo.set("nckd_ft_amount", nckd_ft_amount);
                    SaveServiceHelper.save(new DynamicObject[]{cardInfo});
                }
            }
        }
    }
}