-- zikai_filesvc 数据库的表定义。
-- 由 app/scripts/init_db.py 通过本机 socket 以 root 身份执行；表级幂等。

SET NAMES utf8mb4;

CREATE TABLE IF NOT EXISTS `uploaded_file` (
    `id`                BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `storage_path`      VARCHAR(512)    NOT NULL COMMENT 'upload_dir 下相对路径，例如 2026/06/<uuid>.bin',
    `original_filename` VARCHAR(512)    NOT NULL,
    `content_type`      VARCHAR(255)    NOT NULL DEFAULT '',
    `size_bytes`        BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `sha256`            CHAR(64)        NOT NULL DEFAULT '',
    `source`            VARCHAR(32)     NOT NULL DEFAULT 'http' COMMENT 'http / sftp / ...',
    `uploaded_by`       VARCHAR(128)    NOT NULL DEFAULT '',
    `uploaded_at`       DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_uploaded_at` (`uploaded_at`),
    KEY `idx_source` (`source`),
    KEY `idx_sha256` (`sha256`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 分片上传会话表。由 app/services/chunk_upload_service.py 使用。
-- 运行时也由 Base.metadata.create_all 幂等创建，此处供 init_db.py 全新建库时一并导入。
CREATE TABLE IF NOT EXISTS `upload_session` (
    `id`                BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `upload_id`         CHAR(64)        NOT NULL COMMENT 'uuid4().hex，客户端持有的会话标识',
    `filename`          VARCHAR(512)    NOT NULL,
    `size_bytes`        BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `chunk_size`        BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `total_chunks`      BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `uploaded_chunks`   JSON            NOT NULL COMMENT '已上传分片下标数组，如 [0,1,3]',
    `file_id`           BIGINT UNSIGNED NULL DEFAULT NULL COMMENT 'complete 后指向 uploaded_file.id',
    `status`            VARCHAR(32)     NOT NULL DEFAULT 'pending' COMMENT 'pending/completed/failed',
    `created_at`        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uq_upload_id` (`upload_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 反向隧道会话表。由 app/services/tunnel_service.py + sftp_server.py 使用。
CREATE TABLE IF NOT EXISTS `tunnel_session` (
    `id`                BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `user_name`         VARCHAR(128)    NOT NULL COMMENT '发起隧道的 user 名',
    `user_ip`           VARCHAR(64)     NOT NULL DEFAULT '' COMMENT 'user 端 SSH peer 地址',
    `local_port`        INT             NOT NULL COMMENT 'user 要暴露的本地服务端口',
    `tunnel_port`       INT             NOT NULL COMMENT 'server 侧 SSH remote forward 绑定的本地端口',
    `started_at`        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `ended_at`          DATETIME        NULL DEFAULT NULL,
    `status`            VARCHAR(32)     NOT NULL DEFAULT 'active' COMMENT 'active/closed',
    PRIMARY KEY (`id`),
    KEY `idx_user_name` (`user_name`),
    KEY `idx_tunnel_port` (`tunnel_port`),
    KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 共享白板表（文本记事本）。由 app/services/whiteboard_service.py 使用。
-- content 存完整文本，version 是乐观锁版本号（每次编辑 +1），edit_count 累计编辑次数。
-- 白板长期留存，实时同步由 WebSocket hub 在内存维护在线连接。
CREATE TABLE IF NOT EXISTS `whiteboard` (
    `id`                BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `board_id`          VARCHAR(64)     NOT NULL COMMENT '用户可读的 url id，[a-zA-Z0-9_-]{1,64}',
    `content`           MEDIUMTEXT      NOT NULL COMMENT '白板文本内容',
    `version`           INT             NOT NULL DEFAULT 0 COMMENT '乐观锁版本号，每次编辑 +1',
    `edit_count`        INT             NOT NULL DEFAULT 0 COMMENT '累计编辑次数（含清空）',
    `created_at`        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uq_board_id` (`board_id`),
    KEY `idx_updated_at` (`updated_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- PDF 转换任务表。由 app/services/pdf_service.py 使用。
-- 原始文件与产物 PDF 复用 uploaded_file 存储，本表只记录关系与转换状态。
-- 删除两级：user_deleted（用户软删，管理页仍可见）/ admin 硬删（真正删除）。
CREATE TABLE IF NOT EXISTS `pdf_job` (
    `id`                BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `owner_cookie`      VARCHAR(64)     NOT NULL COMMENT '用户标识（httpOnly cookie 值，uuid4 hex）',
    `source_file_id`    BIGINT UNSIGNED NOT NULL COMMENT '原始上传文件 -> uploaded_file.id',
    `source_filename`   VARCHAR(512)    NOT NULL,
    `source_size`       BIGINT UNSIGNED NOT NULL DEFAULT 0,
    `output_file_id`    BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '产物 PDF -> uploaded_file.id，转换完成前 NULL',
    `status`            VARCHAR(16)     NOT NULL DEFAULT 'pending' COMMENT 'pending/converting/done/failed',
    `progress`          INT             NOT NULL DEFAULT 0 COMMENT '转换进度 0-100',
    `error_message`     VARCHAR(512)    NOT NULL DEFAULT '',
    `user_deleted`      TINYINT(1)      NOT NULL DEFAULT 0 COMMENT '用户软删标记',
    `deleted_at`        DATETIME        NULL DEFAULT NULL COMMENT '用户软删时间',
    `created_at`        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_owner_cookie` (`owner_cookie`),
    KEY `idx_status` (`status`),
    KEY `idx_user_deleted` (`user_deleted`),
    KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
