-- 测试数据插入脚本
-- 用于验证数据库表结构和功能

-- ============================================
-- 1. 插入测试操作记录
-- ============================================

-- 测试1: 插入包含 IP 信息的操作记录
INSERT INTO operation (
    op_id, op_actor, doid, producer_id,
    request_body_hash, response_body_hash,
    op_source, op_type, do_prefix, do_repository,
    client_ip, server_ip, trustlog_status, timestamp
) VALUES (
    'test-op-001',
    'test-user',
    '10.1000/test-repo/doc001',
    'producer-001',
    'req_hash_001',
    'resp_hash_001',
    'DOIP',
    'Create',
    '10.1000',
    'test-repo',
    '192.168.1.100',  -- 客户端IP
    '10.0.0.50',      -- 服务端IP
    'TRUSTLOGGED',    -- 已存证
    CURRENT_TIMESTAMP
);

-- 测试2: 插入 IP 为 NULL 的操作记录
INSERT INTO operation (
    op_id, op_actor, doid, producer_id,
    request_body_hash, response_body_hash,
    op_source, op_type, do_prefix, do_repository,
    client_ip, server_ip, trustlog_status, timestamp
) VALUES (
    'test-op-002',
    'test-user',
    '10.1000/test-repo/doc002',
    'producer-001',
    'req_hash_002',
    'resp_hash_002',
    'DOIP',
    'Update',
    '10.1000',
    'test-repo',
    NULL,                -- IP 为 NULL
    NULL,                -- IP 为 NULL
    'NOT_TRUSTLOGGED',   -- 未存证
    CURRENT_TIMESTAMP
);

-- 测试3: 插入只有客户端 IP 的记录
INSERT INTO operation (
    op_id, op_actor, doid, producer_id,
    request_body_hash, response_body_hash,
    op_source, op_type, do_prefix, do_repository,
    client_ip, server_ip, trustlog_status, timestamp
) VALUES (
    'test-op-003',
    'test-user',
    '10.1000/test-repo/doc003',
    'producer-001',
    'req_hash_003',
    'resp_hash_003',
    'IRP',
    'Delete',
    '10.1000',
    'test-repo',
    '172.16.0.100',      -- 仅客户端IP
    NULL,                -- 服务端IP为NULL
    'NOT_TRUSTLOGGED',
    CURRENT_TIMESTAMP
);

-- ============================================
-- 2. 插入测试重试记录
-- ============================================

-- 测试1: 待重试记录
INSERT INTO trustlog_retry (
    op_id, retry_count, retry_status,
    last_retry_at, next_retry_at, error_message
) VALUES (
    'test-op-002',
    0,
    'PENDING',
    NULL,
    CURRENT_TIMESTAMP,  -- 立即重试
    'Initial retry'
);

-- 测试2: 重试中记录
INSERT INTO trustlog_retry (
    op_id, retry_count, retry_status,
    last_retry_at, next_retry_at, error_message
) VALUES (
    'test-op-003',
    2,
    'RETRYING',
    CURRENT_TIMESTAMP,
    CURRENT_TIMESTAMP,  -- 下次重试时间
    'Connection timeout'
);

-- ============================================
-- 3. 验证查询
-- ============================================

-- 查询所有操作记录
SELECT 
    op_id,
    op_type,
    client_ip,
    server_ip,
    trustlog_status,
    timestamp
FROM operation
ORDER BY timestamp DESC;

-- 查询包含 IP 信息的记录
SELECT 
    op_id,
    client_ip,
    server_ip,
    trustlog_status
FROM operation
WHERE client_ip IS NOT NULL OR server_ip IS NOT NULL;

-- 查询未存证的记录
SELECT 
    op_id,
    doid,
    trustlog_status,
    timestamp
FROM operation
WHERE trustlog_status = 'NOT_TRUSTLOGGED'
ORDER BY timestamp ASC;

-- 查询重试记录
SELECT 
    r.op_id,
    r.retry_count,
    r.retry_status,
    r.error_message,
    o.doid
FROM trustlog_retry r
JOIN operation o ON r.op_id = o.op_id
ORDER BY r.next_retry_at ASC;

-- 查询游标状态
SELECT * FROM trustlog_cursor WHERE id = 1;

-- ============================================
-- 4. 统计查询
-- ============================================

-- 统计各状态的记录数
SELECT 
    trustlog_status,
    COUNT(*) as count
FROM operation
GROUP BY trustlog_status;

-- 统计 IP 字段使用情况
SELECT 
    CASE 
        WHEN client_ip IS NOT NULL THEN 'Has Client IP'
        ELSE 'No Client IP'
    END as client_ip_status,
    CASE 
        WHEN server_ip IS NOT NULL THEN 'Has Server IP'
        ELSE 'No Server IP'
    END as server_ip_status,
    COUNT(*) as count
FROM operation
GROUP BY 
    CASE WHEN client_ip IS NOT NULL THEN 'Has Client IP' ELSE 'No Client IP' END,
    CASE WHEN server_ip IS NOT NULL THEN 'Has Server IP' ELSE 'No Server IP' END;

-- 统计重试状态
SELECT 
    retry_status,
    COUNT(*) as count,
    AVG(retry_count) as avg_retry_count
FROM trustlog_retry
GROUP BY retry_status;

-- ============================================
-- 5. 清理测试数据
-- ============================================

-- 取消注释以下语句来清理测试数据
/*
DELETE FROM trustlog_retry WHERE op_id LIKE 'test-op-%';
DELETE FROM operation WHERE op_id LIKE 'test-op-%';
UPDATE trustlog_cursor SET 
    last_processed_id = NULL,
    last_processed_at = NULL
WHERE id = 1;
*/

