package config

import (
	"fmt"
	"log"
	"os"
	"strconv"
)

type GatewayConfig struct {
	Url              string
	ApiKey           string
	BoardId          string
	BoardUrl         string
	BoardDescription string
}

type AppConfig struct {
	Env                  string
	Port                 int
	IsDbSeeded           bool
	IsRateLimiterEnabled bool
	ThreadsMaxCount      int
	ThreadBumpLimit      int
	IsCaptchaActive      bool
	Gateway              GatewayConfig
}

type DbConfig struct {
	Url string
}

func getValueOrDefaultBoolean(value string, defaultValue bool) bool {
	if value == "" {
		return defaultValue
	}
	return value == "true"
}

func getValueOrDefaultInt(value string, defaultValue int) int {
	if value == "" {
		return defaultValue
	}
	intValue, err := strconv.Atoi(value)
	if err != nil {
		log.Panicln(fmt.Sprintf("Could not parse %s to int", value))
	}
	return intValue
}

func getValueOrDefaultString(value string, defaultValue string) string {
	if value == "" {
		return defaultValue
	}
	return value
}

func getGatewayConfig() GatewayConfig {
	url := os.Getenv("GATEWAY_URL")
	apiKey := os.Getenv("GATEWAY_API_KEY")
	boardId := os.Getenv("GATEWAY_BOARD_ID")
	description := os.Getenv("GATEWAY_BOARD_DESCRIPTION")
	boardUrl := os.Getenv("GATEWAY_BOARD_URL")

	return GatewayConfig{
		Url:              url,
		ApiKey:           apiKey,
		BoardId:          boardId,
		BoardUrl:         boardUrl,
		BoardDescription: description,
	}
}

func getAppConfig() AppConfig {
	env := getValueOrDefaultString(os.Getenv("ENV"), "release")
	port := getValueOrDefaultInt(os.Getenv("PORT"), 3000)
	isDbSeeded := getValueOrDefaultBoolean(os.Getenv("IS_DB_SEEDED"), false)
	isRateLimiterEnabled := getValueOrDefaultBoolean(os.Getenv("IS_RATE_LIMITER_ENABLED"), true)
	threadsMaxCount := getValueOrDefaultInt(os.Getenv("THREADS_MAX_COUNT"), 50)
	threadBumpLimit := getValueOrDefaultInt(os.Getenv("THREAD_BUMP_LIMIT"), 500)
	isCaptchaActive := getValueOrDefaultBoolean(os.Getenv("IS_CAPTCHA_ACTIVE"), true)
	gateway := getGatewayConfig()

	return AppConfig{
		Env:                  env,
		Port:                 port,
		IsDbSeeded:           isDbSeeded,
		IsRateLimiterEnabled: isRateLimiterEnabled,
		ThreadsMaxCount:      threadsMaxCount,
		ThreadBumpLimit:      threadBumpLimit,
		IsCaptchaActive:      isCaptchaActive,
		Gateway:              gateway,
	}
}

func getDbConfig() DbConfig {
	url := getValueOrDefaultString(os.Getenv("POSTGRES_URL"), "postgresql://localhost/micrach")

	return DbConfig{
		Url: url,
	}
}

var App AppConfig
var Db DbConfig

func Init() {
	App = getAppConfig()
	Db = getDbConfig()
}