package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"math/rand"
	"os"
	"path/filepath"
)

const DIR = "/var/data"

func Exists(name string) (bool, error) {
	_, err := os.Stat(name)
	if os.IsNotExist(err) {
		return false, nil
	}
	return err != nil, err
}

func CreateDirectory(dirs string) error {
	if _, err := os.Stat(dirs); os.IsNotExist(err) {
		err := os.MkdirAll(dirs, 0664)
		if err != nil {
			return err
		}
	}
	return nil
}

func CreateFileOrOpenIfExist(name string) (*os.File, error) {
	err := CreateDirectory(filepath.Dir(name))
	if err != nil {
		return nil, err
	}
	exists, err := Exists(name)
	if err != nil {
		return nil, err
	}
	if exists {
		return os.OpenFile(name, os.O_WRONLY|os.O_CREATE, 0664)
	}
	return os.Create(name)
}

func CreateFileAndWriteData(filename string) error {
	file, err := CreateFileOrOpenIfExist(filename)
	if err != nil {
		return err
	}
	lines := rand.Intn(1000) + 100

	for i := 0; i < lines; i++ {
		randomValueForLine := rand.Intn(1_000_000)
		_, err = fmt.Fprintf(file, "%d\r\n", randomValueForLine)
		if err != nil {
			return err
		}
	}

	err = file.Close()
	if err != nil {
		return err
	}

	return nil
}

func GetMD5Hash(text string) string {
	hash := md5.Sum([]byte(text))
	return hex.EncodeToString(hash[:])
}

func main() {
	for i := 0; i < 10; i++ {
		filename := fmt.Sprintf("%s/%s.txt", DIR, GetMD5Hash(fmt.Sprintf("%d", i)))
		err := CreateFileAndWriteData(filename)
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Printf("Created file %s\n", filename)
		}
	}

	err := CreateFileAndWriteData(DIR + "/data.txt")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("Created file %s\n", DIR+"/data.txt")
	}
}