package com.hrs.util;

import javax.servlet.http.Part;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**   
* Copyright: Copyright (c) 2026 chinasofti
* 
* @ClassName: ImageUploadUtil.java
* @Description: 房源图片上传工具类
*
* @version: v1.0.0
* @author: 黄红
* @date: 2026年4月13日 上午10:09:44 
*
* Modification History:
* Date         Author          Version            Description
*---------------------------------------------------------*
* 2026年4月13日     黄红           v1.0.0               新建文件
*/
public class ImageUploadUtil {
    
    // 允许的图片类型
    private static final Set<String> ALLOWED_TYPES = new HashSet<>(Arrays.asList(
        "image/jpeg", "image/jpg", "image/png", "image/gif"
    ));
    
    // 最大文件大小 5MB
    private static final long MAX_FILE_SIZE = 5 * 1024 * 1024;
    
    // 上传目录
    private static final String UPLOAD_DIR = "upload/house/";
    /**
     * 
    * @Function: saveImage
    * @Description: 保存单张图片
    *
    * @param: Part 文件部件, HttpServletRequest 请求对象
    * @return：String 图片相对路径，失败返回null
    * @throws：IOException
    *
    * @version: v1.0.0
    * @author: 黄红
    * @date: 2025年4月6日 上午10:11:11 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     黄红           			v1.0.0                             新建方法
     */    
    public static String saveImage(Part part, javax.servlet.http.HttpServletRequest request) {
        if (part == null || part.getSize() == 0) {
            return null;
        }
        
        // 检查文件类型
        String contentType = part.getContentType();
        if (!ALLOWED_TYPES.contains(contentType)) {
            System.out.println("不支持的文件类型：" + contentType);
            return null;
        }
        
        // 检查文件大小
        if (part.getSize() > MAX_FILE_SIZE) {
            System.out.println("文件过大：" + part.getSize());
            return null;
        }
        
        // 获取文件扩展名
        String extension = getExtension(contentType);
        
        // 生成唯一文件名
        String fileName = generateFileName() + extension;
        
        // 获取上传目录的绝对路径
        String uploadPath = request.getServletContext().getRealPath("/") + UPLOAD_DIR;
        
        // 创建目录
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        
        // 保存文件
        String filePath = uploadPath + fileName;
        try (InputStream input = part.getInputStream();
             OutputStream output = new FileOutputStream(filePath)) {
            
            byte[] buffer = new byte[1024];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
            
            return UPLOAD_DIR + fileName;
            
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 
    * @Function: saveMultipleImages
    * @Description: 保存多张图片（用于添加房源）
    *
    * @param: Collection<Part> 文件部件集合, HttpServletRequest 请求对象
    * @return：String 多张图片路径（逗号分隔），失败返回null
    * @throws：IOException
    *
    * @version: v1.0.0
    * @author: 黄红
    * @date: 2025年4月6日 上午10:15:28 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     黄红           			v1.0.0                             新建方法
     */    
    public static String saveMultipleImages(java.util.Collection<Part> parts, 
                                             javax.servlet.http.HttpServletRequest request) {
        List<String> savedPaths = new ArrayList<>();
        
        for (Part part : parts) {
            if (part.getName().equals("images") && part.getSize() > 0) {
                String path = saveImage(part, request);
                if (path != null) {
                    savedPaths.add(path);
                }
            }
        }
        
        if (savedPaths.isEmpty()) {
            return null;
        }
        
        return String.join(",", savedPaths);
    }
    /**
     * 
    * @Function: deleteImage
    * @Description: 删除图片文件
    *
    * @param: imagePath 图片相对路径, HttpServletRequest 请求对象
    * @return：无
    * @throws：无
    *
    * @version: v1.0.0
    * @author: 黄红
    * @date: 2025年4月6日 上午10:14:23 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     黄红           			v1.0.0                             新建方法
     */    
    public static void deleteImage(String imagePath, javax.servlet.http.HttpServletRequest request) {
        if (imagePath == null || imagePath.trim().isEmpty()) {
            return;
        }
        
        String realPath = request.getServletContext().getRealPath("/") + imagePath;
        File file = new File(realPath);
        if (file.exists()) {
            file.delete();
        }
    }
    /**
     * 
    * @Function: deleteImages
    * @Description: 删除多张图片
    *
    * @param: imagePaths 多张图片路径（逗号分隔）, HttpServletRequest 请求对象
    * @return：无
    * @throws：无
    *
    * @version: v1.0.0
    * @author: 黄红
    * @date: 2025年4月6日 上午10:20:18 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     黄红           			v1.0.0                             新建方法
     */    
    public static void deleteImages(String imagePaths, javax.servlet.http.HttpServletRequest request) {
        if (imagePaths == null || imagePaths.trim().isEmpty()) {
            return;
        }
        
        String[] paths = imagePaths.split(",");
        for (String path : paths) {
            deleteImage(path.trim(), request);
        }
    }
    /**
     * 
    * @Function: getExtension
    * @Description: 根据内容类型获取文件扩展名
    *
    * @param: contentType 文件内容类型
    * @return：String 文件扩展名
    * @throws：无
    *
    * @version: v1.0.0
    * @author: 黄红
    * @date: 2025年4月6日 上午10:22:45 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     黄红           			v1.0.0                             新建方法
     */    
    private static String getExtension(String contentType) {
        switch (contentType) {
            case "image/jpeg":
            case "image/jpg":
                return ".jpg";
            case "image/png":
                return ".png";
            case "image/gif":
                return ".gif";
            default:
                return ".jpg";
        }
    }
    /**
     * 
    * @Function: generateFileName
    * @Description: 生成唯一文件名
    *
    * @param: 无
    * @return：String 唯一文件名
    * @throws：无
    *
    * @version: v1.0.0
    * @author: 黄红
    * @date: 2025年4月6日 上午10:24:23 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     黄红           			v1.0.0                             新建方法
     */    
    private static String generateFileName() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return sdf.format(new Date()) + "_" + UUID.randomUUID().toString().substring(0, 8);
    }
}