export const haproxySchema = {
  id: 'haproxy',
  name: 'HAProxy',
  icon: 'Connection',
  category: '高可用',
  description: '高性能 TCP/HTTP 负载均衡器和代理服务器',
  format: 'cfg',
  fileName: 'haproxy.cfg',
  groups: [
    {
      title: 'Global 全局配置',
      fields: [
        {
          key: 'globalMaxconn',
          label: '最大连接数',
          type: 'number',
          min: 100,
          max: 1000000,
          default: 1000,
        },
        {
          key: 'globalLog',
          label: '日志输出',
          type: 'text',
          default: '127.0.0.1 local0',
        },
        {
          key: 'globalChroot',
          label: '启用 chroot',
          type: 'switch',
          default: false,
          tip: '安全加固，限制进程访问范围',
        },
        {
          key: 'chrootDir',
          label: 'chroot 目录',
          type: 'text',
          default: '/var/lib/haproxy',
          dependsOn: { key: 'globalChroot', value: true },
        },
        {
          key: 'globalUser',
          label: '运行用户',
          type: 'text',
          default: 'haproxy',
        },
        {
          key: 'globalGroup',
          label: '运行用户组',
          type: 'text',
          default: 'haproxy',
        },
        {
          key: 'globalStatsEnable',
          label: '启用 Stats Socket',
          type: 'switch',
          default: true,
        },
        {
          key: 'statsSocket',
          label: 'Stats Socket 路径',
          type: 'text',
          default: '/var/run/haproxy.sock',
          dependsOn: { key: 'globalStatsEnable', value: true },
        },
      ],
    },
    {
      title: 'Defaults 默认配置',
      fields: [
        {
          key: 'defaultsMode',
          label: '代理模式',
          type: 'select',
          options: [
            { label: 'HTTP 模式', value: 'http' },
            { label: 'TCP 模式', value: 'tcp' },
          ],
          default: 'http',
        },
        {
          key: 'defaultsLog',
          label: '日志模式',
          type: 'text',
          default: 'global',
        },
        {
          key: 'defaultsOptionHttplog',
          label: '启用 HTTP 日志',
          type: 'switch',
          default: true,
        },
        {
          key: 'defaultsOptionDontlognull',
          label: '忽略空连接日志',
          type: 'switch',
          default: true,
        },
        {
          key: 'defaultsTimeoutConnect',
          label: '连接超时 (ms)',
          type: 'number',
          min: 100,
          max: 60000,
          default: 5000,
        },
        {
          key: 'defaultsTimeoutClient',
          label: '客户端超时 (ms)',
          type: 'number',
          min: 1000,
          max: 300000,
          default: 50000,
        },
        {
          key: 'defaultsTimeoutServer',
          label: '服务端超时 (ms)',
          type: 'number',
          min: 1000,
          max: 300000,
          default: 50000,
        },
        {
          key: 'defaultsRetries',
          label: '重试次数',
          type: 'number',
          min: 0,
          max: 10,
          default: 3,
        },
      ],
    },
    {
      title: 'Frontend 前端配置',
      fields: [
        {
          key: 'frontendName',
          label: '前端名称',
          type: 'text',
          default: 'myapp_front',
        },
        {
          key: 'frontendBind',
          label: '绑定地址',
          type: 'text',
          default: '*:80',
          tip: '格式: 地址:端口',
        },
        {
          key: 'frontendBackend',
          label: '关联后端',
          type: 'text',
          default: 'myapp_back',
        },
        {
          key: 'enableSsl',
          label: '启用 SSL',
          type: 'switch',
          default: false,
        },
        {
          key: 'sslBind',
          label: 'SSL 绑定配置',
          type: 'text',
          default: '*:443 ssl crt /etc/haproxy/cert.pem',
          dependsOn: { key: 'enableSsl', value: true },
        },
      ],
    },
    {
      title: 'Backend 后端配置',
      fields: [
        {
          key: 'backendName',
          label: '后端名称',
          type: 'text',
          default: 'myapp_back',
        },
        {
          key: 'balanceType',
          label: '负载均衡算法',
          type: 'select',
          options: [
            { label: 'roundrobin - 轮询 (推荐)', value: 'roundrobin' },
            { label: 'leastconn - 最少连接', value: 'leastconn' },
            { label: 'source - 源地址哈希', value: 'source' },
            { label: 'uri - URI 哈希', value: 'uri' },
          ],
          default: 'roundrobin',
        },
        {
          key: 'backendServer1',
          label: '后端服务器 1',
          type: 'text',
          default: 'web1 192.168.1.10:8080 check',
          tip: '格式: 名称 IP:端口 check',
        },
        {
          key: 'backendServer2',
          label: '后端服务器 2',
          type: 'text',
          default: 'web2 192.168.1.11:8080 check',
        },
      ],
    },
    {
      title: 'Stats 统计页面',
      fields: [
        {
          key: 'enableStats',
          label: '启用统计页面',
          type: 'switch',
          default: true,
        },
        {
          key: 'statsUri',
          label: '统计页面 URI',
          type: 'text',
          default: '/haproxy?stats',
          dependsOn: { key: 'enableStats', value: true },
        },
        {
          key: 'statsAuthEnable',
          label: '统计页面认证',
          type: 'switch',
          default: true,
          dependsOn: { key: 'enableStats', value: true },
        },
        {
          key: 'statsUser',
          label: '统计页面用户名',
          type: 'text',
          default: 'admin',
          dependsOn: { key: 'statsAuthEnable', value: true },
        },
        {
          key: 'statsPassword',
          label: '统计页面密码',
          type: 'text',
          default: 'admin',
          dependsOn: { key: 'statsAuthEnable', value: true },
        },
      ],
    },
  ],
}

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

  // Global
  lines.push(`global`)
  lines.push(`    log ${config.globalLog} local0`)
  lines.push(`    maxconn ${config.globalMaxconn}`)
  lines.push(`    user ${config.globalUser}`)
  lines.push(`    group ${config.globalGroup}`)
  lines.push(`    daemon`)
  if (config.globalChroot) {
    lines.push(`    chroot ${config.chrootDir}`)
  }
  if (config.globalStatsEnable) {
    lines.push(`    stats socket ${config.statsSocket} mode 660 level admin`)
  }
  lines.push(``)

  // Defaults
  lines.push(`defaults`)
  lines.push(`    mode ${config.defaultsMode}`)
  lines.push(`    log ${config.defaultsLog}`)
  if (config.defaultsOptionHttplog) {
    lines.push(`    option httplog`)
  }
  if (config.defaultsOptionDontlognull) {
    lines.push(`    option dontlognull`)
  }
  lines.push(`    timeout connect ${config.defaultsTimeoutConnect}`)
  lines.push(`    timeout client ${config.defaultsTimeoutClient}`)
  lines.push(`    timeout server ${config.defaultsTimeoutServer}`)
  lines.push(`    retries ${config.defaultsRetries}`)
  lines.push(``)

  // Frontend
  lines.push(`frontend ${config.frontendName}`)
  lines.push(`    bind ${config.frontendBind}`)
  if (config.enableSsl) {
    lines.push(`    bind ${config.sslBind}`)
  }
  lines.push(`    default_backend ${config.frontendBackend}`)
  lines.push(``)

  // Backend
  lines.push(`backend ${config.backendName}`)
  lines.push(`    balance ${config.balanceType}`)
  if (config.backendServer1) {
    lines.push(`    server ${config.backendServer1}`)
  }
  if (config.backendServer2) {
    lines.push(`    server ${config.backendServer2}`)
  }
  lines.push(``)

  // Stats
  if (config.enableStats) {
    lines.push(`listen stats`)
    lines.push(`    bind *:8404`)
    lines.push(`    stats enable`)
    lines.push(`    stats uri ${config.statsUri}`)
    if (config.statsAuthEnable) {
      lines.push(`    stats auth ${config.statsUser}:${config.statsPassword}`)
    }
    lines.push(`    stats refresh 10s`)
  }

  return lines.join('\n')
}
