package com.engine.organization.component;

import com.cloudstore.eccom.constant.WeaBoolAttr;
import com.cloudstore.eccom.pc.table.*;
import com.engine.organization.annotation.*;
import org.apache.commons.lang3.StringUtils;
import weaver.general.PageIdConst;
import weaver.hrm.User;
import weaver.systeminfo.SystemEnv;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class OrganizationWeaTable<T> extends WeaTable {

    public OrganizationWeaTable(User user, Class clazz) {

        boolean isAnno = clazz.isAnnotationPresent(OrganizationTable.class);
        if (isAnno) {
            OrganizationTable table = (OrganizationTable) clazz.getAnnotation(OrganizationTable.class);
            String pageId = table.pageId();
            super.setPageID(pageId);
            String pageUid = pageId + "_" + user.getUID();
            super.setPageUID(pageUid);
            String pageSize = PageIdConst.getPageSize(pageId, user.getUID());
            super.setPagesize(pageSize);
            String backfields = table.fields();
            super.setBackfields(backfields);
            String sql = table.fromSql();
            super.setSqlform(sql);
            String where = table.where();
            if (StringUtils.isNotBlank(where)) {
                super.setSqlwhere(where);
            }
            String orderby = table.orderby();
            if (StringUtils.isNotBlank(orderby)) {
                super.setSqlorderby(orderby);
            }
            String sortway = table.sortway();
            if (StringUtils.isNotBlank(sortway)) {
                super.setSqlsortway(sortway);
            }
            String groupby = table.groupby();
            if (StringUtils.isNotBlank(groupby)) {
                super.setSqlgroupby(groupby);
            }
            boolean distinct = table.distinct();
            super.setSqlisdistinct(String.valueOf(distinct));
            String primarykey = table.primarykey();
            if (StringUtils.isNotBlank(primarykey)) {
                super.setSqlprimarykey(primarykey);
            }
            OrganizationTableOperate[] operates = table.operates();
            if (operates != null && operates.length > 0) {
                List<WeaTableOperate> operateList = new ArrayList<>();
                Arrays.stream(operates).forEach(o -> {
                    String text = o.text();
                    int labelId = o.labelId();
                    String htmlLabelName = SystemEnv.getHtmlLabelName(labelId, user.getLanguage());
                    if (StringUtils.isNotBlank(htmlLabelName)) {
                        text = htmlLabelName;
                    }
                    WeaTableOperate weaTableOperate = new WeaTableOperate(text, o.href(), o.index());
                    operateList.add(weaTableOperate);
                });
                WeaTableOperates weaTableOperates = new WeaTableOperates();
                OperatePopedom popedoms = table.operatePopedom();
                WeaTablePopedom popedom = new WeaTablePopedom();
                if (popedoms != null && !"".equals(popedoms.transmethod())) {
                    popedom.setTransmethod(popedoms.transmethod());
                    popedom.setOtherpara(popedoms.otherpara());
                    weaTableOperates.setPopedom(popedom);
                }
                weaTableOperates.setOperate(operateList);
                super.setOperates(weaTableOperates);
            }

            WeaTableType weaTableTypeEnum = table.tableType();
            //设置check是否可用
            if (weaTableTypeEnum == WeaTableType.CHECKBOX) {
                super.setTableType(weaTableTypeEnum);
                CheckboxPopedom checkPopedom = table.checkboxPopedom();
                WeaTableCheckboxpopedom checkboxpopedom = new WeaTableCheckboxpopedom();
                if (checkPopedom != null && !"".equals(checkPopedom.showmethod())){
                    checkboxpopedom.setShowmethod(checkPopedom.showmethod());
                    checkboxpopedom.setPopedompara(checkPopedom.popedompara());
                }
                super.setCheckboxpopedom(checkboxpopedom);
            }

        }

        Field[] fields = clazz.getDeclaredFields();
        for (Field f : fields) {
            boolean isanno = f.isAnnotationPresent(OrganizationTableColumn.class);
            if (isanno) {
                OrganizationTableColumn columnAnn = f.getAnnotation(OrganizationTableColumn.class);
                String text = columnAnn.text();
                int labelId = columnAnn.labelId();
                String htmlLabelName = SystemEnv.getHtmlLabelName(labelId, user.getLanguage());
                if (StringUtils.isNotBlank(htmlLabelName)) {
                    text = htmlLabelName;
                }
                String width = columnAnn.width();
                String column = columnAnn.column();
                String orderkey = columnAnn.orderkey();
                boolean display = columnAnn.display();
                WeaTableColumn weaTableColumn = new WeaTableColumn(width, text, column, orderkey);
                String transmethod = columnAnn.transmethod();

                if (StringUtils.isNotBlank(transmethod)) {
                    weaTableColumn.setTransmethod(transmethod);
                }
                String otherPara = columnAnn.otherPara();
                if(StringUtils.isNotBlank(otherPara)) {
                    weaTableColumn.setOtherpara(otherPara);
                }
                if (!display) {
                    weaTableColumn.setDisplay(WeaBoolAttr.FALSE);
                }
                super.getColumns().add(weaTableColumn);
            }
        }


    }
}
