// SPDX-License-Identifier: 0BSD
// Copyright (c) 2024-2026 Sudo-Ivan / Quad4.io
package common

import (
	"fmt"
)

const (
	DEFAULT_SHARED_INSTANCE_PORT  = 37428
	DEFAULT_INSTANCE_CONTROL_PORT = 37429
	DEFAULT_LOG_LEVEL             = 20
)

// ConfigProvider interface for accessing configuration
type ConfigProvider interface {
	GetConfigPath() string
	GetLogLevel() int
	GetInterfaces() map[string]InterfaceConfig
}

// InterfaceConfig represents interface configuration
type InterfaceConfig struct {
	Name           string
	Type           string
	Enabled        bool
	Address        string
	Port           int
	TargetHost     string
	TargetPort     int
	TargetAddress  string
	Interface      string
	KISSFraming    bool
	I2PTunneled    bool
	PreferIPv6     bool
	MaxReconnTries int
	Bitrate        int64
	MTU            int
	GroupID        string
	DiscoveryScope string
	DiscoveryPort  int
	DataPort       int
	Frequency      uint32
	Bandwidth      uint32
	SF             uint8
	CR             uint8
	TXPower        uint8
}

// ReticulumConfig represents the main configuration structure
type ReticulumConfig struct {
	ConfigPath          string
	EnableTransport     bool
	ShareInstance       bool
	SharedInstancePort  int
	InstanceControlPort int
	PanicOnInterfaceErr bool
	LogLevel            int
	Interfaces          map[string]*InterfaceConfig
	AppName             string
	AppAspect           string
}

// NewReticulumConfig creates a new ReticulumConfig with default values
func NewReticulumConfig() *ReticulumConfig {
	return &ReticulumConfig{
		EnableTransport:     true,
		ShareInstance:       false,
		SharedInstancePort:  DEFAULT_SHARED_INSTANCE_PORT,
		InstanceControlPort: DEFAULT_INSTANCE_CONTROL_PORT,
		PanicOnInterfaceErr: false,
		LogLevel:            DEFAULT_LOG_LEVEL,
		Interfaces:          make(map[string]*InterfaceConfig),
	}
}

// Validate checks if the configuration is valid
func (c *ReticulumConfig) Validate() error {
	if c.SharedInstancePort < 1 || c.SharedInstancePort > 65535 {
		return fmt.Errorf("invalid shared instance port: %d", c.SharedInstancePort)
	}
	if c.InstanceControlPort < 1 || c.InstanceControlPort > 65535 {
		return fmt.Errorf("invalid instance control port: %d", c.InstanceControlPort)
	}
	return nil
}

func DefaultConfig() *ReticulumConfig {
	return &ReticulumConfig{
		EnableTransport:     true,
		ShareInstance:       false,
		SharedInstancePort:  DEFAULT_SHARED_INSTANCE_PORT,
		InstanceControlPort: DEFAULT_INSTANCE_CONTROL_PORT,
		PanicOnInterfaceErr: false,
		LogLevel:            DEFAULT_LOG_LEVEL,
		Interfaces:          make(map[string]*InterfaceConfig),
		AppName:             "Go Client",
		AppAspect:           "node",
	}
}
