package config

import (
	"os"
	"strconv"
	"strings"
	"time"
)

const (
	DefaultPort          = ":8080"
	DefaultJWTSecret     = "local-poc-secret-change-me"
	DefaultResetInterval = 10 * time.Minute
	DefaultDatasetSize   = 546
)

var ApiKey = DefaultJWTSecret

type Config struct {
	Environment string
	API         APIConfig
	Auth        AuthConfig
	Dataset     DatasetConfig
}

type APIConfig struct {
	Name    string
	Port    string
	BaseURL string
}

type AuthConfig struct {
	JWTSecret string
}

type DatasetConfig struct {
	Size          int
	ResetInterval time.Duration
}

func LoadConfig() Config {
	return Config{
		Environment: envString("APP_ENV", "dev"),
		API: APIConfig{
			Name:    envString("APP_NAME", "abuse-registration-poc"),
			Port:    envString("PORT", DefaultPort),
			BaseURL: envString("BASE_URL", "http://localhost:8080"),
		},
		Auth: AuthConfig{
			JWTSecret: envString("JWT_SECRET", DefaultJWTSecret),
		},
		Dataset: DatasetConfig{
			Size:          envInt("DATASET_SIZE", DefaultDatasetSize),
			ResetInterval: envDuration("RESET_INTERVAL", DefaultResetInterval),
		},
	}
}

func SetAPIKey(value string) {
	if strings.TrimSpace(value) == "" {
		ApiKey = DefaultJWTSecret
		return
	}
	ApiKey = value
}

func envString(key, fallback string) string {
	value := strings.TrimSpace(os.Getenv(key))
	if value == "" {
		return fallback
	}
	return value
}

func envInt(key string, fallback int) int {
	value := strings.TrimSpace(os.Getenv(key))
	if value == "" {
		return fallback
	}
	parsed, err := strconv.Atoi(value)
	if err != nil || parsed < 1 {
		return fallback
	}
	return parsed
}

func envDuration(key string, fallback time.Duration) time.Duration {
	value := strings.TrimSpace(os.Getenv(key))
	if value == "" {
		return fallback
	}
	parsed, err := time.ParseDuration(value)
	if err != nil {
		return fallback
	}
	return parsed
}
