CREATE SCHEMA IF NOT EXISTS file;

DROP TABLE IF EXISTS file.tb_sys_file CASCADE;
CREATE TABLE file.tb_sys_file (
  -- BaseDTO 继承字段
  optsn       VARCHAR(50)   NOT NULL,               -- 操作流水号
  creator     VARCHAR(50)   DEFAULT NULL,           -- 创建人
  updater     VARCHAR(50)   DEFAULT NULL,           -- 更新人
  dept_path   VARCHAR(255)  DEFAULT NULL,           -- 部门路径
  remark      TEXT          DEFAULT NULL,           -- 备注
  create_time TIMESTAMPTZ   NOT NULL DEFAULT now(), -- 创建时间
  update_time TIMESTAMPTZ   DEFAULT NULL,           -- 更新时间
  delete_time TIMESTAMPTZ   DEFAULT NULL,           -- 删除时间
  deleted     BOOLEAN       NOT NULL DEFAULT false,     -- 是否已删除（false-未删除，true-已删除）
  
  -- TbSysFileDTO 特有字段
  file_id     VARCHAR(50)   NOT NULL,               -- 文件ID (主键)
  file_root_id  VARCHAR(50)   DEFAULT NULL,               -- 文件根ID
  version     INTEGER   DEFAULT 1,               -- 文件版本
  name        VARCHAR(255)  NOT NULL,               -- 文件名
  path        VARCHAR(500)  NOT NULL,               -- 文件路径
  size        BIGINT        NOT NULL,               -- 文件大小（字节）
  type        VARCHAR(50)   DEFAULT NULL,           -- 文件类型
  storage_type VARCHAR(50)  DEFAULT NULL,           -- 存储类型
  mime_type   VARCHAR(255)  DEFAULT NULL,           -- MIME 类型
  url         VARCHAR(500)  DEFAULT NULL,           -- 后端下载接口路径（保留用于扩展，建议使用 /api/file/download/{fileId}）
  status      VARCHAR(50)   DEFAULT NULL,           -- 文件状态
  module      VARCHAR(100)  DEFAULT NULL,           -- 所属模块
  business_id VARCHAR(50)   DEFAULT NULL,           -- 业务ID
  uploader    VARCHAR(50)   DEFAULT NULL,           -- 上传者用户ID
  object_name VARCHAR(500)  DEFAULT NULL,           -- MinIO对象名称
  bucket_name VARCHAR(100)  DEFAULT NULL,           -- MinIO存储桶名称
  md5_hash    VARCHAR(32)   DEFAULT NULL,           -- 文件MD5值
  extension   VARCHAR(20)   DEFAULT NULL,           -- 文件扩展名
  
  PRIMARY KEY (file_id),
  UNIQUE (optsn)
);

COMMENT ON TABLE file.tb_sys_file IS '系统文件表';

-- BaseDTO 继承字段注释
COMMENT ON COLUMN file.tb_sys_file.optsn IS '操作流水号';
COMMENT ON COLUMN file.tb_sys_file.creator IS '创建人';
COMMENT ON COLUMN file.tb_sys_file.updater IS '更新人';
COMMENT ON COLUMN file.tb_sys_file.dept_path IS '部门路径';
COMMENT ON COLUMN file.tb_sys_file.remark IS '备注';
COMMENT ON COLUMN file.tb_sys_file.create_time IS '创建时间';
COMMENT ON COLUMN file.tb_sys_file.update_time IS '更新时间';
COMMENT ON COLUMN file.tb_sys_file.delete_time IS '删除时间';
COMMENT ON COLUMN file.tb_sys_file.deleted IS '是否已删除（false-未删除，true-已删除）';

-- TbSysFileDTO 特有字段注释
COMMENT ON COLUMN file.tb_sys_file.file_id IS '文件ID (主键)';
COMMENT ON COLUMN file.tb_sys_file.file_root_id IS '文件根ID';
COMMENT ON COLUMN file.tb_sys_file.version IS '文件版本';
COMMENT ON COLUMN file.tb_sys_file.name IS '文件名';
COMMENT ON COLUMN file.tb_sys_file.path IS '文件路径';
COMMENT ON COLUMN file.tb_sys_file.size IS '文件大小（字节）';
COMMENT ON COLUMN file.tb_sys_file.type IS '文件类型';
COMMENT ON COLUMN file.tb_sys_file.storage_type IS '存储类型';
COMMENT ON COLUMN file.tb_sys_file.mime_type IS 'MIME 类型';
COMMENT ON COLUMN file.tb_sys_file.url IS '后端下载接口路径（保留用于扩展，建议使用 /api/file/download/{fileId}）';
COMMENT ON COLUMN file.tb_sys_file.status IS '文件状态';
COMMENT ON COLUMN file.tb_sys_file.module IS '所属模块';
COMMENT ON COLUMN file.tb_sys_file.business_id IS '业务ID';
COMMENT ON COLUMN file.tb_sys_file.uploader IS '上传者用户ID';
COMMENT ON COLUMN file.tb_sys_file.object_name IS 'MinIO对象名称';
COMMENT ON COLUMN file.tb_sys_file.bucket_name IS 'MinIO存储桶名称';
COMMENT ON COLUMN file.tb_sys_file.md5_hash IS '文件MD5值';
COMMENT ON COLUMN file.tb_sys_file.extension IS '文件扩展名';

-- 文件表索引
-- CREATE INDEX idx_file_module_business ON file.tb_sys_file(module, business_id) WHERE deleted = false;
-- CREATE INDEX idx_file_uploader ON file.tb_sys_file(uploader) WHERE deleted = false;
-- CREATE INDEX idx_file_bucket ON file.tb_sys_file(bucket_name) WHERE deleted = false;
-- CREATE INDEX idx_file_status ON file.tb_sys_file(status) WHERE deleted = false;
-- CREATE INDEX idx_file_create_time ON file.tb_sys_file(create_time) WHERE deleted = false;
-- CREATE INDEX idx_file_md5 ON file.tb_sys_file(md5_hash) WHERE deleted = false;