package config

import "time"

// HTTPGatewayConfig contains HTTP reverse proxy gateway configuration
type HTTPGatewayConfig struct {
	Enabled    bool                   `yaml:"enabled"`     // Enable HTTP gateway
	ListenAddr string                 `yaml:"listen_addr"` // Address to listen on (e.g., ":8080")
	NodeName   string                 `yaml:"node_name"`   // Node name for routing
	Routes     map[string]RouteConfig `yaml:"routes"`      // Service routes
	HTTPS      HTTPSConfig            `yaml:"https"`       // HTTPS/TLS configuration
	SNI        SNIConfig              `yaml:"sni"`         // SNI-based TCP routing configuration

	// Full gateway configuration (for API, auth, pubsub)
	ClientNamespace   string        `yaml:"client_namespace"`     // Namespace for network client
	RQLiteDSN         string        `yaml:"rqlite_dsn"`           // RQLite database DSN
	OlricServers      []string      `yaml:"olric_servers"`        // List of Olric server addresses
	OlricTimeout      time.Duration `yaml:"olric_timeout"`        // Timeout for Olric operations
	IPFSClusterAPIURL string        `yaml:"ipfs_cluster_api_url"` // IPFS Cluster API URL
	IPFSAPIURL        string        `yaml:"ipfs_api_url"`         // IPFS API URL
	IPFSTimeout       time.Duration `yaml:"ipfs_timeout"`         // Timeout for IPFS operations
	BaseDomain        string        `yaml:"base_domain"`          // Base domain for deployments (e.g., "dbrs.space"). Defaults to "dbrs.space"
}

// HTTPSConfig contains HTTPS/TLS configuration for the gateway
type HTTPSConfig struct {
	Enabled       bool   `yaml:"enabled"`         // Enable HTTPS (port 443)
	Domain        string `yaml:"domain"`          // Primary domain (e.g., node-123.orama.network)
	AutoCert      bool   `yaml:"auto_cert"`       // Use Let's Encrypt for automatic certificate
	UseSelfSigned bool   `yaml:"use_self_signed"` // Use self-signed certificates (pre-generated)
	CertFile      string `yaml:"cert_file"`       // Path to certificate file (if not using auto_cert)
	KeyFile       string `yaml:"key_file"`        // Path to key file (if not using auto_cert)
	CacheDir      string `yaml:"cache_dir"`       // Directory for Let's Encrypt certificate cache
	HTTPPort      int    `yaml:"http_port"`       // HTTP port for ACME challenge (default: 80)
	HTTPSPort     int    `yaml:"https_port"`      // HTTPS port (default: 443)
	Email         string `yaml:"email"`           // Email for Let's Encrypt account
}

// SNIConfig contains SNI-based TCP routing configuration for port 7001
type SNIConfig struct {
	Enabled    bool              `yaml:"enabled"`     // Enable SNI-based TCP routing
	ListenAddr string            `yaml:"listen_addr"` // Address to listen on (e.g., ":7001")
	Routes     map[string]string `yaml:"routes"`      // SNI hostname -> backend address mapping
	CertFile   string            `yaml:"cert_file"`   // Path to certificate file
	KeyFile    string            `yaml:"key_file"`    // Path to key file
}

// RouteConfig defines a single reverse proxy route
type RouteConfig struct {
	PathPrefix string        `yaml:"path_prefix"` // URL path prefix (e.g., "/rqlite/http")
	BackendURL string        `yaml:"backend_url"` // Backend service URL
	Timeout    time.Duration `yaml:"timeout"`     // Request timeout
	WebSocket  bool          `yaml:"websocket"`   // Support WebSocket upgrades
}

// ClientConfig represents configuration for network clients
type ClientConfig struct {
	AppName        string        `yaml:"app_name"`
	DatabaseName   string        `yaml:"database_name"`
	BootstrapPeers []string      `yaml:"bootstrap_peers"`
	ConnectTimeout time.Duration `yaml:"connect_timeout"`
	RetryAttempts  int           `yaml:"retry_attempts"`
}
