// Copyright (c) [2022] [巴拉迪维 BaratSemet]
// [ohUrlShortener] is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// 				 http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.

package utils

import (
	"strings"

	"gopkg.in/ini.v1"
)

const Version = "2.0"

var (
	DatabaseConfig     DatabaseConfigInfo
	AppConfig          AppConfigInfo
	RedisConfig        RedisConfigInfo
	RedisClusterConfig RedisClusterConfigInfo
	CaptchaConfig      CaptchaConfigInfo
)

type CaptchaConfigInfo struct {
	Store string
}

// AppConfigInfo 应用配置
type AppConfigInfo struct {
	Port      int
	AdminPort int
	UrlPrefix string
	Debug     bool
}

// RedisClusterConfigInfo redis配置
type RedisClusterConfigInfo struct {
	Hosts    []string
	User     string
	Password string
	PoolSize int
}

// RedisConfigInfo redis配置
type RedisConfigInfo struct {
	Host     string
	User     string
	Password string
	Database int
	PoolSize int
}

// DatabaseConfigInfo 数据库配置
type DatabaseConfigInfo struct {
	Host         string
	Port         int
	User         string
	Password     string
	DbName       string
	MaxOpenConns int
	MaxIdleConn  int
}

// InitConfig 初始化配置
func InitConfig(file string) (*ini.File, error) {
	cfg, err := ini.Load(file)
	if err != nil {
		return nil, nil
	}

	section := cfg.Section("postgres")
	DatabaseConfig.Host = section.Key("host").String()
	DatabaseConfig.Port = section.Key("port").MustInt()
	DatabaseConfig.MaxOpenConns = section.Key("max_open_conn").MustInt()
	DatabaseConfig.MaxIdleConn = section.Key("max_idle_conn").MustInt()
	DatabaseConfig.User = section.Key("user").String()
	DatabaseConfig.Password = section.Key("password").String()
	DatabaseConfig.DbName = section.Key("database").String()

	appSection := cfg.Section("app")
	AppConfig.Debug = appSection.Key("debug").MustBool()
	AppConfig.Port = appSection.Key("port").MustInt()
	AppConfig.AdminPort = appSection.Key("admin_port").MustInt()
	AppConfig.UrlPrefix = appSection.Key("url_prefix").String()

	redisSection := cfg.Section("redis")
	RedisConfig.Host = redisSection.Key("host").String()
	RedisConfig.User = redisSection.Key("username").String()
	RedisConfig.Password = redisSection.Key("password").String()
	RedisConfig.Database = redisSection.Key("database").MustInt()
	RedisConfig.PoolSize = redisSection.Key("pool_size").MustInt()

	redisClusterSection := cfg.Section("redis-cluster")
	hosts := redisClusterSection.Key("hosts").String()
	if !EmptyString(hosts) {
		hostsArr := strings.Split(hosts, ",")
		RedisClusterConfig.Hosts = hostsArr
	}
	RedisClusterConfig.User = redisClusterSection.Key("username").String()
	RedisClusterConfig.Password = redisClusterSection.Key("password").String()
	RedisClusterConfig.PoolSize = redisClusterSection.Key("pool_size").MustInt()

	captchaSection := cfg.Section("captcha")
	CaptchaConfig.Store = captchaSection.Key("store").String()

	return cfg, err
}
