import {
  generateMLKEM768KeyPair,
  generatePassword,
  generateRealityKeyPair,
  generateRealityShortId,
} from '../generate';
import {
  CERT_MODES,
  ENCRYPTION_MODES,
  ENCRYPTION_RTT,
  ENCRYPTION_TYPES,
  FINGERPRINTS,
  FLOWS,
  multiplexLevels,
  SECURITY,
  SS_CIPHERS,
  TRANSPORTS,
  TUIC_CONGESTION,
  TUIC_UDP_RELAY_MODES,
  XHTTP_MODES,
} from './constants';
import type { FieldConfig } from './types';

export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
  shadowsocks: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'cipher',
      type: 'select',
      label: 'cipher',
      options: SS_CIPHERS,
      defaultValue: 'chacha20-ietf-poly1305',
      group: 'basic',
    },
    {
      name: 'server_key',
      type: 'input',
      label: 'server_key',
      generate: {
        function: () => generatePassword(32),
      },
      group: 'basic',
      condition: (p) =>
        [
          '2022-blake3-aes-128-gcm',
          '2022-blake3-aes-256-gcm',
          '2022-blake3-chacha20-poly1305',
        ].includes(p.cipher),
    },
    {
      name: 'obfs',
      type: 'select',
      label: 'obfs',
      options: ['none', 'http', 'tls'],
      defaultValue: 'none',
      group: 'obfs',
    },
    {
      name: 'obfs_host',
      type: 'input',
      label: 'host',
      placeholder: 'e.g. www.bing.com',
      group: 'obfs',
      condition: (p) => p.obfs && p.obfs !== 'none',
    },
    {
      name: 'obfs_path',
      type: 'input',
      label: 'path',
      placeholder: 'e.g. /path/to/obfs',
      group: 'obfs',
      condition: (p) => p.obfs && p.obfs !== 'none',
    },
    {
      name: 'sni',
      type: 'input',
      label: 'security_sni',
      group: 'security',
      condition: (p) => p.obfs === 'tls',
    },
    {
      name: 'allow_insecure',
      type: 'switch',
      label: 'security_allow_insecure',
      group: 'security',
      condition: (p) => p.obfs === 'tls',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
      condition: (p) => p.obfs === 'tls',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.obfs === 'tls' && p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.obfs === 'tls' && p.cert_mode === 'dns',
    },
  ],
  vmess: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'transport',
      type: 'select',
      label: 'transport',
      options: TRANSPORTS.vmess,
      defaultValue: 'tcp',
      group: 'transport',
    },
    {
      name: 'security',
      type: 'select',
      label: 'security',
      options: SECURITY.vmess,
      defaultValue: 'none',
      group: 'security',
    },
    {
      name: 'host',
      type: 'input',
      label: 'host',
      placeholder: 'e.g. www.bing.com',
      group: 'transport',
      condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport),
    },
    {
      name: 'path',
      type: 'input',
      label: 'path',
      placeholder: 'e.g. /path/to/obfs',
      group: 'transport',
      condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport),
    },
    {
      name: 'service_name',
      type: 'input',
      label: 'service_name',
      group: 'transport',
      condition: (p) => p.transport === 'grpc',
    },
    {
      name: 'sni',
      type: 'input',
      label: 'security_sni',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'allow_insecure',
      type: 'switch',
      label: 'security_allow_insecure',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'fingerprint',
      type: 'select',
      label: 'security_fingerprint',
      options: FINGERPRINTS,
      defaultValue: 'chrome',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
      condition: (p) => p.security === 'tls',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
  ],
  vless: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'transport',
      type: 'select',
      label: 'transport',
      options: TRANSPORTS.vless,
      defaultValue: 'tcp',
      group: 'transport',
    },
    {
      name: 'flow',
      type: 'select',
      label: 'flow',
      options: FLOWS.vless,
      defaultValue: 'none',
      group: 'transport',
      condition: (p) => p.transport === 'tcp',
    },
    {
      name: 'security',
      type: 'select',
      label: 'security',
      options: SECURITY.vless,
      defaultValue: 'none',
      group: 'security',
    },
    {
      name: 'host',
      type: 'input',
      label: 'host',
      placeholder: 'e.g. www.bing.com',
      group: 'transport',
      condition: (p) => ['websocket', 'mkcp', 'httpupgrade', 'xhttp'].includes(p.transport),
    },
    {
      name: 'path',
      type: 'input',
      label: 'path',
      placeholder: 'e.g. /path/to/obfs',
      group: 'transport',
      condition: (p) => ['websocket', 'mkcp', 'httpupgrade', 'xhttp'].includes(p.transport),
    },
    {
      name: 'service_name',
      type: 'input',
      label: 'service_name',
      group: 'transport',
      condition: (p) => p.transport === 'grpc',
    },
    {
      name: 'xhttp_mode',
      type: 'select',
      label: 'mode',
      options: XHTTP_MODES,
      defaultValue: 'auto',
      group: 'transport',
      condition: (p) => p.transport === 'xhttp',
    },
    {
      name: 'xhttp_extra',
      type: 'textarea',
      label: 'extra',
      placeholder: '{}',
      group: 'transport',
      condition: (p) => p.transport === 'xhttp',
    },
    {
      name: 'sni',
      type: 'input',
      label: 'security_sni',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'allow_insecure',
      type: 'switch',
      label: 'security_allow_insecure',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'fingerprint',
      type: 'select',
      label: 'security_fingerprint',
      options: FINGERPRINTS,
      defaultValue: 'chrome',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'reality_server_addr',
      type: 'input',
      label: 'security_server_address',
      placeholder: (t) => t('security_server_address_placeholder'),
      group: 'reality',
      condition: (p) => p.security === 'reality',
    },
    {
      name: 'reality_server_port',
      type: 'number',
      label: 'security_server_port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'reality',
      condition: (p) => p.security === 'reality',
    },
    {
      name: 'reality_private_key',
      type: 'input',
      label: 'security_private_key',
      placeholder: (t) => t('security_private_key_placeholder'),
      group: 'reality',
      generate: {
        function: generateRealityKeyPair,
        updateFields: {
          reality_private_key: 'privateKey',
          reality_public_key: 'publicKey',
        },
      },
      condition: (p) => p.security === 'reality',
    },
    {
      name: 'reality_public_key',
      type: 'input',
      label: 'security_public_key',
      placeholder: (t) => t('security_public_key_placeholder'),
      group: 'reality',
      condition: (p) => p.security === 'reality',
    },
    {
      name: 'reality_short_id',
      type: 'input',
      label: 'security_short_id',
      group: 'reality',
      generate: {
        function: generateRealityShortId,
      },
      condition: (p) => p.security === 'reality',
    },
    {
      name: 'encryption',
      type: 'select',
      label: 'encryption',
      options: ENCRYPTION_TYPES,
      defaultValue: 'none',
      group: 'encryption',
    },
    {
      name: 'encryption_mode',
      type: 'select',
      label: 'encryption_mode',
      options: ENCRYPTION_MODES,
      defaultValue: 'native',
      group: 'encryption',
      condition: (p) => p.encryption === 'mlkem768x25519plus',
    },
    {
      name: 'encryption_rtt',
      type: 'select',
      label: 'encryption_rtt',
      options: ENCRYPTION_RTT,
      defaultValue: '1rtt',
      group: 'encryption',
      condition: (p) => p.encryption === 'mlkem768x25519plus',
    },
    {
      name: 'encryption_ticket',
      type: 'input',
      label: 'encryption_ticket',
      placeholder: 'e.g. 600s',
      group: 'encryption',
      condition: (p) => p.encryption === 'mlkem768x25519plus' && p.encryption_rtt === '0rtt',
    },
    {
      name: 'encryption_server_padding',
      type: 'input',
      label: 'encryption_server_padding',
      placeholder: 'e.g. 100-111-1111.75-0-111.50-0-3333',
      group: 'encryption',
      condition: (p) => p.encryption === 'mlkem768x25519plus',
    },
    {
      name: 'encryption_private_key',
      type: 'input',
      label: 'encryption_private_key',
      placeholder: (t) => t('encryption_private_key_placeholder'),
      group: 'encryption',
      generate: {
        functions: [
          {
            label: (t) => t('generate_standard_encryption_key'),
            function: generateRealityKeyPair,
          },
          {
            label: (t) => t('generate_quantum_resistant_key'),
            function: generateMLKEM768KeyPair,
          },
        ],
        updateFields: {
          encryption_private_key: 'privateKey',
          encryption_password: 'publicKey',
        },
      },
      condition: (p) => p.encryption === 'mlkem768x25519plus',
    },
    {
      name: 'encryption_client_padding',
      type: 'input',
      label: 'encryption_client_padding',
      placeholder: 'e.g. 100-111-1111.75-0-111.50-0-3333',
      group: 'encryption',
      condition: (p) => p.encryption === 'mlkem768x25519plus',
    },
    {
      name: 'encryption_password',
      type: 'input',
      label: 'encryption_password',
      placeholder: (t) => t('encryption_password_placeholder'),
      group: 'encryption',
      condition: (p) => p.encryption === 'mlkem768x25519plus',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
      condition: (p) => p.security === 'tls',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
  ],
  trojan: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'transport',
      type: 'select',
      label: 'transport',
      options: TRANSPORTS.trojan,
      defaultValue: 'tcp',
      group: 'transport',
    },
    {
      name: 'security',
      type: 'select',
      label: 'security',
      options: SECURITY.trojan,
      defaultValue: 'tls',
      group: 'security',
    },
    {
      name: 'host',
      type: 'input',
      label: 'host',
      placeholder: 'e.g. www.bing.com',
      group: 'transport',
      condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport),
    },
    {
      name: 'path',
      type: 'input',
      label: 'path',
      placeholder: 'e.g. /path/to/obfs',
      group: 'transport',
      condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport),
    },
    {
      name: 'service_name',
      type: 'input',
      label: 'service_name',
      group: 'transport',
      condition: (p) => p.transport === 'grpc',
    },
    {
      name: 'sni',
      type: 'input',
      label: 'security_sni',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'allow_insecure',
      type: 'switch',
      label: 'security_allow_insecure',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'fingerprint',
      type: 'select',
      label: 'security_fingerprint',
      options: FINGERPRINTS,
      defaultValue: 'chrome',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
      condition: (p) => p.security === 'tls',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
  ],
  hysteria: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'hop_ports',
      type: 'input',
      label: 'hop_ports',
      placeholder: (t) => t('hop_ports_placeholder'),
      group: 'basic',
    },
    {
      name: 'hop_interval',
      type: 'number',
      label: 'hop_interval',
      placeholder: 'e.g. 300',
      min: 1,
      suffix: 'S',
      group: 'basic',
    },
    {
      name: 'obfs',
      type: 'select',
      label: 'obfs',
      options: ['none', 'salamander'],
      defaultValue: 'none',
      group: 'obfs',
    },
    {
      name: 'obfs_password',
      type: 'input',
      label: 'obfs_password',
      placeholder: (t) => t('obfs_password_placeholder'),
      generate: {
        function: () => generatePassword(16),
      },
      group: 'obfs',
      condition: (p) => p.obfs && p.obfs !== 'none',
    },
    {
      name: 'up_mbps',
      type: 'number',
      label: 'up_mbps',
      min: 1,
      placeholder: (t) => t('bandwidth_placeholder'),
      suffix: 'Mbps',
      group: 'basic',
    },
    {
      name: 'down_mbps',
      type: 'number',
      label: 'down_mbps',
      min: 1,
      placeholder: (t) => t('bandwidth_placeholder'),
      suffix: 'Mbps',
      group: 'basic',
    },
    { name: 'sni', type: 'input', label: 'security_sni', group: 'security' },
    { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security' },
    {
      name: 'fingerprint',
      type: 'select',
      label: 'security_fingerprint',
      options: FINGERPRINTS,
      defaultValue: 'chrome',
      group: 'security',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.cert_mode === 'dns',
    },
  ],
  tuic: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'udp_relay_mode',
      type: 'select',
      label: 'udp_relay_mode',
      options: TUIC_UDP_RELAY_MODES,
      defaultValue: 'native',
      group: 'basic',
    },
    {
      name: 'congestion_controller',
      type: 'select',
      label: 'congestion_controller',
      options: TUIC_CONGESTION,
      defaultValue: 'bbr',
      group: 'basic',
    },
    { name: 'disable_sni', type: 'switch', label: 'disable_sni', group: 'basic' },
    { name: 'reduce_rtt', type: 'switch', label: 'reduce_rtt', group: 'basic' },
    { name: 'sni', type: 'input', label: 'security_sni', group: 'security' },
    { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security' },
    {
      name: 'fingerprint',
      type: 'select',
      label: 'security_fingerprint',
      options: FINGERPRINTS,
      defaultValue: 'chrome',
      group: 'security',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.cert_mode === 'dns',
    },
  ],
  socks: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
  ],
  naive: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'security',
      type: 'select',
      label: 'security',
      options: SECURITY.naive,
      defaultValue: 'none',
      group: 'security',
    },
    {
      name: 'sni',
      type: 'input',
      label: 'security_sni',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'allow_insecure',
      type: 'switch',
      label: 'security_allow_insecure',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'fingerprint',
      type: 'select',
      label: 'security_fingerprint',
      options: FINGERPRINTS,
      defaultValue: 'chrome',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
      condition: (p) => p.security === 'tls',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
  ],
  http: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'security',
      type: 'select',
      label: 'security',
      options: SECURITY.http,
      defaultValue: 'none',
      group: 'security',
    },
    {
      name: 'sni',
      type: 'input',
      label: 'security_sni',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'allow_insecure',
      type: 'switch',
      label: 'security_allow_insecure',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'fingerprint',
      type: 'select',
      label: 'security_fingerprint',
      options: FINGERPRINTS,
      defaultValue: 'chrome',
      group: 'security',
      condition: (p) => p.security !== 'none',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
      condition: (p) => p.security === 'tls',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.security === 'tls' && p.cert_mode === 'dns',
    },
  ],
  mieru: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'multiplex',
      type: 'select',
      label: 'multiplex',
      options: multiplexLevels,
      defaultValue: 'off',
      group: 'basic',
    },
    {
      name: 'transport',
      type: 'select',
      label: 'transport',
      options: TRANSPORTS.mieru,
      defaultValue: 'tcp',
      group: 'transport',
    },
  ],
  anytls: [
    {
      name: 'ratio',
      type: 'number',
      label: 'traffic_ratio',
      min: 0,
      step: 0.01,
      defaultValue: 1,
      group: 'basic',
    },
    {
      name: 'port',
      type: 'number',
      label: 'port',
      min: 1,
      max: 65535,
      placeholder: '1-65535',
      group: 'basic',
    },
    {
      name: 'padding_scheme',
      type: 'textarea',
      label: 'padding_scheme',
      placeholder: (t: (key: string) => string) => t('padding_scheme_placeholder'),
      group: 'basic',
    },
    { name: 'sni', type: 'input', label: 'security_sni', group: 'security' },
    { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security' },
    {
      name: 'fingerprint',
      type: 'select',
      label: 'security_fingerprint',
      options: FINGERPRINTS,
      defaultValue: 'chrome',
      group: 'security',
    },
    {
      name: 'cert_mode',
      type: 'select',
      label: 'cert_mode',
      options: CERT_MODES,
      defaultValue: 'none',
      group: 'security',
    },
    {
      name: 'cert_dns_provider',
      type: 'input',
      label: 'cert_dns_provider',
      placeholder: 'e.g. cloudflare, aliyun',
      group: 'security',
      condition: (p) => p.cert_mode === 'dns',
    },
    {
      name: 'cert_dns_env',
      type: 'textarea',
      label: 'cert_dns_env',
      placeholder:
        'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret',
      group: 'security',
      condition: (p) => p.cert_mode === 'dns',
    },
  ],
};
