package ini_config

import (
	"bufio"
	"errors"
	"fmt"
	"io"
	"os"
	"strings"
)

// ParseFile
// @description: 从文件读取配置文件，并转化为map对象
// parameter:
//		@filePath:文件路径
// return:
//		@map[string]string: 配置信息
//		@error:错误信息
func ParseFile(filePath string) (map[string]string, error) {
	fn, err := os.Open(filePath)
	if err != nil {
		panic(err)
	}
	defer fn.Close()

	kvMap := make(map[string]string)
	rd := bufio.NewReader(fn)
	for {
		data, _, err := rd.ReadLine()
		if err != nil || io.EOF == err {
			break
		}

		line := strings.TrimSpace(string(data))
		if line == "" || line[0:1] == "#" {
			continue
		}

		var k string
		var v string
		k, v, err = Parse(line)
		if err != nil {
			return nil, err
		}

		kvMap[k] = v
	}

	return kvMap, nil
}

// Parse
// @description: 转换单行字符串为配置对象
// parameter:
//		@line:单行内容
// return:
//		@string:key
//		@string:value
//		@error:错误信息
func Parse(line string) (string, string, error) {
	ls := strings.SplitN(line, "=", 2)
	if len(ls) != 2 {
		return "", "", errors.New(fmt.Sprintf("配置%s中未找到=分隔符", line))
	}

	var key = strings.TrimSpace(ls[0])
	var value string

	i := strings.LastIndex(ls[1], "#")
	if i < 0 {
		value = strings.TrimSpace(ls[1])
	} else {
		s := ls[1][:i]
		value = strings.TrimSpace(s)
	}

	return key, value, nil
}

// ParseMultipleLines
// @description: 转换多行字符串为配置对象
// parameter:
//		@content:多行内容(通过\n换行)
// return:
//		@map[string]string:配置信息
//		@error:错误信息
func ParseMultipleLines(content string) (map[string]string, error) {
	lines := strings.Split(content, "\n")
	kvMap := make(map[string]string)
	for _, line := range lines {
		if line == "" || line[0:1] == "#" {
			continue
		}

		k, v, err := Parse(line)
		if err != nil {
			return nil, err
		}
		kvMap[k] = v
	}

	return kvMap, nil
}
