// Package config holds the resolved dev-time database DSNs derived after the
// TiDB provider has provisioned an instance.
package config

import (
	"log/slog"
	"os"
	"strings"

	"github.com/tidbcloud/AgentTeam/dev/internal/env"
)

// Config holds all resolved DSNs used by the dev stack.
type Config struct {
	CoreStorageDSN      string
	MeshXDatabaseDSN    string
	MeshXAGSDatabaseDSN string
}

// Build reads the current AGENTTEAM_DATABASE_DSN / MESHX_DATABASE_DSN /
// MESHX_AGS_DATABASE_DSN env vars.
func Build() *Config {
	return &Config{
		CoreStorageDSN:      os.Getenv("AGENTTEAM_DATABASE_DSN"),
		MeshXDatabaseDSN:    os.Getenv("MESHX_DATABASE_DSN"),
		MeshXAGSDatabaseDSN: os.Getenv("MESHX_AGS_DATABASE_DSN"),
	}
}

// ApplyZeroDSNs overrides all DSNs to point at the provisioned Zero instance
// and syncs the env vars so child processes inherit the same values.
func (c *Config) ApplyZeroDSNs(baseDSN string, meshXEnabled bool) {
	c.CoreStorageDSN = env.ReplaceDSNDatabase(baseDSN, "agentteam_core")
	if meshXEnabled {
		c.MeshXDatabaseDSN = env.ReplaceDSNDatabase(baseDSN, "agentteam_meshx")
		c.MeshXAGSDatabaseDSN = env.ReplaceDSNDatabase(baseDSN, "agentteam_ags")
	}
	os.Setenv("AGENTTEAM_DATABASE_DSN", c.CoreStorageDSN)
	if meshXEnabled {
		os.Setenv("MESHX_DATABASE_DSN", c.MeshXDatabaseDSN)
		os.Setenv("MESHX_AGS_DATABASE_DSN", c.MeshXAGSDatabaseDSN)
	}
	slog.Info("resolved TiDB DSNs", "core_database", env.ExtractDSNDatabase(c.CoreStorageDSN))
}

// IsLocalTiDB reports whether the AGS DSN targets a local TiDB instance.
func (c *Config) IsLocalTiDB() bool {
	if c == nil || c.MeshXAGSDatabaseDSN == "" {
		return false
	}
	port := env.ExtractDSNPort(c.MeshXAGSDatabaseDSN)
	return port != "" && env.IsLocalDSN(c.MeshXAGSDatabaseDSN, port)
}

// MeshXEnabledFromEnv returns the active AGENTTEAM_MESHX_ENABLED setting.
func MeshXEnabledFromEnv() bool {
	v := strings.ToLower(strings.TrimSpace(os.Getenv("AGENTTEAM_MESHX_ENABLED")))
	return v == "true" || v == "1" || v == "yes"
}
