export const redisSchema = {
  id: 'redis',
  name: 'Redis',
  icon: 'Coin',
  category: '缓存',
  description: '高性能内存键值存储与缓存',
  format: 'conf',
  fileName: 'redis.conf',
  groups: [
    {
      title: '基础配置',
      fields: [
        {
          key: 'port',
          label: '监听端口',
          type: 'number',
          min: 1,
          max: 65535,
          default: 6379,
        },
        {
          key: 'bind',
          label: '绑定地址',
          type: 'text',
          default: '0.0.0.0',
          tip: '0.0.0.0 允许所有地址连接，生产环境建议限制',
        },
        {
          key: 'daemonize',
          label: '守护进程模式',
          type: 'switch',
          default: true,
          tip: '后台运行 Redis',
        },
        {
          key: 'requirepass',
          label: '访问密码',
          type: 'text',
          placeholder: '留空表示无密码',
          default: '',
          tip: '生产环境务必设置强密码',
        },
      ],
    },
    {
      title: '内存管理',
      fields: [
        {
          key: 'maxmemory',
          label: '最大内存限制',
          type: 'select',
          options: [
            { label: '128mb', value: '128mb' },
            { label: '256mb', value: '256mb' },
            { label: '512mb', value: '512mb' },
            { label: '1gb', value: '1gb' },
            { label: '2gb', value: '2gb' },
            { label: '4gb', value: '4gb' },
            { label: '8gb', value: '8gb' },
            { label: '不限制', value: '0' },
          ],
          default: '256mb',
          tip: 'Redis 最大可用内存',
        },
        {
          key: 'maxmemoryPolicy',
          label: '内存淘汰策略',
          type: 'select',
          options: [
            { label: 'noeviction - 不淘汰，内存满时写入报错', value: 'noeviction' },
            { label: 'allkeys-lru - 所有键中淘汰最近最少使用 (推荐)', value: 'allkeys-lru' },
            { label: 'volatile-lru - 仅从设置了过期时间的键中淘汰 LRU', value: 'volatile-lru' },
            { label: 'allkeys-random - 所有键中随机淘汰', value: 'allkeys-random' },
            { label: 'volatile-ttl - 淘汰最近将过期的键', value: 'volatile-ttl' },
          ],
          default: 'allkeys-lru',
          dependsOn: { key: 'maxmemory', valueNotIn: ['0'] },
        },
      ],
    },
    {
      title: '持久化配置',
      fields: [
        {
          key: 'enableRdb',
          label: 'RDB 快照',
          type: 'switch',
          default: true,
          tip: '定期将内存数据快照写入磁盘',
        },
        {
          key: 'rdbSaveRules',
          label: 'RDB 保存规则',
          type: 'select',
          options: [
            { label: '默认策略 (推荐)', value: 'default' },
            { label: '保守策略 (数据安全优先)', value: 'conservative' },
            { label: '激进策略 (性能优先)', value: 'aggressive' },
          ],
          default: 'default',
          dependsOn: { key: 'enableRdb', value: true },
        },
        {
          key: 'enableAof',
          label: 'AOF 持久化',
          type: 'switch',
          default: false,
          tip: '记录每次写操作，数据安全性更高',
        },
        {
          key: 'aofFsync',
          label: 'AOF 同步策略',
          type: 'select',
          options: [
            { label: 'everysec - 每秒同步 (推荐)', value: 'everysec' },
            { label: 'always - 每次写入同步 (最安全，性能最低)', value: 'always' },
            { label: 'no - 由操作系统决定 (性能最高)', value: 'no' },
          ],
          default: 'everysec',
          dependsOn: { key: 'enableAof', value: true },
        },
      ],
    },
    {
      title: '运行模式',
      fields: [
        {
          key: 'mode',
          label: '运行模式',
          type: 'select',
          options: [
            { label: '单机模式 (Standalone)', value: 'standalone' },
            { label: '哨兵模式 (Sentinel)', value: 'sentinel' },
            { label: '集群模式 (Cluster)', value: 'cluster' },
          ],
          default: 'standalone',
        },
        {
          key: 'sentinelPort',
          label: '哨兵端口',
          type: 'number',
          min: 1,
          max: 65535,
          default: 26379,
          dependsOn: { key: 'mode', value: 'sentinel' },
        },
        {
          key: 'sentinelMasterName',
          label: '主节点名称',
          type: 'text',
          default: 'mymaster',
          dependsOn: { key: 'mode', value: 'sentinel' },
        },
        {
          key: 'sentinelDownAfter',
          label: '主观下线时间 (毫秒)',
          type: 'number',
          min: 1000,
          max: 60000,
          step: 1000,
          default: 5000,
          dependsOn: { key: 'mode', value: 'sentinel' },
        },
        {
          key: 'clusterNodeTimeout',
          label: '集群节点超时 (毫秒)',
          type: 'number',
          min: 1000,
          max: 30000,
          step: 1000,
          default: 5000,
          dependsOn: { key: 'mode', value: 'cluster' },
        },
      ],
    },
    {
      title: '连接与性能',
      fields: [
        {
          key: 'timeout',
          label: '空闲连接超时 (秒)',
          type: 'number',
          min: 0,
          max: 3600,
          default: 300,
          tip: '0 表示不超时',
        },
        {
          key: 'maxclients',
          label: '最大客户端连接数',
          type: 'number',
          min: 1,
          max: 100000,
          default: 10000,
        },
        {
          key: 'tcpKeepalive',
          label: 'TCP Keep-Alive (秒)',
          type: 'number',
          min: 0,
          max: 3600,
          default: 300,
          tip: '0 表示不开启',
        },
      ],
    },
  ],
}

