package config

import (
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Config struct {
	Port          string
	GlobalAPIBase string
	GlobalAPIKey  string
	SiteURL       string
	RateLimit     int
	AppDBDSN      string
	SessionSecret string
	AdminEmail    string
}

func Load() (Config, error) {
	loadEnvFiles()

	cfg := Config{
		Port:          envOr("PORT", "8080"),
		GlobalAPIBase: strings.TrimRight(envOr("GLOBALAPI_BASE", "https://leads.globals.tech"), "/"),
		GlobalAPIKey:  os.Getenv("GLOBALAPI_KEY"),
		SiteURL:       strings.TrimRight(envOr("SITE_URL", "http://localhost:8080"), "/"),
		RateLimit:     envIntOr("RATE_LIMIT_PER_MIN", 120),
		AppDBDSN:      resolveAppDBDSN(),
		SessionSecret: envOr("SESSION_SECRET", "change-me-in-production"),
		AdminEmail:    os.Getenv("ADMIN_EMAIL"),
	}
	if cfg.GlobalAPIKey == "" {
		return cfg, fmt.Errorf("GLOBALAPI_KEY is required")
	}
	return cfg, nil
}

func resolveAppDBDSN() string {
	if dsn := os.Getenv("APP_DB_DSN"); dsn != "" {
		return dsn
	}
	host := envOr("APP_DB_HOST", envOr("STATS_DB_HOST", ""))
	user := envOr("APP_DB_USER", envOr("STATS_DB_USER", ""))
	pass := envOr("APP_DB_PASS", envOr("STATS_DB_PASS", ""))
	port := envOr("APP_DB_PORT", envOr("STATS_DB_PORT", "3306"))
	name := envOr("APP_DB_NAME", "leadb2b_app")
	if host == "" || user == "" {
		return ""
	}
	return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true&charset=utf8mb4", user, pass, host, port, name)
}

func envOr(key, fallback string) string {
	if v := os.Getenv(key); v != "" {
		return v
	}
	return fallback
}

func envIntOr(key string, fallback int) int {
	v := os.Getenv(key)
	if v == "" {
		return fallback
	}
	n, err := strconv.Atoi(v)
	if err != nil || n <= 0 {
		return fallback
	}
	return n
}
