package com.inkasso.factoring.zhongjiaoxinglu.util;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 文件辅助工具类
 */
public class ZhongJiaoXingLuFileUtil {

    /**
     * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩
     *
     * @param imgSrc     源图片地址
     * @param imgDist    目标图片地址
     * @param widthDist  压缩后图片宽度（当rate==null时，必传）
     * @param heightDist 压缩后图片高度（当rate==null时，必传）
     * @param rate       压缩比例
     */
    public static void compressImg(String imgSrc, String imgDist, int widthDist, int heightDist, Float rate) {
        FileOutputStream out = null;
        try {
            File srcfile = new File(imgSrc);
            // 检查文件是否存在
            if (!srcfile.exists()) {
                return;
            }
            // 如果rate不为空说明是按比例压缩
            if (rate != null && rate > 0) {
                // 获取文件高度和宽度
                int[] results = getImgWidth(srcfile);
                if (results == null || results[0] == 0 || results[1] == 0) {
                    return;
                } else {
                    widthDist = (int) (results[0] * rate);
                    heightDist = (int) (results[1] * rate);
                }
            }
            // 开始读取文件并进行压缩
            Image srcImg = ImageIO.read(srcfile);
            BufferedImage newImg = new BufferedImage((int) widthDist, (int) heightDist, BufferedImage.TYPE_INT_RGB);
            newImg.getGraphics().drawImage(srcImg.getScaledInstance(widthDist, heightDist, Image.SCALE_SMOOTH), 0, 0,
                    null);
            out = new FileOutputStream(imgDist);
            ImageIO.write(newImg, imgDist.substring(imgDist.lastIndexOf(".") + 1), out);
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 获取图片宽度
     *
     * @param file 图片文件
     * @return 宽度
     */
    public static int[] getImgWidth(File file) {
        InputStream is = null;
        BufferedImage src = null;
        int result[] = {
                0, 0
        };
        try {
            is = new FileInputStream(file);
            src = ImageIO.read(is);
            result[0] = src.getWidth(null); // 得到源图宽
            result[1] = src.getHeight(null); // 得到源图高
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 复制单个文件
     *
     * @param srcFileName 待复制的文件名
     * @param overlay     如果目标文件存在，是否覆盖
     * @return 如果复制成功返回true，否则返回false
     */
    public static boolean copyFile(String srcFileName, String destFileName,
                                   boolean overlay) {
        File srcFile = new File(srcFileName);

        // 判断源文件是否存在
        if (!srcFile.exists()) {
            String MESSAGE = "源文件：" + srcFileName + "不存在！";
            JOptionPane.showMessageDialog(null, MESSAGE);
            return false;
        } else if (!srcFile.isFile()) {
            String MESSAGE = "复制文件失败，源文件：" + srcFileName + "不是一个文件！";
            JOptionPane.showMessageDialog(null, MESSAGE);
            return false;
        }

        // 判断目标文件是否存在
        File destFile = new File(destFileName);
        if (destFile.exists()) {
            // 如果目标文件存在并允许覆盖
            if (overlay) {
                // 删除已经存在的目标文件，无论目标文件是目录还是单个文件
                new File(destFileName).delete();
            }
        } else {
            // 如果目标文件所在目录不存在，则创建目录
            if (!destFile.getParentFile().exists()) {
                // 目标文件所在目录不存在
                if (!destFile.getParentFile().mkdirs()) {
                    // 复制文件失败：创建目标文件所在目录失败
                    return false;
                }
            }
        }

        // 复制文件
        int byteread = 0; // 读取的字节数
        InputStream in = null;
        OutputStream out = null;

        try {
            in = new FileInputStream(srcFile);
            out = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];

            while ((byteread = in.read(buffer)) != -1) {
                out.write(buffer, 0, byteread);
            }
            return true;
        } catch (FileNotFoundException e) {
            return false;
        } catch (IOException e) {
            return false;
        } finally {
            try {
                if (out != null)
                    out.close();
                if (in != null)
                    in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 根据网络URL下载文件
     *
     * @param fileUrl
     * @param fileLocal
     * @return
     * @throws Exception
     */
    public static boolean downloadFile(String fileUrl, String fileLocal) throws Exception {
        boolean flag = false;
        URL url = new URL(fileUrl);
        HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
        urlCon.setConnectTimeout(15000);
        urlCon.setReadTimeout(15000);
        int code = urlCon.getResponseCode();
        if (code != HttpURLConnection.HTTP_OK) {
            throw new Exception("文件读取失败");
        }
        //读文件流
        DataInputStream in = new DataInputStream(urlCon.getInputStream());
        DataOutputStream out = new DataOutputStream(new FileOutputStream(fileLocal));
        byte[] buffer = new byte[2048];
        int count = 0;
        while ((count = in.read(buffer)) > 0) {
            out.write(buffer, 0, count);
        }
        try {
            if (out != null) {
                out.close();
            }
            if (in != null) {
                in.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        flag = true;
        return flag;
    }

    /**
     * 删除单个文件
     *
     * @param destFileName 待删除的文件名
     * @return 如果复制成功返回true，否则返回false
     */
    public static boolean deleteFile(String destFileName) {
        File srcFile = new File(destFileName);

        // 判断源文件是否存在
        if (!srcFile.exists()) {
            String MESSAGE = "目标文件：" + destFileName + "不存在！";
            JOptionPane.showMessageDialog(null, MESSAGE);
            return false;
        } else {
            srcFile.delete();
        }
        return true;
    }
}
