package sys.sc.formplugin;

import com.jcraft.jsch.SftpException;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.form.events.AfterDoOperationEventArgs;
import kd.bos.list.plugin.AbstractListPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import sys.sc.opplugin.utils.DatFileCreatUtils;
import sys.sc.opplugin.utils.SftpClient;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author cjz
 * @date 2024/9/18 17:05
 * @description:生成dat文件
 */
public class CreatDatPlugin extends AbstractListPlugin {

    //数据表字段标识
    private static String nckd_tablebasic="nckd_tablebasic";

    //获取分录中表字段需要生成的所有字段
    public void afterDoOperation(AfterDoOperationEventArgs arg){
        String name=arg.getOperateKey();
        if (name.equals("creatfile"))
        {
            DynamicObject dynamicObject=this.getModel().getDataEntity(true);
            List<String> fileList=new ArrayList<>();
            //获取当前分录
            DynamicObjectCollection dynamicObjectCollection=dynamicObject.getDynamicObjectCollection("nckd_tableentry");
            for (DynamicObject item:dynamicObjectCollection) {
                //将打勾的字段到处
                if (item.getBoolean("nckd_isable")) {
                    //需要导入的标识写入list中
                    fileList.add(item.getString("nckd_entrycode"));
                }
            }
            //获取当前选择的表名
            String tablenumber=dynamicObject.getString("number");
            //业务编码
            String bizappnum=dynamicObject.getString("nckd_biazppnum");
            QFilter qFilter=new QFilter("number", QCP.equals,"creatdat");
            DynamicObject jkdataDy= BusinessDataServiceHelper.loadSingle("nckd_jkpzxx",
                    "id,number,name,nckd_servername" +
                            ",nckd_port,nckd_url,nckd_filename,nckd_user" +
                            ",nckd_password,nckd_split,nckd_endsign",new QFilter[]{qFilter});
            //文件名
            String filename=tablenumber+".dat";
            //服务器路径
//            String nckd_url=jkdataDy.getString("nckd_url");
            String nckd_url=dynamicObject.getString("nckd_filepath");
//            //生成文件的路径
////            String filePath=nckd_url+filename;
////            File dir=new File(filePath);
////            //不存在则创建文件夹
////            if (!dir.exists()) {
////                File parentDir = dir.getParentFile();
////                if (parentDir != null && !parentDir.exists()) {
////                    parentDir.mkdirs();
////                }
////                try {
////                    dir.createNewFile();
////                } catch (IOException e) {
////                    throw new RuntimeException(e);
////                }
////                this.getView().showMessage("创建成功"+filePath);
////            }
            //分割符号
            String spiltsign=jkdataDy.getString("nckd_split");
            //结束符号
            String endsign=jkdataDy.getString("nckd_endsign");
            //服务器端口
            String host=jkdataDy.getString("nckd_servername");
            //服务器用户名
            String username=jkdataDy.getString("nckd_user");
            //服务器密码
            String password=jkdataDy.getString("nckd_password");
            //服务器端口号
            int port=jkdataDy.getInt("nckd_port");
            try {
                //临时文件
                File localFile = File.createTempFile(tablenumber, ".dat");
                //文件写入
                DatFileCreatUtils datFileCreatUtils=new DatFileCreatUtils(tablenumber,bizappnum,fileList,localFile.getAbsolutePath(),spiltsign,endsign);
                //生成dat文件到本地
                datFileCreatUtils.creatDatFile();
                //上传文件到服务器中
                SftpClient sftpClient=new SftpClient(host,username,password,port);
                //获取服务器连接
                sftpClient.connect();
                //从本地传文件到服务器
                sftpClient.fileCreat(localFile.getAbsolutePath(), nckd_url);
                //上传后删除临时文件
                localFile.delete();
                //关闭连接
                sftpClient.disconnect();
            } catch (IOException e) {
                throw new RuntimeException(e);
            } catch (SftpException e) {
                throw new RuntimeException(e);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

}