package com.bohuikeji.frame.module.admin.entity.configure;

import com.bohuikeji.frame.module.admin.annotation.TableShowField;
import com.bohuikeji.frame.module.admin.base.HtmlBlockFormBase;
import com.bohuikeji.frame.module.admin.base.SuperBase;
import com.bohuikeji.frame.module.admin.entity.vo.AddressVo;
import com.bohuikeji.frame.module.admin.entity.web.block.AddressBlock;
import com.bohuikeji.frame.module.admin.entity.web.block.DateBlock;
import com.bohuikeji.frame.module.admin.entity.web.block.SelectBlock;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.time.temporal.Temporal;

/**
 * 字段配置类
 * @author 10552
 */
@Data
@Slf4j
public class FieldConf extends SuperBase {
    /**
     * 字段名称
     */
    String fieldName;
    /**
     * 字段标题
     */
    String fileTitle;
    /**
     * 数据库列名
     */
    String columnName;
    /**
     * 字段数据类型
     */
    String fieldType;
    /**
     * 数据表名称
     */
    String tableName;
    /**
     * 是否为ID字段
     */
    boolean id;
    /**
     * 是否显示
     */
    boolean show;
    /**
     * 数据表配置
     */
    TableAn table;
    /**
     * 外键配置
     */
    KeyAn key;
    /**
     * 查询组件配置
     */
    QueryAn query;
    /**
     * 编辑组件配置
     */
    EditAn edit;
    /**
     * 新增组件配置
     */
    NewAn newed;

    /**
     * 初始化方法
     * @param showField
     * @return
     */
    public static FieldConf getInstance(TableShowField showField){
        FieldConf conf=new FieldConf();
        conf.setFileTitle(showField.value());
        conf.setId(showField.id());
        conf.setShow(showField.show());
        return conf;
    }

    public HtmlBlockFormBase getHtmlBlock(BaseInputAn inputAn){
        Class fieldClass;
        Class blockClass;
        try {
            fieldClass=Class.forName(this.fieldType);
            blockClass=Class.forName(inputAn.getBlock());
        } catch (ClassNotFoundException e) {
            log.error("无法找到配置项类型，位于：[{}]",inputAn);
            return null;
        }
        /**
         * 特殊组件识别并处理，针对通用组件，且未指定类型
         */
        if (Temporal.class.isAssignableFrom(fieldClass)){
            inputAn.setBlock(DateBlock.class.getName());
            return  new DateBlock(this,inputAn);
        }
        if(fieldClass== AddressVo.class){
            inputAn.setBlock(AddressBlock.class.getName());
            return  new AddressBlock(this,inputAn);
        }
        String[] options=inputAn.getOption();
        if(options!=null&&options.length>0){
            inputAn.setBlock(SelectBlock.class.getName());
            return  new SelectBlock(this,inputAn);
        }

        /**
         * 第三次处理，创建默认组件
         */
        //默认处理，创建控件
        try {
            return (HtmlBlockFormBase)blockClass.getConstructor(FieldConf.class, BaseInputAn.class).newInstance(this, inputAn);
        } catch (Exception e) {
            log.error("创建组件失败位于：[{}.{}]",this.getFileTitle(),inputAn.getBlock(),e);
        }
        log.error("创建组件失败，无法识别：[{}]",inputAn);
        return null;

    }


}
