-- =============================================
-- DataMate 任务协调模块 - 初始化脚本
-- 说明：
-- 1) 创建 t_task_meta 表（任务拆分与分配元数据）
-- 2) 创建 t_task_assignment_log 表（分配操作日志）
-- 3) 在 t_auth_permissions 中插入任务协调权限
-- 4) 将权限绑定到 ROLE_ADMIN 和 ROLE_DATA_EDITOR
-- 5) 本脚本按"幂等"方式编写，可重复执行
-- =============================================

USE datamate;

-- =============================================
-- 1) t_task_meta - 任务拆分与分配元数据表
-- =============================================
CREATE TABLE IF NOT EXISTS t_task_meta
(
    id              VARCHAR(36)  PRIMARY KEY                             COMMENT '任务元ID (UUID)',
    parent_id       VARCHAR(36)  NULL                                    COMMENT '父任务ID，顶层任务为NULL',
    module          VARCHAR(50)  NOT NULL                                COMMENT '所属模块: ANNOTATION/CLEANING/EVALUATION/SYNTHESIS/COLLECTION/RATIO',
    ref_task_id     VARCHAR(64)  NOT NULL                                COMMENT '关联的业务任务ID（各模块自己的task表ID）',
    task_name       VARCHAR(255) NOT NULL                                COMMENT '任务名称',
    status          VARCHAR(20)  NOT NULL DEFAULT 'PENDING'              COMMENT '状态: PENDING/IN_PROGRESS/COMPLETED/FAILED/STOPPED/CANCELLED',
    assigned_to     BIGINT       NULL                                    COMMENT '分配给的用户ID (users.id)',
    created_by      VARCHAR(255) NOT NULL                                COMMENT '创建者用户名',

    -- 进度字段
    progress        INT          NOT NULL DEFAULT 0                      COMMENT '进度百分比 0-100',
    total_items     INT          NOT NULL DEFAULT 0                      COMMENT '总条目数',
    completed_items INT          NOT NULL DEFAULT 0                      COMMENT '已完成条目数',
    failed_items    INT          NOT NULL DEFAULT 0                      COMMENT '失败条目数',

    -- 拆分配置
    split_strategy  VARCHAR(50)  NULL                                    COMMENT '拆分策略: BY_COUNT/BY_FILE/BY_PERCENTAGE/MANUAL',
    split_config    JSON         NULL                                    COMMENT '拆分配置参数',

    -- 调度
    priority        INT          NOT NULL DEFAULT 0                      COMMENT '优先级 0=普通 1=高 2=紧急',
    deadline        TIMESTAMP    NULL                                    COMMENT '截止时间',

    -- 时间戳
    started_at      TIMESTAMP    NULL                                    COMMENT '开始时间',
    completed_at    TIMESTAMP    NULL                                    COMMENT '完成时间',
    created_at      TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP      COMMENT '创建时间',
    updated_at      TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP
                                          ON UPDATE CURRENT_TIMESTAMP    COMMENT '更新时间',
    deleted_at      TIMESTAMP    NULL                                    COMMENT '删除时间（软删除）',

    -- 外键
    CONSTRAINT fk_task_meta_parent   FOREIGN KEY (parent_id)   REFERENCES t_task_meta (id) ON DELETE CASCADE,
    CONSTRAINT fk_task_meta_assignee FOREIGN KEY (assigned_to) REFERENCES users (id)       ON DELETE SET NULL,

    -- 索引
    INDEX idx_task_meta_parent_id   (parent_id),
    INDEX idx_task_meta_module_ref  (module, ref_task_id),
    INDEX idx_task_meta_assigned_to (assigned_to),
    INDEX idx_task_meta_status      (status),
    INDEX idx_task_meta_created_by  (created_by)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COMMENT = '任务拆分与分配元数据表';


-- =============================================
-- 2) t_task_assignment_log - 分配操作日志表
-- =============================================
CREATE TABLE IF NOT EXISTS t_task_assignment_log
(
    id            VARCHAR(36)  PRIMARY KEY                          COMMENT '日志ID (UUID)',
    task_meta_id  VARCHAR(36)  NOT NULL                             COMMENT '任务元ID',
    action        VARCHAR(20)  NOT NULL                             COMMENT '操作类型: ASSIGN/REASSIGN/REVOKE',
    from_user_id  BIGINT       NULL                                 COMMENT '原分配用户ID',
    to_user_id    BIGINT       NULL                                 COMMENT '新分配用户ID',
    operated_by   VARCHAR(255) NOT NULL                             COMMENT '操作者用户名',
    remark        VARCHAR(500) NULL                                 COMMENT '备注',
    created_at    TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP   COMMENT '创建时间',

    -- 外键
    CONSTRAINT fk_assignment_log_task FOREIGN KEY (task_meta_id) REFERENCES t_task_meta (id) ON DELETE CASCADE,

    -- 索引
    INDEX idx_assignment_log_task_meta_id (task_meta_id)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COMMENT = '任务分配操作日志';


-- =============================================
-- 3) 任务协调权限初始化
-- =============================================
INSERT IGNORE INTO t_auth_permissions (id, permission_code, permission_name, module, action, path_pattern, method, enabled, is_built_in)
VALUES ('perm-tc-read',   'module:task-coordination:read',   '任务协调读取', 'task-coordination', 'read',   '/api/task-meta/**',       'GET',                    1, 1),
       ('perm-tc-write',  'module:task-coordination:write',  '任务协调写入', 'task-coordination', 'write',  '/api/task-meta/**',       'POST,PUT,PATCH,DELETE',  1, 1),
       ('perm-tc-assign', 'module:task-coordination:assign', '任务分配',     'task-coordination', 'assign', '/api/task-meta/*/assign', 'POST',                   1, 1);


-- =============================================
-- 4) 绑定权限到角色
-- =============================================

-- 管理员获得全部任务协调权限
INSERT IGNORE INTO t_auth_role_permissions (role_id, permission_id)
SELECT 'role-admin', p.id
FROM t_auth_permissions p
WHERE p.permission_code IN (
    'module:task-coordination:read',
    'module:task-coordination:write',
    'module:task-coordination:assign'
);

-- 数据运营获得任务协调读写和分配权限
INSERT IGNORE INTO t_auth_role_permissions (role_id, permission_id)
SELECT 'role-data-editor', p.id
FROM t_auth_permissions p
WHERE p.permission_code IN (
    'module:task-coordination:read',
    'module:task-coordination:write',
    'module:task-coordination:assign'
);
