package main

import (
	"bufio"
	"io"
	"io/ioutil"
	"os"
	"regexp"
	"strings"
)

type Environment map[string]string

// ReadDir reads a specified directory and returns map of env variables.
// Variables represented as files where filename is name of variable, file first line is a value.
func ReadDir(dir string) (Environment, error) {
	e := make(map[string]string)
	files, err := ioutil.ReadDir(dir)
	if err != nil {
		return e, err
	}
	for _, file := range files {
		if !file.IsDir() && file.Mode().IsRegular() {
			val, err := ReadFile(dir + "/" + file.Name())
			if err != nil {
				return nil, err
			}
			// TODO: Не правильно!
			key := file.Name()
			key = strings.ReplaceAll(key, `=`, ``)
			key = strings.ReplaceAll(key, `;`, ``)
			e[key] = ExtractEnv(val)
		}
	}

	return e, nil
}

func ReadFile(filePath string) (string, error) {
	f, err := os.Open(filePath)
	defer func() {
		if err := f.Close(); err != nil {
			return
		}
	}()
	if err != nil {
		return "", err
	}
	reader := bufio.NewReader(f)
	b, _, err := reader.ReadLine()
	if err != nil && err != io.EOF {
		return "", err
	}

	return string(b), nil
}

func ExtractEnv(text string) string {
	text = strings.TrimSpace(text)
	r := regexp.MustCompile("\"+")
	text = r.ReplaceAllString(text, "")
	// Удаляем все после /000
	i := strings.IndexByte(text, 0)
	if i > 0 {
		text = text[:i]
	}

	return text
}