package com.ruoyi.kkfileview.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.commons.io.FilenameUtils;
import org.apache.tika.Tika;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ruoyi.common.utils.StringUtils;

/**
 * 文件类型工具类
 * 
 * @author jackeyhuang
 * @version 1.0.0
 * @date 2026-01-11
 */
public class FileTypeUtils
{
    private static final Logger log = LoggerFactory.getLogger(FileTypeUtils.class);
    
    private static final Tika tika = new Tika();

    /**
     * 根据文件扩展名获取文件类型
     * 
     * @param fileName 文件名
     * @return 文件类型（小写）
     */
    public static String getFileType(String fileName)
    {
        if (StringUtils.isEmpty(fileName))
        {
            return "unknown";
        }
        
        String extension = FilenameUtils.getExtension(fileName).toLowerCase();
        return StringUtils.isEmpty(extension) ? "unknown" : extension;
    }

    /**
     * 检测文件MIME类型
     * 
     * @param file 文件
     * @return MIME类型
     */
    public static String detectMimeType(File file)
    {
        try
        {
            return tika.detect(file);
        }
        catch (IOException e)
        {
            log.warn("检测文件MIME类型失败: {}", file.getAbsolutePath(), e);
            return "application/octet-stream";
        }
    }

    /**
     * 检测文件MIME类型（通过文件名）
     * 
     * @param fileName 文件名
     * @return MIME类型
     */
    public static String detectMimeType(String fileName)
    {
        try
        {
            return tika.detect(fileName);
        }
        catch (Exception e)
        {
            log.warn("检测文件MIME类型失败: {}", fileName, e);
            return "application/octet-stream";
        }
    }

    /**
     * 判断是否为Office文件
     * 
     * @param fileType 文件类型
     * @return 是否为Office文件
     */
    public static boolean isOfficeFile(String fileType)
    {
        if (StringUtils.isEmpty(fileType))
        {
            return false;
        }
        
        String lowerType = fileType.toLowerCase();
        return lowerType.equals("doc") || lowerType.equals("docx") ||
               lowerType.equals("xls") || lowerType.equals("xlsx") ||
               lowerType.equals("ppt") || lowerType.equals("pptx");
    }

    /**
     * 判断是否为图片文件
     * 
     * @param fileType 文件类型
     * @return 是否为图片文件
     */
    public static boolean isImageFile(String fileType)
    {
        if (StringUtils.isEmpty(fileType))
        {
            return false;
        }
        
        String lowerType = fileType.toLowerCase();
        return lowerType.equals("jpg") || lowerType.equals("jpeg") ||
               lowerType.equals("png") || lowerType.equals("gif") ||
               lowerType.equals("bmp") || lowerType.equals("webp");
    }

    /**
     * 判断是否为PDF文件
     * 
     * @param fileType 文件类型
     * @return 是否为PDF文件
     */
    public static boolean isPdfFile(String fileType)
    {
        return "pdf".equalsIgnoreCase(fileType);
    }

    /**
     * 判断是否为文本文件
     * 
     * @param fileType 文件类型
     * @return 是否为文本文件
     */
    public static boolean isTextFile(String fileType)
    {
        if (StringUtils.isEmpty(fileType))
        {
            return false;
        }
        
        String lowerType = fileType.toLowerCase();
        return lowerType.equals("txt") || lowerType.equals("md") ||
               lowerType.equals("csv") || lowerType.equals("log") ||
               lowerType.equals("json") || lowerType.equals("xml") ||
               lowerType.equals("html") || lowerType.equals("htm");
    }
}
