package com.erp.file.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 文件实体类
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("files")
public class FileEntity {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    /**
     * 租户ID
     */
    private Long tenantId;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 原始文件名
     */
    private String originalName;
    
    /**
     * 存储文件名（UUID）
     */
    private String storageName;
    
    /**
     * 存储路径
     */
    private String path;
    
    /**
     * 访问URL
     */
    private String url;
    
    /**
     * MIME类型
     */
    private String mimeType;
    
    /**
     * 文件大小（字节）
     */
    private Long size;
    
    /**
     * 文件扩展名
     */
    private String extension;
    
    /**
     * 存储磁盘：local/oss/minio
     */
    private String disk;
    
    /**
     * 模块
     */
    private String module;
    
    /**
     * 用途
     */
    private String purpose;
    
    /**
     * 文件描述
     */
    private String description;
    
    /**
     * 状态：active/inactive/deleted
     */
    private String status;
    
    // ==================== 时间戳字段 ====================
    
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    
    /**
     * 删除时间
     */
    @TableLogic
    private LocalDateTime deletedAt;
    
    // ==================== 辅助方法 ====================
    
    /**
     * 获取格式化的文件大小
     */
    public String getSizeFormatted() {
        if (size == null || size == 0) {
            return "0 B";
        }
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int unitIndex = 0;
        double fileSize = size.doubleValue();
        while (fileSize >= 1024 && unitIndex < units.length - 1) {
            fileSize /= 1024;
            unitIndex++;
        }
        return String.format("%.2f %s", fileSize, units[unitIndex]);
    }
    
    /**
     * 获取文件图标样式
     */
    public String getIcon() {
        if (mimeType == null) {
            return "file-icon";
        }
        if (mimeType.startsWith("image/")) {
            return "image-icon";
        } else if (mimeType.equals("application/pdf")) {
            return "pdf-icon";
        } else if (mimeType.contains("word")) {
            return "word-icon";
        } else if (mimeType.contains("excel") || mimeType.contains("spreadsheet")) {
            return "excel-icon";
        } else if (mimeType.contains("powerpoint") || mimeType.contains("presentation")) {
            return "ppt-icon";
        } else if (mimeType.equals("text/plain")) {
            return "text-icon";
        } else if (mimeType.contains("zip") || mimeType.contains("rar") || mimeType.contains("7z")) {
            return "archive-icon";
        }
        return "file-icon";
    }
    
    /**
     * 判断文件是否可预览
     */
    public boolean isPreviewable() {
        if (mimeType == null) {
            return false;
        }
        return mimeType.startsWith("image/") ||
               mimeType.equals("application/pdf") ||
               mimeType.startsWith("text/") ||
               mimeType.equals("application/json") ||
               mimeType.equals("application/xml");
    }
}
