package config

import (
	"log"
	"os"
	"strconv"

	"github.com/joho/godotenv"
)

// Config 애플리케이션 전역 설정
type Config struct {
	Env               string
	ServerPort        string
	AppKey            string
	AppSecret         string
	BaseURL           string
	DartAPIKey        string
	NaverClientID     string
	NaverClientSecret string
	GroqAPIKey        string // Groq API 키
	GroqModel         string // Groq 모델명
	CacheTTLSeconds   int
	WSMaxClients      int
	WSPollIntervalMS  int
	AdminID           string // 관리자 ID
	AdminPassword     string // 관리자 비밀번호
	CORSOrigin        string // CORS 허용 오리진 (예: http://localhost:5173)
	DatabaseURL       string // PostgreSQL 연결 URL
}

var App *Config

// Load .env 파일을 읽어 설정을 초기화
func Load() {
	// 개발 환경에서만 .env 파일 로딩 (.env 없어도 오류 무시)
	if err := godotenv.Load(); err != nil {
		log.Println("경고: .env 파일이 없습니다. 환경변수를 직접 설정해야 합니다.")
	}

	App = &Config{
		Env:               getEnv("APP_ENV", "development"),
		ServerPort:        getEnv("SERVER_PORT", "8080"),
		AppKey:            getEnv("KIWOOM_APP_KEY", ""),
		AppSecret:         getEnv("KIWOOM_APP_SECRET", ""),
		BaseURL:           getEnv("KIWOOM_BASE_URL", "https://openapi.koreainvestment.com:9443"),
		DartAPIKey:        getEnv("DART_API_KEY", ""),
		NaverClientID:     getEnv("NAVER_CLIENT_ID", ""),
		NaverClientSecret: getEnv("NAVER_CLIENT_SECRET", ""),
		GroqAPIKey:        getEnv("GROQ_API_KEY", ""),
		GroqModel:         getEnv("GROQ_MODEL", "llama-3.3-70b-versatile"),
		CacheTTLSeconds:   getEnvInt("CACHE_TTL_SECONDS", 1),
		WSMaxClients:      getEnvInt("WS_MAX_CLIENTS", 100),
		WSPollIntervalMS:  getEnvInt("WS_POLL_INTERVAL_MS", 1000),
		AdminID:           getEnv("ADMIN_ID", "admin"),
		AdminPassword:     getEnv("ADMIN_PASSWORD", ""),
		CORSOrigin:        getEnv("CORS_ORIGIN", ""),
		DatabaseURL:       getEnv("DATABASE_URL", ""),
	}
}

// IsDevelopment 개발 환경 여부 반환
func (c *Config) IsDevelopment() bool {
	return c.Env == "development"
}

func getEnv(key, defaultVal string) string {
	if val := os.Getenv(key); val != "" {
		return val
	}
	return defaultVal
}

func getEnvInt(key string, defaultVal int) int {
	if val := os.Getenv(key); val != "" {
		if n, err := strconv.Atoi(val); err == nil {
			return n
		}
	}
	return defaultVal
}