export function generateRedisConf(config) {
  const lines = []
  lines.push(`# Redis 配置文件 - 由 ConfTemplate 生成`)
  lines.push(`# 生成时间: ${new Date().toLocaleString('zh-CN')}`)
  lines.push(``)

  // 基础配置
  lines.push(`################################## 基础配置 ##################################`)
  lines.push(``)
  lines.push(`port ${config.port}`)
  lines.push(`bind ${config.bind}`)
  lines.push(`daemonize ${config.daemonize ? 'yes' : 'no'}`)
  lines.push(`pidfile /var/run/redis_${config.port}.pid`)
  lines.push(`loglevel notice`)
  lines.push(`logfile /var/log/redis/redis_${config.port}.log`)
  lines.push(`databases 16`)

  if (config.requirepass) {
    lines.push(``)
    lines.push(`# 安全 - 访问密码`)
    lines.push(`requirepass ${config.requirepass}`)
  }
  lines.push(``)

  // 内存管理
  lines.push(`################################## 内存管理 ##################################`)
  lines.push(``)
  if (config.maxmemory === '0') {
    lines.push(`# maxmemory <bytes>  # 未设置内存限制`)
  } else {
    lines.push(`maxmemory ${config.maxmemory}`)
    lines.push(`maxmemory-policy ${config.maxmemoryPolicy}`)
  }
  lines.push(``)

  // 持久化
  lines.push(`################################## 持久化 ##################################`)
  lines.push(``)

  if (config.enableRdb) {
    lines.push(`# RDB 快照配置`)
    lines.push(`dbfilename dump.rdb`)
    lines.push(`dir /var/lib/redis`)

    if (config.rdbSaveRules === 'default') {
      lines.push(`save 900 1`)
      lines.push(`save 300 10`)
      lines.push(`save 60 10000`)
    } else if (config.rdbSaveRules === 'conservative') {
      lines.push(`save 3600 1`)
      lines.push(`save 300 100`)
      lines.push(`save 60 10000`)
    } else {
      lines.push(`save 60 1000`)
      lines.push(`save 10 10000`)
    }
    lines.push(`rdbcompression yes`)
    lines.push(`rdbchecksum yes`)
  } else {
    lines.push(`# RDB 快照已禁用`)
    lines.push(`save ""`)
  }
  lines.push(``)

  if (config.enableAof) {
    lines.push(`# AOF 持久化配置`)
    lines.push(`appendonly yes`)
    lines.push(`appendfilename "appendonly.aof"`)
    lines.push(`appendfsync ${config.aofFsync}`)
    lines.push(`auto-aof-rewrite-percentage 100`)
    lines.push(`auto-aof-rewrite-min-size 64mb`)
  } else {
    lines.push(`# AOF 持久化已禁用`)
    lines.push(`appendonly no`)
  }
  lines.push(``)

  // 运行模式
  if (config.mode === 'sentinel') {
    lines.push(`################################## 哨兵配置 ##################################`)
    lines.push(`# 以下为 sentinel.conf 内容，需单独放置`)
    lines.push(``)
    lines.push(`port ${config.sentinelPort}`)
    lines.push(`sentinel monitor ${config.sentinelMasterName} 127.0.0.1 ${config.port} 2`)
    lines.push(`sentinel down-after-milliseconds ${config.sentinelMasterName} ${config.sentinelDownAfter}`)
    lines.push(`sentinel failover-timeout ${config.sentinelMasterName} 60000`)
    lines.push(`sentinel parallel-syncs ${config.sentinelMasterName} 1`)
    lines.push(``)
  } else if (config.mode === 'cluster') {
    lines.push(`################################## 集群配置 ##################################`)
    lines.push(``)
    lines.push(`cluster-enabled yes`)
    lines.push(`cluster-config-file nodes-${config.port}.conf`)
    lines.push(`cluster-node-timeout ${config.clusterNodeTimeout}`)
    lines.push(`cluster-announce-ip 127.0.0.1`)
    lines.push(`cluster-announce-port ${config.port}`)
    lines.push(`cluster-announce-bus-port ${config.port + 10000}`)
    lines.push(``)
  }

  // 连接与性能
  lines.push(`################################## 连接与性能 ##################################`)
  lines.push(``)
  lines.push(`timeout ${config.timeout}`)
  lines.push(`tcp-keepalive ${config.tcpKeepalive}`)
  lines.push(`maxclients ${config.maxclients}`)
  lines.push(`tcp-backlog 511`)

  return lines.join('\n')
}
