package com.vctgo.system.api.domain;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.vctgo.common.core.annotation.Excel;
import com.vctgo.common.core.web.domain.KinderInfoPlatformBaseEntity;
import com.vctgo.system.api.domain.dto.FileInfoAncestorsDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.*;

/**
 * 文件信息
 *
 * @author vctgo
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("file_info")
public class FileInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 文件ID
     */
    @TableId
    @JsonSerialize(using= ToStringSerializer.class)
    private Long id;

    /**
     * 租户ID
     */
    private Long tenantId;

    /**
     * 业务id
     */
    @Excel(name = "业务id")
    private Long serviceId;

    /**
     * 业务名称
     */
    private String serviceName;

    /**
     * 文件后缀
     */
    @Excel(name = "文件后缀")
    private String fileExtension;

    /**
     * 文件名称
     */
    @Excel(name = "文件名称")
    private String fileName;

    /**
     * 文件完整名称
     */
    @Excel(name = "文件完整名称")
    private String fileFullName;

    /**
     * 文件url
     */
    @Excel(name = "文件url")
    private String fileUrl;
    /**
     * 文件存储地址
     */
    @Excel(name = "文件存储地址")
    private String fileStorageUrl;

    /**
     * 文件存储名称
     */
    @Excel(name = "文件存储名称")
    private String fileStorageName;

    /**
     * 文件类型   1 文档 2 图片 3 视频 4 音频 5 压缩包 6 其他
     */
    @Excel(name = "文件类型", readConverterExp = "0=图片,1=办公类,2=视频")
    private String fileType;

    /**
     * 文件状态
     */
    @Excel(name = "文件状态 1：固定  10：非固定")
    private Integer fileStatus;

    /**
     * 文件预览地址
     */
    @Excel(name = "文件预览地址")
    private String filePreviewUrl;

    /**
     * 文件有效截止日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "文件有效截止日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date fileExpirationDate;

    /**
     * 是否隐藏  0 未隐藏 1 隐藏
     */
    private String fileIsHide;

    /**
     * 是否文件夹 0 否 1 是
     */
    private String fileIsDirectory;

    /**
     * 父ID
     */
    @JsonSerialize(using= ToStringSerializer.class)
    private Long fileParentId;

    /**
     * 文件目录
     */
    private String ancestors;

    /**
     * 文件大小
     */
    private Long fileSize;

    /**
     * 是否删除 0 未删除 1 已删除 2 彻底删除
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String isDeleted;

    /**
     * 创建者id
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long createById;
    /**
     * 创建者
     */
    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 更新者id
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long updateById;
    /**
     * 更新者
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 备注
     */
    private String remark;


    //=============================================扩展字段=======================================================
    /**
     * 请求参数
     */
    @ApiModelProperty(hidden = true)
    @TableField(exist = false)
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private Map<String, Object> params = new HashMap<>();

    /**
     * 文件大小值
     */
    @TableField(exist = false)
    private String fileSizeBytes;

    /**
     * 子文件列表
     */
    @TableField(exist = false)
    private List<FileInfo> sysFileList;

    /**
     * 文件Id列表
     */
    @TableField(exist = false)
    private List<Long> fileIdList;

    /**
     * 是否有操作 0 否 1 是
     */
    @TableField(exist = false)
    @ApiModelProperty(value = "是否有操作 0 否 1 是")
    @Excel(name = "是否有操作 0 否 1 是")
    private String hasOperate;

    /**
     * 文件夹类型 1 版本文件 2 评论文件
     */
    @TableField(exist = false)
    @ApiModelProperty(value = "文件夹类型 1 版本文件 2 评论文件")
    @Excel(name = "文件夹类型 1 版本文件 2 评论文件")
    private String directoryType;

    /**
     * 目录层级 从1开始
     */
    @TableField(exist = false)
    @JsonSerialize(using = ToStringSerializer.class)
    @ApiModelProperty(value = "目录层级 从1开始")
    @Excel(name = "目录层级 从1开始")
    private String level;

    /**
     * 项目Id
     */
    @TableField(exist = false)
    @ApiModelProperty(value = "项目Id")
    @JsonSerialize(using = ToStringSerializer.class)
    @Excel(name = "项目Id")
    private Long projectId;

    /**
     * 文件对应的操作权限
     */
    @TableField(exist = false)
    @ApiModelProperty(value = "操作权限")
    @Excel(name = "操作权限")
    private List<String> filePermissions;

    /**
     * 文件目录
     */
    @TableField(exist = false)
    @ApiModelProperty(value = "文件目录")
    @Excel(name = "文件目录")
    private List<FileInfoAncestorsDto> ancestorsDtoList;

    /**
     * 更新时间
     */
    @TableField(exist = false)
    private String updateDate;

    @TableField(exist = false)
    private String updateStartTime;

    @TableField(exist = false)
    private String updateEndTime;

    /**
     * 用户Id列表
     */
    @TableField(exist = false)
    private List<Long> userIdList;
}
