package psdi.app.iface.mobile;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import psdi.mbo.MboRemote;
import psdi.mbo.MboSetRemote;
import psdi.server.MXServer;
import psdi.util.MXException;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.io.*;
import java.rmi.RemoteException;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

/**
 * app文件上传
 * （主要是图片上传）
 * createBy liuxq  2023-9-15
 */
@Path("/udFile")
public class UploadFileService {

    /**
     *在线图片的上传保存
     */
    @POST
    @Path("/OnlinePicture")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject OnlinePictureSave(String received) throws RemoteException, MXException {
        //定义返回对象
        JSONObject returnDate = new JSONObject();
        if(received == null || "".equals(received)){
            returnDate.put("errcode","205");
            returnDate.put("errmsg","parameter is empty");
            return returnDate;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        MboSetRemote doclinksSet = MXServer.getMXServer().getMboSet("DOCLINKS",MXServer.getMXServer().getSystemUserInfo());
        MboSetRemote docinfoSet = MXServer.getMXServer().getMboSet("DOCINFO",MXServer.getMXServer().getSystemUserInfo());
        try {
            // 设置存储路径
            String uploadDirectory = "/sunda/eamfile/attachments/";//linux服务器路径
//            String uploadDirectory = "F:\\picture\\";
            // 检查目录是否存在，如果不存在则创建它
            File uploadDir = new File(uploadDirectory);
            if (!uploadDir.exists()) {
                uploadDir.mkdirs();
            }
            JSONObject jsonObject = JSONObject.parseObject(received);// 从请求中获取Base64编码的图片数据
            //需要的参数：
            String OBJECTNAME = jsonObject.getString("OBJECTNAME");//表名
//            OBJECTNAME = "UDREPORT";
            Integer ID = jsonObject.getInteger("ID");//表id
            String  CREATEBY = jsonObject.getString("CREATEBY");//上传人
            JSONArray IMGArr = jsonObject.getJSONArray("IMG");//图片
            //
            Date UPLOADDATE = sdf.parse(sdf.format(new Date())); //系统生成上传日期
            // 解码Base64数据并保存为图片文件
            if(IMGArr!=null && !IMGArr.isEmpty()){
                for(int i=0;i<IMGArr.size();i++){
                    String base64Image = IMGArr.getString(i);
                    if(base64Image.contains("data:")){
                        int start = base64Image.indexOf(",");
                        base64Image = base64Image.substring(start+1);
                        base64Image = base64Image.replaceAll("\r|\n","");
                        base64Image = base64Image.trim();
                    }
//                    byte[] imageBytes = Base64.getDecoder().decode(base64Image);
                    byte[] imageBytes = Base64.getMimeDecoder().decode(base64Image);
                    // 生成唯一的文件名，可以使用UUID或时间戳等方式
//                    String fileName = generateUniqueFileName();
                    //或者文件名采用：表名+表ID+UUID
                    String fileName= OBJECTNAME+"_"+ID+"_"+generateUniqueFileName() + ".png";//这里用下划线，uuid生成的是中划线
                    String filePath = uploadDirectory + File.separator + fileName;
                    try (OutputStream os = new FileOutputStream(filePath)) {
                        os.write(imageBytes);
                    }
                    //-附件表插入start----------------------------------------------------------------------------------------------
                    //docinfo
                    MboRemote docinfoMbo = docinfoSet.add();
                    Integer DOCINFOID = docinfoMbo.getInt("DOCINFOID");
                    String CONTENTUID= String.valueOf(DOCINFOID);
                    String LANGCODE = "ZH";
                    int SHOW = 0; int USEDEFAULTFILEPATH = 0; int PRINTTHRULINKDFLT = 0;
                    String DOCUMENT = CONTENTUID;//暂时这样设置
                    String DESCRIPTION = fileName;//文件名
                    String CHANGEBY = CREATEBY;
                    Date CHANGEDATE = UPLOADDATE;
                    String DOCTYPE = "Attachments";//固定值
                    String URLTYPE = "FILE";//固定值
                    String URLNAME = uploadDirectory+fileName;// /sunda/eamfile/attachments/企业微信截图_1694773145947.png
                    docinfoMbo.setValue("CONTENTUID",CONTENTUID,11L);
                    docinfoMbo.setValue("LANGCODE",LANGCODE,11L);
                    docinfoMbo.setValue("SHOW",SHOW,11L);
                    docinfoMbo.setValue("USEDEFAULTFILEPATH",USEDEFAULTFILEPATH,11L);
                    docinfoMbo.setValue("PRINTTHRULINKDFLT",PRINTTHRULINKDFLT,11L);
                    docinfoMbo.setValue("DOCUMENT",DOCUMENT,11L);
                    docinfoMbo.setValue("DESCRIPTION",DESCRIPTION,11L);
                    docinfoMbo.setValue("CREATEDATE",UPLOADDATE,11L);
                    docinfoMbo.setValue("CHANGEDATE",UPLOADDATE,11L);
                    docinfoMbo.setValue("CHANGEBY",CREATEBY,11L);
                    docinfoMbo.setValue("CREATEBY",CREATEBY,11L);
                    docinfoMbo.setValue("DOCTYPE",DOCTYPE,11L);
                    docinfoMbo.setValue("URLTYPE",URLTYPE,11L);
                    docinfoMbo.setValue("URLNAME",URLNAME,11L);
                    docinfoMbo.getThisMboSet().save(11L);
                    //doclinks
                    MboRemote doclinksMbo = doclinksSet.add();
                    doclinksMbo.setValue("DOCUMENT",DOCUMENT,11L);
                    doclinksMbo.setValue("OWNERTABLE",OBJECTNAME,11L);
                    doclinksMbo.setValue("OWNERID",ID,11L);
                    doclinksMbo.setValue("DOCTYPE",DOCTYPE,11L);
                    doclinksMbo.setValue("GETLATESTVERSION",1,11L);
                    doclinksMbo.setValue("CREATEDATE",UPLOADDATE,11L);
                    doclinksMbo.setValue("CHANGEDATE",UPLOADDATE,11L);
                    doclinksMbo.setValue("CHANGEBY",CREATEBY,11L);
                    doclinksMbo.setValue("CREATEBY",CREATEBY,11L);
                    doclinksMbo.setValue("PRINTTHRULINK",0,11L);
                    doclinksMbo.setValue("COPYLINKTOWO",0,11L);
                    doclinksMbo.setValue("DOCINFOID",DOCINFOID,11L);
                    doclinksMbo.getThisMboSet().save(11L);
                    //-附件表插入end----------------------------------------------------------------------------------------------
                }
                returnDate.put("errcode","200");
                returnDate.put("errmsg","upload success");
            }
        }catch (Exception e){
            System.out.println("------faileMessage----->"+e.getMessage());
            returnDate.put("errcode","500");
            returnDate.put("errmsg","upload failure");
        }finally {
            return returnDate;
        }
    }

    /**
     * 离线图片的上传保存
     */
    @POST
    @Path("/OfflinePicture")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject OfflinePictureSave(String received) throws RemoteException, MXException {
        //定义返回对象
        JSONObject returnDate = new JSONObject();
        if(received == null || "".equals(received)){
            returnDate.put("errcode","205");
            returnDate.put("errmsg","parameter is empty");
            return returnDate;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        MboSetRemote doclinksSet = MXServer.getMXServer().getMboSet("DOCLINKS",MXServer.getMXServer().getSystemUserInfo());
        MboSetRemote docinfoSet = MXServer.getMXServer().getMboSet("DOCINFO",MXServer.getMXServer().getSystemUserInfo());
        try {
            Date UPLOADDATE = sdf.parse(sdf.format(new Date())); //系统生成上传日期
            // 设置存储路径
            String uploadDirectory = "/sunda/eamfile/attachments/";//linux服务器路径
//            String uploadDirectory = "F:\\picture\\";
            // 检查目录是否存在，如果不存在则创建它
            File uploadDir = new File(uploadDirectory);
            if (!uploadDir.exists()) {
                uploadDir.mkdirs();
            }
            JSONArray receiveArr = JSONArray.parseArray(received);// 从请求中获取Base64编码的图片数据
            //格式 [{'OBJECTNAME':'SPOTRUNLINES','ID':1,'CREATEBY':'0113176','IMG':'DSAFDASDFADFASDFAFDASDFADS'},{'OBJECTNAME':'SPOTRUNLINES','ID':1,'CREATEBY':'0113176','IMG':'DSAFDASDFADFASDFAFDASDFADS'}]
            //解析参数
            if(receiveArr!=null && !receiveArr.isEmpty()){
                for(int i=0;i<receiveArr.size();i++){
                    JSONObject jsonObject = (JSONObject) receiveArr.get(i);
                    String OBJECTNAME = jsonObject.getString("OBJECTNAME");//表名
                    Integer ID = jsonObject.getInteger("ID");//表id
                    String CREATEBY = jsonObject.getString("CREATEBY");//上传人
                    String base64Image = jsonObject.getString("IMG");//图片
                    if(base64Image.contains("data:")){
                        int start = base64Image.indexOf(",");
                        base64Image = base64Image.substring(start+1);
                        base64Image = base64Image.replaceAll("\r|\n","");
                        base64Image = base64Image.trim();
                    }
//                    byte[] imageBytes = Base64.getDecoder().decode(base64Image);
                    byte[] imageBytes = Base64.getMimeDecoder().decode(base64Image);
                    String fileName= OBJECTNAME+"_"+ID+"_"+generateUniqueFileName() + ".png";//这里用下划线，uuid生成的是中划线
                    String filePath = uploadDirectory + File.separator + fileName;
                    try (OutputStream os = new FileOutputStream(filePath)) {
                        os.write(imageBytes);
                    }
                    //-附件表插入start----------------------------------------------------------------------------------------------
                    //docinfo
                    MboRemote docinfoMbo = docinfoSet.add();
                    Integer DOCINFOID = docinfoMbo.getInt("DOCINFOID");
                    String CONTENTUID= String.valueOf(DOCINFOID);
                    String LANGCODE = "ZH";
                    int SHOW = 0; int USEDEFAULTFILEPATH = 0; int PRINTTHRULINKDFLT = 0;
                    String DOCUMENT = CONTENTUID;//暂时这样设置
                    String DESCRIPTION = fileName;//文件名
                    String CHANGEBY = CREATEBY;
                    Date CHANGEDATE = UPLOADDATE;
                    String DOCTYPE = "Attachments";//固定值
                    String URLTYPE = "FILE";//固定值
                    String URLNAME = uploadDirectory+fileName;// /sunda/eamfile/attachments/企业微信截图_1694773145947.png
                    docinfoMbo.setValue("CONTENTUID",CONTENTUID,11L);
                    docinfoMbo.setValue("LANGCODE",LANGCODE,11L);
                    docinfoMbo.setValue("SHOW",SHOW,11L);
                    docinfoMbo.setValue("USEDEFAULTFILEPATH",USEDEFAULTFILEPATH,11L);
                    docinfoMbo.setValue("PRINTTHRULINKDFLT",PRINTTHRULINKDFLT,11L);
                    docinfoMbo.setValue("DOCUMENT",DOCUMENT,11L);
                    docinfoMbo.setValue("DESCRIPTION",DESCRIPTION,11L);
                    docinfoMbo.setValue("CREATEDATE",UPLOADDATE,11L);
                    docinfoMbo.setValue("CHANGEDATE",UPLOADDATE,11L);
                    docinfoMbo.setValue("CHANGEBY",CREATEBY,11L);
                    docinfoMbo.setValue("CREATEBY",CREATEBY,11L);
                    docinfoMbo.setValue("DOCTYPE",DOCTYPE,11L);
                    docinfoMbo.setValue("URLTYPE",URLTYPE,11L);
                    docinfoMbo.setValue("URLNAME",URLNAME,11L);
                    docinfoMbo.getThisMboSet().save(11L);
                    //doclinks
                    MboRemote doclinksMbo = doclinksSet.add();
                    doclinksMbo.setValue("DOCUMENT",DOCUMENT,11L);
                    doclinksMbo.setValue("OWNERTABLE",OBJECTNAME,11L);
                    doclinksMbo.setValue("OWNERID",ID,11L);
                    doclinksMbo.setValue("DOCTYPE",DOCTYPE,11L);
                    doclinksMbo.setValue("GETLATESTVERSION",1,11L);
                    doclinksMbo.setValue("CREATEDATE",UPLOADDATE,11L);
                    doclinksMbo.setValue("CHANGEDATE",UPLOADDATE,11L);
                    doclinksMbo.setValue("CHANGEBY",CREATEBY,11L);
                    doclinksMbo.setValue("CREATEBY",CREATEBY,11L);
                    doclinksMbo.setValue("PRINTTHRULINK",0,11L);
                    doclinksMbo.setValue("COPYLINKTOWO",0,11L);
                    doclinksMbo.setValue("DOCINFOID",DOCINFOID,11L);
                    doclinksMbo.getThisMboSet().save(11L);
                    //-附件表插入end----------------------------------------------------------------------------------------------
                }
                returnDate.put("errcode","200");
                returnDate.put("errmsg","upload success");
            }
        }catch (Exception e){
            System.out.println("------faileMessage----->"+e.getMessage());
            returnDate.put("errcode","500");
            returnDate.put("errmsg","get failure");
        }finally {
            return returnDate;
        }
    }

    /**
     * 图片查看,不区分在线和离线
     */
    @POST
    @Path("/viewPicture")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject viewPicture(String received) throws RemoteException, MXException {
        //定义返回对象
        JSONObject returnDate = new JSONObject();
        JSONArray fileArr = new JSONArray();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        JSONObject jsonObject = JSONObject.parseObject(received);
        //参数
        String OBJECTNAME = jsonObject.getString("OBJECTNAME");//表名
        String ID = jsonObject.getString("ID");//表ID
        MboSetRemote doclinksSet = MXServer.getMXServer().getMboSet("DOCLINKS",MXServer.getMXServer().getSystemUserInfo());
        MboSetRemote docinfoSet = MXServer.getMXServer().getMboSet("DOCINFO",MXServer.getMXServer().getSystemUserInfo());
        doclinksSet.setWhere("OWNERTABLE='"+OBJECTNAME+"' and OWNERID="+ID+"");
        doclinksSet.reset();
        if(doclinksSet!=null && !doclinksSet.isEmpty()){
            for(int i=0;i<doclinksSet.count();i++){
                MboRemote doclinksMbo = doclinksSet.getMbo(i);
                int DOCINFOID = doclinksMbo.getInt("DOCINFOID");
                docinfoSet.setWhere("DOCINFOID="+DOCINFOID+"");
                docinfoSet.reset();
                if(docinfoSet!=null && !docinfoSet.isEmpty()){
                    MboRemote docinfoMbo = docinfoSet.getMbo(0);
                    String description = docinfoMbo.getString("DESCRIPTION");
                    fileArr.add(description);
                }
            }
            returnDate.put("errcode","200");
            returnDate.put("errmsg","get success");
            returnDate.put("file",fileArr);
        }else{
            returnDate.put("errcode","200");
            returnDate.put("errmsg","get success");
            returnDate.put("file",fileArr);
        }
        return returnDate;
    }

    /**
     * 图片删除，一张一张删除，不区分在线/离线
     */
    @POST
    @Path("/delOnlinePicture")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject delOnlinePicture(String received) throws RemoteException, MXException {
        //定义返回对象
        JSONObject returnDate = new JSONObject();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        MboSetRemote doclinksSet = MXServer.getMXServer().getMboSet("DOCLINKS",MXServer.getMXServer().getSystemUserInfo());
        MboSetRemote docinfoSet = MXServer.getMXServer().getMboSet("DOCINFO",MXServer.getMXServer().getSystemUserInfo());
        try {
            // 获取要删除的图片文件名
            JSONObject jsonObject = JSONObject.parseObject(received);
            String FILENAME = jsonObject.getString("FILENAME");//通过文件名进行删除
            String OBJECTNAME = jsonObject.getString("OBJECTNAME");//表名
            Integer ID = jsonObject.getInteger("ID");//表id
            // 设置存储路径
            String uploadDirectory = "/sunda/eamfile/attachments/";//linux服务器路径
//            String uploadDirectory = "F:\\picture\\";
            String filePathToDelete = uploadDirectory + File.separator + FILENAME;
            // 检查文件是否存在，如果存在则删除
            File fileToDelete = new File(filePathToDelete);
            if (fileToDelete.exists() && fileToDelete.isFile()) {
                if (fileToDelete.delete()) {
                    // 删除成功
                    returnDate.put("errcode","200");
                    returnDate.put("errmsg","delete success");
                    //删除表数据
                    docinfoSet.setWhere("DESCRIPTION='"+FILENAME+"'");
                    docinfoSet.reset();
                    Integer DOCINFOID = null;
                    if(docinfoSet!=null && !docinfoSet.isEmpty()){
                       MboRemote mbo = docinfoSet.getMbo(0);
                       DOCINFOID = mbo.getInt("DOCINFOID");
                    }
                    doclinksSet.setWhere("OWNERTABLE='"+OBJECTNAME+"' and OWNERID="+ID+" and docinfoid="+DOCINFOID+"");
                    doclinksSet.reset();
                    if(doclinksSet!=null && !doclinksSet.isEmpty()){
                        MboRemote doclinksMbo = doclinksSet.getMbo(0);
                        doclinksMbo.delete();
                        doclinksMbo.getThisMboSet().save(11L);
                        docinfoSet.setWhere("DOCINFOID="+DOCINFOID+"");
                        docinfoSet.reset();
                        if(docinfoSet!=null && !docinfoSet.isEmpty()){
                            MboRemote docinfoMbo = docinfoSet.getMbo(0);
                            docinfoMbo.delete();
                            docinfoMbo.getThisMboSet().save(11L);
                        }
                    }
                } else {
                    // 删除失败
                    returnDate.put("errcode","500");
                    returnDate.put("errmsg","delete failure");
                    return returnDate;
                }
            } else {
                // 文件不存在
                returnDate.put("errcode","202");
                returnDate.put("errmsg","File Picture not found...");
                return returnDate;
            }
        }catch (Exception e){
            System.out.println("------faileMessage----->"+e.getMessage());
            returnDate.put("errcode","500");
            returnDate.put("errmsg","delete failure"+e.getMessage());
        }finally {
            return returnDate;
        }
    }

    // 生成唯一的文件名的方法
    private String generateUniqueFileName() {
        // 这里可以使用UUID或者时间戳来生成唯一的文件名
        return UUID.randomUUID().toString();
    }
}
