package sitemapgen

import (
	"fmt"
	"os"
	"strconv"
	"strings"
)

const (
	DefaultURLsPerFile = 50_000
	DefaultBatchSize   = 5_000
	DefaultWorkers     = 1
)

// Config parâmetros do gerador de sitemaps de empresas.
type Config struct {
	SiteURL      string
	OutputDir    string
	StatePath    string
	Source       string // mysql | api
	DBDSN        string
	DBQuery      string
	Workers      int
	BatchSize    int
	URLsPerFile  int
	APIBase      string
	APIKey       string
	Reset        bool
	Limit        int
}

func LoadConfigFromEnv() (Config, error) {
	cfg := Config{
		SiteURL:     strings.TrimRight(envOr("SITE_URL", "https://leadb2b.org"), "/"),
		OutputDir:   envOr("SITEMAP_OUTPUT_DIR", "data/sitemaps"),
		StatePath:   envOr("SITEMAP_STATE_FILE", "data/sitemaps/state.json"),
		Source:      strings.ToLower(envOr("SITEMAP_SOURCE", "api")),
		DBDSN:       strings.TrimSpace(os.Getenv("SITEMAP_DB_DSN")),
		DBQuery:     strings.TrimSpace(os.Getenv("SITEMAP_DB_QUERY")),
		Workers:     envIntOr("SITEMAP_WORKERS", DefaultWorkers),
		BatchSize:   envIntOr("SITEMAP_BATCH_SIZE", DefaultBatchSize),
		URLsPerFile: envIntOr("SITEMAP_URLS_PER_FILE", DefaultURLsPerFile),
		APIBase:     strings.TrimRight(envOr("GLOBALAPI_BASE", "https://leads.globals.tech"), "/"),
		APIKey:      strings.TrimSpace(os.Getenv("GLOBALAPI_KEY")),
	}
	if cfg.Source != "mysql" && cfg.Source != "api" {
		return cfg, fmt.Errorf("SITEMAP_SOURCE deve ser mysql ou api")
	}
	if cfg.Source == "mysql" && cfg.DBDSN == "" {
		return cfg, fmt.Errorf("SITEMAP_DB_DSN é obrigatório com SITEMAP_SOURCE=mysql")
	}
	if cfg.Source == "api" {
		if cfg.APIKey == "" {
			return cfg, fmt.Errorf("GLOBALAPI_KEY é obrigatório com SITEMAP_SOURCE=api")
		}
	}
	if cfg.Workers < 1 {
		cfg.Workers = 1
	}
	if cfg.BatchSize < 100 {
		cfg.BatchSize = 100
	}
	if cfg.URLsPerFile < 1 || cfg.URLsPerFile > 50_000 {
		cfg.URLsPerFile = DefaultURLsPerFile
	}
	return cfg, nil
}

func envOr(key, fallback string) string {
	if v := os.Getenv(key); v != "" {
		return strings.TrimSpace(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
}
