package weaver.interfaces.htsc.GlobatTools;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.lang.StringUtils;

import weaver.general.Util;

/**
 * @ClassName TableUtils
 * @Author K1810015
 * @Date 2022/1/17 14:15
 * Version 1.0
 */
public class TableUtils {

    /**
     * @title 实体类数据写入
     * @remark 备注信息
     * @author xf
         * @Params：
         * @param: ob
         * @param: name
     * @updateTime 2021/12/27 14:00
     * @return: java.lang.Object
     */
    public  Boolean create()throws Exception{
        String pkey=pkey();
        Field[] methodsarray = this.getClass().getDeclaredFields();
        Map<String, String> innerMap = new HashMap<>(5);
        Arrays.stream(methodsarray).forEach((Field f) -> {
            try {
                Method m = this.getClass().getMethod("get" + getMethodName(f.getName()));
                if(!pkey.equals(f.getName())){
                    String fieldvalue=Util.null2String(m.invoke(this));
                    if(!StringUtils.isBlank(fieldvalue)){
                        innerMap.put(f.getName(),fieldvalue);

                    }
                }
            }catch (Exception exo){
            }

        });
        String tablename=this.getClass().getSimpleName();
        if(innerMap.size()<=0 || "".equals(tablename)){
            return  false;
        }
        return   JAVATools.Excetesql(innerMap,tablename);
    }

    /**
     * 统一删除方式
     * */
    public  Boolean delete()throws Exception{
        String pkey=pkey();
        String id=Util.null2String( this.getClass().getMethod("get" + getMethodName(pkey)).invoke(this));
        if(StringUtils.isBlank(id)){
            return false;
        }
        String classname= this.getClass().getCanonicalName();
        Class obclass= Class.forName(classname);
        Object ob=obclass.newInstance();
        String tablename=obclass.getSimpleName();
        Map<String,String> wheremap=new HashMap<>(1);
        wheremap.put(pkey,id);
        if(StringUtils.isBlank(id) || StringUtils.isBlank(tablename) ){
            return false;
        }
        return JAVATools.deletesql(tablename,wheremap);
    }

    /**
     * @title 实体类数据修改
     * @remark 备注信息
     * @author xf
     * @Params：
     * @param: ob
     * @param: name
     * @updateTime 2021/12/27 14:00
     * @return: java.lang.Object
     */
    public  Boolean updata()throws Exception{
       String pkey=pkey();;

        Field[] methodsarray = this.getClass().getDeclaredFields();
        Map<String, String> fieldMap = new HashMap<>(5);
        Map<String, String> whereMap = new HashMap<>(1);
        Arrays.stream(methodsarray).forEach((Field f) -> {
            try {
                Method m = this.getClass().getMethod("get" + getMethodName(f.getName()));
                if(pkey.equals(f.getName())){
                    if(!StringUtils.isBlank(Util.null2String(m.invoke(this)))){
                        //如果为空的情况下则不做任何处理
                        whereMap.put(f.getName(),Util.null2String(m.invoke(this)));
                    }
                }else{
                    //初始化才可以操作
                    if(m.invoke(this)!=null){
                       // if(StringUtils.isBlank(Util.null2String(m.invoke(ob)))){
                            //如果为空的情况下则不做任何处理
                            fieldMap.put(f.getName(),Util.null2String(m.invoke(this)));
                        //}
                    }

                }
            }catch (Exception exo){
            }
        });


        String tablename=this.getClass().getSimpleName();
        if(fieldMap.size()<=0 || "".equals(tablename) || whereMap==null || whereMap.size()!=1){
            return  false;
        }
        return   JAVATools.Updatesql(fieldMap,tablename,whereMap);
    }


    public  Object select(String id)throws Exception{
        String pkey=pkey();
        String classname= this.getClass().getCanonicalName();
        Class obclass= Class.forName(classname);
        Object ob=obclass.newInstance();
        String tablename=obclass.getSimpleName();
        if(tablename==null || StringUtils.isBlank(tablename)){
            return null;
        }
        //获取key

        Map<String,String> wheremap=new HashMap<>(1);
        wheremap.put(pkey,id);
        Map<String,Object> tablemap=JAVATools.gettablevalue(tablename,wheremap);

        Field[] methodsarray = obclass.getDeclaredFields();

        Arrays.stream(methodsarray).forEach((Field f) -> {
            try {
                Method m = ob.getClass().getMethod("set" + getMethodName(f.getName()),f.getType());
                //  if(!id.equals(f.getName())){
                if(tablemap.get(f.getName())!=null){
                    String str=Util.null2String(tablemap.get(f.getName()));
                    Object strvalue= ConvertUtils.convert(str,f.getType());
                    m.invoke(ob,strvalue);

                    //获取如有时间格式在慢慢调整


                }
                //  }
            }catch (Exception exo){
            }
        });
        return   ob;
    }

    private static String getMethodName(String fildeName) throws Exception{
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }


    private static String pkey(){
        //考虑到一些特殊情况，后续会通过注解的方式来获取实体类的主键
             return "id";
    }
}
